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

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

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

一、方法解释:

java 复制代码
executeScript(String script, Object... args);

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

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

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

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

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

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

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

java 复制代码
  //把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参数来使用

java 复制代码
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可以执行

举例:
java 复制代码
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);
相关推荐
qq_4061761427 分钟前
深入浅出 Pinia:Vue3 时代的状态管理新选择
javascript·vue.js·ecmascript
德育处主任Pro1 小时前
前端元素转图片,dom-to-image-more入门教程
前端·javascript·vue.js
叫我一声阿雷吧2 小时前
JS 入门通关手册(23):JS 异步编程:回调函数与异步本质
javascript·es6·前端面试·回调函数·回调地狱·js异步编程·异步本质
zayzy2 小时前
前端八股总结
开发语言·前端·javascript
今天减肥吗2 小时前
前端面试题
开发语言·前端·javascript
小J听不清3 小时前
CSS 外边距(margin)全解析:取值规则 + 实战用法
前端·javascript·css·html·css3
前端小超超4 小时前
Vue计算属性computed:可写与只读的区别
前端·javascript·vue.js
小J听不清5 小时前
CSS 边框(border)全解析:样式 / 宽度 / 颜色 / 方向取值
前端·javascript·css·html·css3
shughui6 小时前
Fiddler下载、安装、使用、汉化,详细图文教程(2026附安装包)
前端·测试工具·fiddler
用户15815963743706 小时前
多 Agent 系统容错与恢复机制:OAuth 过期、Cron 级联失败的工程解法
javascript