
Python通常結合selenium子產品來完成一些web的自動化測試以及RPA(Robotic Process Automation)工作
事實上,Selenium還可以支援插入js語句、執行js語句、傳回js語句的執行結果到python程式中。這對于那些已經習慣了Javascript文法的程式員們,簡直是一大神器
我們簡單看看在實際應用場景selenium如何應變各種難題執行JS語句
01
selenium原生的方法對頁面的一個input元素執行輸入時,通常需要用到selenium中的send_keys以及clear方法,
通常的寫法:
dr.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[1]/input').clear()
dr.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[1]/input').send_keys(" user_name")
該方法大多數時候已經足夠好用,但是仔細分析,send_keys方法主要是模拟的使用者鍵盤操作,程式執行時必須要保證該元素始終擷取焦點,頁面執行過程中盡量不能動頁面,否則send_keys方法可能會失效。
而且我們每次send_keys之前需要對input元素已有的text進行清空,即初始化。筆者推薦使用JS注入selenium的方法來達到更好的效果,在selenium中寫JS語句往往是如下形式:
JS寫法
js="document.getElementsByClassName('form-control')[0].value='%s';"%(requestCode[i][0].value)
dr.execute_script(js)
該方法,相當于是直接調用頁面元素的value方法來進行指派,不用考慮變量初始化問題,它屬于網頁背景功能,類似于F12直接在console中執行代碼,不需要光标停留在該input元素上
02
想點檢視網頁的底部頁面時,發現由于網頁沒有最大化導緻元素隐藏定位失敗,這裡不用maximize_window(),我們用執行JS的方法來實作下。
首先我們來看一下這個頁面,也是你們需要學習的文檔:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scrollBy
我們打開發後如果不是全屏,底部的元素隻能通過前端頁面滑動進行檢視,
selenium正常操作
在selenium中我們可以使用maximize_window()或者set_window_size()自定義浏覽器大小
JS寫法
dr.execute_script('window.scrollBy(0,2000)')
實作邏輯
1.我們可以首先手動在頁面打開F12打開console輸入window.scrollBy(0.,20000) 執行看看是否能夠滑動到頁面底部如果可以正常滑動到頁面底部,
2.我們在在selenium中執行我們上方的JS寫法語句 就可以實作該頁面滑動底部然後接着定位其它元素等操作,這種場景使用與很多背景或者底部翻頁等被隐藏直接滑動下頁面底部 執行翻頁等功能操作
整體代碼
# -*-coding=utf-8-*-
import unittest
from selenium import webdriver
import os, time
dr = webdriver.Chrome()
dr.implicitly_wait(3)
url = 'https://developer.mozilla.org/zh-CN/docs/Web/API/Window/scrollBy'
#打開網頁#
dr.get(url)
#向右移動頁面#
dr.execute_script('window.scrollBy(0,20000)')
03
這裡針對于小編公司應用終端是植入在第三方系統上,例如我們公司有個H5應用就必須在企微授權擷取對應員工工号才能登入,那麼這種不能通過網頁端正常登入的移動端應用我們用selenium在網頁端如何進行登入操作呢
通路位址如下:https://sma.******.com.cn/view/index.html?state=from_qywx#/(由于是公司系統域名隐藏哈)正常在浏覽器通路直接提示如下頁面或者直接跳轉到無權限
正常浏覽器登入
正常想在網頁端登入需要執行如下操作,輸入位址,在local Storage進行輸入使用者token以及工号登入
那麼想在網頁端 通過selenium模拟登陸如何操作呢?我們來看看JS登入方法
實作邏輯
1.我們先可以使用selenium執行模拟使用者輸入防止通路跳入無權限頁面後,我們進行使用JS方法execute_script()植入token,将植入的token緩存在浏覽器中,我們此時再次請求登入位址,這時就會擷取上次植入的token正常登入到H5應用界面,直接繞過登入,
整體代碼
# -*-coding=utf-8-*-
import unittest
from selenium import webdriver
import os, time
class test_login(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.dr = webdriver.Chrome()
# 自定義浏覽器分辯率 針對響應式頁面,手機版等
# cls.dr.maximize_window() #全屏
cls.dr.set_window_size(600, 1000) # 分辨率展示為597*802
time.sleep(2)
ulr1 = 'https://sma.******.com.cn/view/index.html?state=from_qywx#/login'
# (u'通路百果秘書系統')
cls.dr.get(ulr1)
time.sleep(1)
# 使用js/execute_script方法植入片區經理 工号******004 進行緩存
cls.dr.execute_script('localStorage.setItem("token", ******004)')
time.sleep(1)
# 再次通路環境 進行登入
ulr2 = 'https://sma.*******.com.cn/view/index.html?state=from_qywx'
cls.dr.get(ulr2)
@classmethod
def tearDownClass(cls):
time.sleep(2)
cls.dr.quit()
def test_case_001(cls):
'''驗證是否登入成功'''
time.sleep(3)
text = cls.dr.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[1]/div[1]/div[1]/h1/span').text
cls.assertEqual(u'銷售', text)
if __name__ == '__main__':
unittest.main(verbosity=2)
selenium中執行JS場景簡單介紹如上三個場景,平時工作中的運用之處進行總結分享,一是加深記憶,二是希望對于你們有所幫助,