1. 程式人生 > 其它 >乾貨 | JavaScript指令碼注入,完成Selenium 無法做到的那些事

乾貨 | 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%+!

⬇️ 點選“閱讀原文”,提升測試核心競爭力!

閱讀原文