一、选取元素
执行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()