一、選取元素
執行JS腳本通常用於獲取或者選取特定元素,driver.execute_script()方法為我們提供了一個很好的解決方案。
例如,我們可以通過document.getElementsById()選取特定id的元素:
element = driver.execute_script("return document.getElementById('myId');")
同時,我們也可以使用其他常見的document對象的方法來選取元素,比如getElementsByClassName(), getElementsByTagName()等,通過driver.execute_script方法返回需要的元素,方便我們後續的操作。
二、操作DOM
使用driver.execute_script方法執行JS腳本可以幫助我們快速進行DOM操作。
例如,我們可以通過以下方式在按鈕點擊時提交表單:
element = driver.find_element_by_name('btnK')
driver.execute_script("arguments[0].click();", element)
另一個常見的操作是使用setAttribute()方法設置元素屬性,示例如下:
element = driver.find_element_by_id('myId')
driver.execute_script("arguments[0].setAttribute('value', 'new value')", element)
除此之外,我們也可以通過JS腳本動態更改CSS屬性,以此來動態改變元素的樣式。例如,我們可以通過以下方式更改文本的字體顏色和背景顏色:
driver.execute_script("document.body.style.color = 'red';")
driver.execute_script("document.body.style.backgroundColor = 'black';")
三、處理特殊情況
有時候,我們需要使用driver.execute_script方法來處理一些特殊情況。
例如,當我們使用Selenium訪問一些特定網站時,可能會遇到由於某些JS限制而無法正常執行操作的問題。這時,我們可以使用driver.execute_script方法來繞過這種限制。
另一種情況是,當我們訪問機器人檢測網站時,有可能會遇到機器人檢測程序屏蔽Selenium瀏覽器的情況。這時,使用driver.execute_script方法可以幫助我們繞過這種檢測。
四、處理AJAX和動態頁面
在Selenium中,當我們打開網頁時,存在的一種常見情況是在頁面完全載入前元素並不會全部出現。此時,使用普通的元素選取方法可能會出現異常。針對這種情況,我們可使用driver.execute_script方法,在頁面載入和執行完JS後,等待頁面內容完全載入後再進行後續操作。
此外,當頁面上有AJAX請求時,我們也可以使用driver.execute_script方法捕獲AJAX請求,以便在請求完成後再次訪問頁面。
五、其他用途
除了上述用途,driver.execute_script方法也可以用於其他方面。
例如,在為網站測試適應性時,我們可以使用driver.execute_script方法更改網頁的大小以檢查網頁是否可響應縮小或擴大的瀏覽器窗口。
另一個常見的用途是模擬用戶行為,例如輸入文本或滾動頁面等等。
代碼示例:
from selenium import webdriver
# 使用Chrome瀏覽器
driver = webdriver.Chrome()
# 在Chrome瀏覽器中打開網頁
driver.get("https://www.baidu.com/")
# 獲取搜索框元素並輸入「Selenium」
element = driver.find_element_by_css_selector("input[type='text']")
driver.execute_script("arguments[0].value = 'Selenium';", element)
# 在搜索框中按回車鍵
driver.execute_script("arguments[0].submit();", element)
# 等待搜索結果頁面載入完畢,然後獲取搜索結果的標題列表
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 先滾動到底部
titles = driver.execute_script("return [...document.querySelectorAll('.result .t > *')].map(x => x.innerText)")
# 輸出搜索結果的標題列表
for title in titles:
print(title)
# 關閉瀏覽器
driver.quit()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236032.html