乾貨 | JavaScript指令碼注入,完成Selenium 無法做到的那些事
本文節選自霍格沃茲測試學院內部教材
當 webdriver 遇到無法完成的操作時,可以使用 JavaScript 來完成,webdriver 提供了 execute_script()
方法來呼叫 js 程式碼。
執行 js 有兩種場景:
-
在頁面上直接執行 js
-
在某個已經定位的元素上執行 js
簡介
JavaScript 是一種指令碼語言,有的場景需要使用 js 指令碼注入輔助我們完成 Selenium 無法做到的事情。
執行js
Selenium 可以通過 execute_script()
來執行 JavaScript 指令碼。
-
driver.execute_script:同步執行 JavaScript 在當前的視窗框架下
-
js 指令碼可以在瀏覽器的開發者工具 -> Console 中進行除錯
js的返回結果
-
獲取元素控制元件中的屬性值
-
與 Selenium 結合,在程式碼中返回 js 結果
# 獲取網頁效能的響應時間,js指令碼中使用return代表返回獲取的結果js = "return JSON.stringify(performance.timing);"driver.execute_script(js)
arguments傳參
執行 JavaScript 也可以通過傳參的方式傳入元素資訊。
element = driver.find_element(by, locator)#arguments[0]代表所傳值element的第一個引數#click()代表js中的點選動作driver.execute_script("arguments[0].click();",element)
還可以通過上面的方法點選被遮擋的元素。
例如:某個元素在實際的操作過程中被其他的元素遮擋,就可以使用 js 點選的方式。
自動化過程中的報錯如下:
Other element would receive the click: <label class="custom-control-label" for="user_remember_me">...</label>
如果出現上面的錯誤,可以使用 js 的方式進行點選。
實戰案例
以企業微信為例,使用 js 點選新增圖片。
程式碼:
#匯入依賴from selenium import webdriverfrom 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") #執行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()
執行 JavaScript 指令碼就先講到這裡啦,大家還想看什麼內容的文章也可以留言告訴我們哦!
** 推薦學習**
內容全面升級,4 個月 20+ 專案實戰強化訓練,資深測試架構師、開源專案作者親授 BAT 大廠前沿最佳實踐,
帶你一站式掌握測試開發必備核心技能( 對標阿里P6+,年薪50W+ )! 直推 BAT 名企測試經理,普遍漲薪 50%+!
⬇️ 點選“閱讀原文”,提升測試核心競爭力!
閱讀原文