干貨 | JavaScript腳本注入,完成Selenium 無(wú)法做到的那些事
當(dāng) webdriver 遇到無(wú)法完成的操作時(shí),可以使用 JavaScript 來(lái)完成,webdriver 提供了 execute_script() 方法來(lái)調(diào)用 js 代碼。 執(zhí)行 js 有兩種場(chǎng)景:
在頁(yè)面上直接執(zhí)行 js
在某個(gè)已經(jīng)定位的元素上執(zhí)行 js
JavaScript 是一種腳本語(yǔ)言,有的場(chǎng)景需要使用 js 腳本注入輔助我們完成 Selenium 無(wú)法做到的事情。
Selenium 可以通過(guò) execute_script() 來(lái)執(zhí)行 JavaScript 腳本。
driver.execute_script:同步執(zhí)行 JavaScript 在當(dāng)前的窗口框架下
js 腳本可以在瀏覽器的開(kāi)發(fā)者工具 → Console 中進(jìn)行調(diào)試
獲取元素控件中的屬性值

與 Selenium 結(jié)合,在代碼中返回 js 結(jié)果
# 獲取網(wǎng)頁(yè)性能的響應(yīng)時(shí)間,js腳本中使用return代表返回獲取的結(jié)果
js = "return JSON.stringify(performance.timing);"
driver.execute_script(js)
執(zhí)行 JavaScript 也可以通過(guò)傳參的方式傳入元素信息。
element = driver.find_element(by, locator)?
#arguments[0]代表所傳值element的第一個(gè)參數(shù)?
#click()代表js中的點(diǎn)擊動(dòng)作
driver.execute_script("arguments[0].click();",element)
還可以通過(guò)上面的方法點(diǎn)擊被遮擋的元素。 例如:某個(gè)元素在實(shí)際的操作過(guò)程中被其他的元素遮擋,就可以使用 js 點(diǎn)擊的方式。 自動(dòng)化過(guò)程中的報(bào)錯(cuò)如下:
Other element would receive the click:?
<label class="custom-control-label" for="user_remember_me">...</label>
如果出現(xiàn)上面的錯(cuò)誤,可以使用 js 的方式進(jìn)行點(diǎn)擊。
以企業(yè)微信為例,使用 js 點(diǎn)擊添加圖片。

代碼:
#導(dǎo)入依賴?
from selenium import webdriver
from selenium.webdriver.common.by
import By
class TestWework:?
? ?def setup(self): ? ?
?? ?self.driver = webdriver.Chrome() ? ? ?
?#隱式等待
? ? ? ?self.driver.implicitly_wait(2) ?
?def test_upload(self): ??
? ? ?#元素定位 ? ??
? ?element_add = self.driver.find_element\ ? ?
?? ? ? ?(By.CSS_SELECTOR, ".js_upload_file_selector") ? ?
?? ?#執(zhí)行js代碼 ??
? ? ?self.driver.execute_script\ ?
?? ? ? ? ?("arguments[0].click();", element_add) ? ? ? ?self.driver.find_element_by_id('js_upload_input').send_keys('D:\project\demo1\demo.png') ??
? ? ?assert len(self.driver.find_elements(By.CSS_SELECTOR,'.material_pic_list_item')) == 1 ??
?def teardown(self): ??
? ? ?self.driver.quit()
執(zhí)行 JavaScript 腳本就先講到這里啦,大家還想看什么內(nèi)容的文章也可以留言告訴我們哦!