selenium 的 execute_script 方法允许在浏览器上下文中执行 javascript 代码。这对于执行一些 webdriver 本身不提供的操作非常有用,比如直接操作 dom 元素、执行一些特定的 javascript 功能等。这个方法的一般语法是:
driver.execute_script(script, *args)
script是要执行的javascript代码。args是可选的参数,它们可以传递给javascript代码。
这个方法的返回值取决于执行的 javascript 代码。通常情况下,如果 javascript 代码返回一个值,那么 execute_script 方法也会返回这个值。
from selenium import webdriver
driver = webdriver.chrome()
driver.get("https://example.com")
# 使用execute_script方法执行javascript代码并传递参数
result = driver.execute_script("function add(a, b) { return a + b; }", 2, 3)
print(result) # 输出结果为 5
driver.quit()
在这个例子中,我们将javascript代码作为execute_script方法的第一个参数传递,并将要传递的参数(2和3)作为第二个参数传递。javascript代码将在浏览器上下文中执行,并且arguments对象将包含传递的参数(在这个例子中是2和3)。
可以将其功能大致分类如下:
-
1. **查找和操作元素**:
- 通过 id 查找元素
- 通过类名查找元素
- 通过标签名查找元素
- 通过 css 选择器查找元素
- 设置元素文本内容
- 设置元素值(适用于输入框等)
- 设置元素样式
- 点击元素
- 触发事件
- 模拟键盘按键
from selenium import webdriver
driver = webdriver.chrome()
# 示例:通过 id 查找元素并设置文本内容
driver.get("https://example.com")
element = driver.execute_script("return document.getelementbyid('element_id')")
driver.execute_script("arguments[0].textcontent = 'new text'", element)
# 示例:点击元素
driver.execute_script("arguments[0].click()", element)
# 示例:触发事件
driver.execute_script("arguments[0].dispatchevent(new event('click'))", element)
# 示例:模拟键盘按键
driver.execute_script("arguments[0].dispatchevent(new keyboardevent('keydown', {key: 'enter'}))", element)
driver.quit()
arguments对象在selenium的execute_script方法中表示传递给javascript代码的参数。通过将参数作为execute_script方法的第二个参数传递,您可以在javascript代码中访问这些参数,并在浏览器上下文中执行自定义操作。
from selenium import webdriver
driver = webdriver.chrome()
driver.get("https://example.com")
# 使用execute_script方法获取特定dom元素的文本内容
text = driver.execute_script("return arguments[0].textcontent", driver.find_element_by_tag_name("h1"))
print(text)
driver.quit()
在这个例子中,我们使用execute_script方法来获取页面上的h1元素的文本内容。我们首先使用find_element_by_tag_name方法找到h1元素,然后将其作为execute_script方法的第一个参数传递。javascript代码"return arguments[0].textcontent"将返回h1元素的文本内容,我们可以从返回值中获取这个值。
-
2. **页面滚动**:
- 滚动到指定位置
- 滚动到元素可见
# 示例:滚动到指定位置
driver.execute_script("window.scrollto(0, 500)")
# 示例:滚动到元素可见
driver.execute_script("arguments[0].scrollintoview(true);", element)
driver.execute_script("window.scrollto(0, document.body.scrollheight);")
3. **表单操作**:
- 提交表单
- 重置表单
# 示例:提交表单
form_element = driver.execute_script("return document.getelementbyid('form_id')")
driver.execute_script("arguments[0].submit()", form_element)
# 示例:重置表单
driver.execute_script("arguments[0].reset()", form_element)
-
4. **浏览器操作**:
- 设置浏览器标题
- 弹出提示框
- 刷新页面
title = driver.execute_script("return document.title;")
print("页面标题:", title)
from selenium import webdriver
import time
# 创建 webdriver 实例(如 chrome webdriver)
driver = webdriver.chrome()
# 打开网页
driver.get("https://www.example.com")
# 触发一个警告框(alert、confirm 或 prompt)
driver.execute_script("alert('this is an alert message.')")
# switch_to.alert 方法是 selenium 中用于处理浏览器中出现的警告框(alert、confirm 和 prompt)的方法。
# 它的作用是将 webdriver 的控制权切换到警告框上,以便进行相应的操作。
# 切换到警告框
alert = driver.switch_to.alert
time.sleep(4)
# 对警告框进行操作,例如获取文本和点击确认按钮
alert_text = alert.text # 获取警告框的文本
print("alert text:", alert_text)
alert.accept() # 点击确认按钮
# 关闭浏览器
driver.quit()
# 示例:设置浏览器标题
driver.execute_script("document.title = 'new title'")
# 示例:刷新页面
driver.execute_script("location.reload()")
5. **cookie 和存储操作**:
- 设置 cookie
- 获取 cookie
- 存储数据到 localstorage/sessionstorage
- 获取 localstorage/sessionstorage 数据
# 示例:设置 cookie
driver.execute_script("document.cookie = 'name=value; expires=date; path=path'")
# 示例:获取 cookie
cookies = driver.execute_script("return document.cookie")
# 示例:存储数据到 localstorage
driver.execute_script("localstorage.setitem('key', 'value')")
# 示例:获取 localstorage 数据
data = driver.execute_script("return localstorage.getitem('key')")
6. **其他操作**:
- 添加/移除类名
- 获取/设置属性值
- 延迟执行函数
# 示例:添加类名
driver.execute_script("arguments[0].classlist.add('new-class')", element)
# 示例:获取属性值
attribute_value = driver.execute_script("return arguments[0].getattribute('attribute_name')", element)
# 示例:创建新元素并添加到文档
new_element = driver.execute_script("return document.createelement('div')")
driver.execute_script("document.body.appendchild(arguments[0])", new_element)
# 示例:延迟执行函数
driver.execute_script("settimeout(function(){ /* 操作 */ }, 2000)")
7. **页面元素操作**:
- 插入行到表格
- 插入单元格到行
- 创建新元素并添加到文档
# 示例:插入行到表格
table = driver.execute_script("return document.getelementbyid('table_id')")
driver.execute_script("table.insertrow(index)")
# 示例:插入单元格到行
row = driver.execute_script("return document.getelementbyid('row_id')")
driver.execute_script("row.insertcell(index)")
# 示例:创建新元素并添加到文档
new_element = driver.execute_script("return document.createelement('div')")
driver.execute_script("document.body.appendchild(arguments[0])", new_element)
8. **对话框处理**:
- 弹出警告框
- 更改 confirm 对话框返回值
# 示例:弹出警告框
driver.execute_script("alert('hello, this is an alert!')")
# 示例:更改 confirm 对话框返回值
driver.execute_script("window.confirm = function(){return true;}")
9. **页面交互**:
- 添加事件监听器
- 触发自定义事件
# 示例:添加事件监听器
driver.execute_script("arguments[0].addeventlistener('click', function(){ /* 处理函数 */ })", element)
# 示例:触发自定义事件
driver.execute_script("arguments[0].dispatchevent(new event('customevent'))", element)
10. **样式操作**:
- 更改背景颜色
- 显示/隐藏元素
# 示例:更改背景颜色
driver.execute_script("arguments[0].style.backgroundcolor = 'yellow'", element)
# 示例:显示/隐藏元素
driver.execute_script("arguments[0].style.display = 'none'", element)
------------
execute_script 方法在 selenium 中是一个非常有用的工具,它允许你直接在浏览器中执行自定义的 javascript 代码,从而实现与页面更深入的交互和操作。通过这个方法,你可以执行各种自定义的 javascript 功能,例如:
- 操作 dom 元素: 可以通过 javascript 修改、添加或删除页面上的元素,改变其样式、属性或内容。
- 模拟用户行为: 可以模拟用户的点击、输入、滚动等操作,例如触发事件、执行动作等。
- 页面滚动: 可以通过 javascript 控制页面的滚动,实现滚动到指定位置、滚动到元素可见等功能。
- 获取页面信息: 可以通过 javascript 获取页面的各种信息,例如页面标题、url、元素属性、页面加载状态等。
- 执行复杂操作: 可以执行一些比较复杂的操作,例如执行自定义的 javascript 函数、调用第三方 javascript 库等。
通过 execute_script 方法,利用 javascript 的强大功能与页面进行更深入的交互,完成一些 selenium 本身无法直接实现的功能,从而更灵活地进行 web 自动化测试或数据抓取任务。
发表评论