使用Selenium的execute_script方法执行JavaScript代码

Seleniumexecute_script 方法允许在浏览器上下文中执行 JavaScript 代码。这对于执行一些 WebDriver 本身不提供的操作非常有用,比如直接操作 DOM 元素、执行一些特定的 JavaScript 功能等。这个方法的一般语法是:

driver.execute_script(script, *args)
  • script 是要执行的 JavaScript 代码。
  • args 是可选的参数,它们可以传递给 JavaScript 代码。

这个方法的返回值取决于执行的 JavaScript 代码。通常情况下,如果 JavaScript 代码返回一个值,那么 execute_script 方法也会返回这个值。

from selenium import webdriverdriver = 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)  # 输出结果为 5driver.quit()

在这个例子中,我们将JavaScript代码作为execute_script方法的第一个参数传递,并将要传递的参数(2和3)作为第二个参数传递。JavaScript代码将在浏览器上下文中执行,并且arguments对象将包含传递的参数(在这个例子中是2和3)。 

可以将其功能大致分类如下:

  • 1. **查找和操作元素**:

   - 通过 ID 查找元素
   - 通过类名查找元素
   - 通过标签名查找元素
   - 通过 CSS 选择器查找元素
   - 设置元素文本内容
   - 设置元素值(适用于输入框等)
   - 设置元素样式
   - 点击元素
   - 触发事件
   - 模拟键盘按键

from selenium import webdriverdriver = 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 webdriverdriver = 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 功能,例如:

  1. 操作 DOM 元素: 可以通过 JavaScript 修改、添加或删除页面上的元素,改变其样式、属性或内容。
  2. 模拟用户行为: 可以模拟用户的点击、输入、滚动等操作,例如触发事件、执行动作等。
  3. 页面滚动: 可以通过 JavaScript 控制页面的滚动,实现滚动到指定位置、滚动到元素可见等功能。
  4. 获取页面信息: 可以通过 JavaScript 获取页面的各种信息,例如页面标题、URL、元素属性、页面加载状态等。
  5. 执行复杂操作: 可以执行一些比较复杂的操作,例如执行自定义的 JavaScript 函数、调用第三方 JavaScript 库等。

通过 execute_script 方法,利用 JavaScript 的强大功能与页面进行更深入的交互,完成一些 Selenium 本身无法直接实现的功能,从而更灵活地进行 Web 自动化测试或数据抓取任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础知识总结(30)

注解 获取注解中的值 /*** 自定义注解*/ Target({ElementType.TYPE,ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface MyAnno { ​String value() default "admin"; // String value(); // int age(); } ​ //若注解属性没有给定属…

一.Git环境

1.Linux安装 sudo apt-get install git2.初次运行Git的配置 当我们安装好Git后,还需要在Git bash或者terminal进行一些相关设置,以下设置仅需设置一次即可。 git config --global user.name "Your Name" git config --global user.email &q…

【C++】反向迭代器

一、前言 在前面对vector等容器的学习中,我们学会了如何去使用正向迭代器并模拟实现 但是我们没有去模拟实现反向迭代器,这篇文章中我们就来了解反向迭代器的底层并实现它,把之前的坑给填上。 二、反向迭代器 反向迭代器的底层设计十分精妙…

python统计分析——灵敏度、特异度和ROC曲线

参考资料:python统计分析【托马斯】 1、灵敏度和特异度 灵敏度:也叫作效能。被检验正确识别出来的阳性结果(病人中有疾病且检验结果是阳性的概率)。 特异度:被检验正确识别出来的阴性结果(病人健康且检验结…

大模型融合方法-DARE

LLM在SFT之后会产生大量的冗余参数(delta参数),阿里团队提出DARE方法来消除delta参数,并将其合并到PRE模型中,从而实现多源模型能力的吸收。 DARE无需GPU重新训练,其思路非常简单,就跟dropout类似: m t ∼…

针对pycharm打开新项目需要重新下载tensorflow的问题解决

目录 一、前提 二、原因 三、解决办法 一、前提 下载包之前,已经打开了,某个项目。 比如:我先打开了下面这个项目: 然后在terminal使用pip命令下载: 如果是这种情况,你下载的这个包一般都只能用在这一个…

RGB到灰度图像的转换原理及例程

RGB到灰度图像的转换是一种常用的图像处理操作,其原理是根据人眼对不同颜色的敏感度,将彩色图像的红、绿、蓝三个通道的像素值按照一定权重进行加权平均,得到灰度图像的像素值。 在RGB图像中,每个像素点由红、绿、蓝三个分量组成…

自动驾驶轨迹规划之时空语义走廊(一)

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.摘要 2.系统架构 3.MPDM 4.时空语义走廊 ​4.1 种子生成 4.2 具有语义边界的cube inflation ​4.3 立方体松弛 本文解析了丁文超老师…

如何计算KST指标,昂首资本一个公式计算

在上一篇文章中,Anzo Capital昂首资本和各位投资者一起了解了KST指标,今天我们继续分享如何计算KST指标。 首先投资者可以在时间范围9、12、18和24分析变化率值。 前三个值(时间帧9、12、18)用EMA 26平滑,最后一个值用EMA 39平滑。 然后&…

从0开始搭建基于VUE的前端项目

准备与版本 安装nodejs(v20.11.1)安装vue脚手架(vue/cli 5.0.8) ,参考(https://cli.vuejs.org/zh/)vue版本(2.7.16),vue2的最后一个版本 初始化项目 创建一个git项目(可以去gitee/github上创建&#xff…

Windows Edge 兼容性问题修复 基本解决方案

Windows Edge 浏览器兼容性问题可能源于多个方面,以下是一些常见的问题及其处理结果: 插件或扩展冲突:某些第三方插件或扩展可能与Edge浏览器不兼容,导致崩溃或运行异常。处理结果为,尝试禁用所有插件和扩展&#xff…

数据分析之POWER Piovt透视表分析

将几个数据表之间进行关联 生成数据透视表 超级透视表这里的字段包含子字段 这三个月份在前面的解决办法 1.选中这三个月份,鼠标可移动的时候移动到后面 2.在原数据进行修改 添加列获取月份,借助month的函数双击日期 选择月份这列----按列排序-----选择月…

速盾:cdn能防什么攻击

CDN(Content Delivery Network)是一种分布式网络架构,用于提供高可靠性、高性能的内容传输服务。它通过在世界各地部署服务器节点来缓存和分发网站的静态内容,以优化用户访问体验。除了提供性能优化的功能,CDN还能够防…

搜索与图论——Dijkstra算法求最短路

最短路算法 稠密图与稀疏图 n为点数,m为边数。m远小于n的平方为稀疏图,m接近n的平方为稠密图。 稀疏图用邻接表存,稠密图用邻接矩阵存 朴素版dijkstra时间复杂度为O(n^2),对于稠密图可以ac,但遇到稀疏图时会TLE。 dijkstra函数实…

Linux权限管理

文章目录 linux权限管理1.Linux权限的概念2.Linux权限管理2.1 文件访问者的分类(人)2.2 文件类型和访问权限(事物属性)2.2.1 文件类型2.2.2 基本权限 2.3文件权限值的表示方法2.3.1 字符表示方法2.3.2 八进制数值表示方法 2.4 文件…

PCB信号传输速度

对于常用的FR4材料,走线的信号传输速度大约为 6 in/ns,in为英寸,1in等于2.54cm。 什么叫长走线? 跟信号的上升时间、传输速度有关,很多信号完整性相关的书籍认为,信号传输过程中,例如信号从低…

JetBrains全家桶vmoptions配置文件(Ubuntu)

Android Studio: ~/.config/Google/AndroidStudioPreview2022.3/studio64.vmoptions 其他IDE: ~/.config/JetBrains/RustRover2023.3/rustrover64.vmoptions ~/.config/JetBrains/PyCharm2023.3/pycharm64.vmoptions ~/.config/JetBrains/GoLand2023.1…

Odoo销售订单模块中添加自定义按钮以下载选择的发货单

在Odoo的ERP系统中,销售订单和发货单是销售管理流程中的重要组成部分。为了提高工作效率,可以通过自定义按钮的方式,让用户能够方便地下载选择的发货单。本教程将详细介绍如何在销售订单列表视图中添加一个自定义按钮,并实现下载发…

CV领域 交叉注意力(Cross Attention)中QKV的含义理解

交叉注意力公式: 注意力的输入: (1)KV:图像的全局特征 (2)Q:告诉attention需要关注哪些重要特征 公式计算过程理解: (1):Q和K相乘…

后疫情时代CS保研沉思录暨2023年个人保研经验贴

个人情况 正如古话所说,最适合你的才是最好的。因此这里先贴上个人基本情况,用作参考。 如果你的个人情况与我相近,则有更强的参考作用。如果情况相差较大,也可以姑且引为例子来研究。 学校层次:中流至末流211 专业…