【selenium】执行 Javascript 脚本 滚动、元素的特殊操作等

news/2025/2/12 21:53:28/

某些特殊情况下,使用selenium的api无法操作页面元素,点击、滚动实现的某些功能,可以考虑通过执行js来完成。

为什么不用js写自动化?——selenium第一版是js写的,但js兼容性存在问题,所以引入webdriver 现在有用node.js做的cypress框架

一、方法解释:

executeScript(String script, Object... args);

第一个参数:script 脚本 在浏览器console里可直接输入的js语句

第二个参数:Object... args 可变参数 (0 - n)个; 把args的值传给前面js脚本,

参数可以是:定位到的定位方式/元素/属性...

1、使用方式1——不传参:Object... args为0

JavascriptExecutor jsExecutor=(JavascriptExecutor) driver;//这里也可以不用强转,因为多态
jsExecutor.executeScript("...");

2、使用方式2——传参:Object... args个数多个 从arguments[0]开始,arguments[1],arguments[2]......

3、举例:比如需要删除12306时间窗口的只读属性readonly

//把driver转换成js对象
JavascriptExecutor jsExexutor = driver;方法一:Object... arg:不传参数,只有一个js脚本//定义js代码String js = "document.getElementById(\"train_date\").removeAttribute(\"readonly\")";jsExexutor.executeScript(js);Thread.sleep(2000);driver.findElementById("train_date").sendKeys("123432432");方式二(1):Object... args: 传一个参数//js脚本中1个占位符String js = "arguments[0].removeAttribute(\"readonly\")";WebElement elementByXPath = driver.findElementByXPath("input[@id='train_date']");jsExexutor.executeScript(js,elementByXPath);方式二(2):Object... args: 传两个参数//js脚本中两个占位符String js = "arguments[0].removeAttribute(arguments[1])";WebElement elementByXPath = driver.findElementByXPath("//input[@id='train_date']");jsExexutor.executeScript(js,elementByXPath,"readonly");driver.findElementById("train_date").sendKeys("123432432");


 二、使用场景:

1 、设置/去除元素属性

setAttribute/removeAttribute

案例:如上12306时间选择框

2、 页面滚动

  • window.scrollTo(0, document.body.scrollHeight) 滚动到页面最底部

    • window.scrollTo(0, 0) 竖向滚动条置顶

    • window.scrollTo(x-横坐标,y-纵坐标 )

  • element.scrollIntoViewIfNeeded(true) 滚动到指定元素的位置 需要结合js参数来使用

jsExexutor.executeScript("window.scrollTo(0, document.body.scrollHeight+100)");

3、元素无法被点击,用js可以操作

ElementClickInterceptedException: element click intercepted——元素点击拦截

Element is not clickable at point ,Other element would receive the click

有时候元素被父节点挡住,通过driver/手动无法点击,可通过js脚本执行,它不同于驱动driver执行,所以js可以执行

举例: 
driver.get("https://www.ketangpai.com/");
driver.manage().window().maximize();//❌下面这行代码点击被拦截   这句代码是通过驱动driver执行(类似手动操作)——实际是因为被它父节点拦截掉了
driver.findElementByXPath("//span[text()='登录']").click();//☑️js代码,通过js脚本执行,不同于上述的驱动driver执行,所以js可以执行
WebElement element = driver.findElementByXPath("//span[text()='登录']");
JavascriptExecutor javascriptExecutor = driver;
javascriptExecutor.executeScript("arguments[0].click()",element);


http://www.ppmy.cn/news/1362611.html

相关文章

如何修改docker容器的端口映射

要修改 Docker 容器的端口映射&#xff0c;你需要停止并删除现有的容器&#xff0c;然后使用新的端口映射重新运行容器。以下是详细步骤&#xff1a; 停止容器&#xff1a; 使用 docker stop 命令停止正在运行的容器。替换 <container_id> 为你要停止的容器的 ID 或者容器…

Android中Transition过渡动画的简单使用

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、布局xml文件代码如下&#xff1a; <?xml version"1.0" encoding&quo…

通俗易懂分析:Vite和Webpack的区别

1、对项目构建的理解 先从浏览器出发&#xff0c; 浏览器是由浏览器内核和JS引擎组成&#xff1b;浏览器内核编译解析html代码和css代码&#xff0c;js引擎编译解析JavaScript代码&#xff1b;所以从本质上&#xff0c;浏览器只能识别运行JavaScript、CSS、HTML代码。 而我们在…

基于Clion+stm32cubemx+rt-thread os进行环境搭建

前言 RT-Thread文档中心Clion开发STM32的环境搭建,请参考之前的文章本次使用的芯片为STM32F407VET6,其他芯片相似.项目创建 使用STM32CubeMx快速生成项目工程,此步骤的话可以参考官方文档 基础配置如下

SpringBoot中Websocket的简单使用

目录 1 Websocket的定义及一些使用场景 2 使用方法 2.1 导入依赖坐标 2.2 创建WebSocket服务 2.3 编写配置类注册WebSocket 2.4 在需要处使用WebSocket服务 1 Websocket的定义及一些使用场景 定义&#xff1a;Websocket实现了浏览器与服务器全双工通信一浏览器和服务器只…

嵌出式003--外部中断

中断&#xff1a;在主程序运行过程中&#xff0c;出现特定的中断触发条件也就是中断源&#xff0c;使得CPU暂停当前正在运行的程序转而去处理中断程序处理完成又返回执行原来被暂停的位置继续执行。 中断优先级&#xff1a;当多个中断源同时申请中断的时候&#xff0c;CPU会根…

家装服务管理:Java技术的创新应用

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

赵丽颖林更新《与凤行》传乌龙!惊艳特效惹争议

古装偶像剧《与凤行》是收视女王赵丽颖和实力小生林更新继《楚乔传》的再度合作&#xff0c;“星月”CP时隔多年的二搭还没开播&#xff0c;就已经把观众的期待值高高拉起。 《与凤行》预告惊艳四座&#xff0c;特效究竟出自谁手&#xff1f; 观众早已苦“五毛特效”久矣&…