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

news2024/9/20 7:47:03

某些特殊情况下,使用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.coloradmin.cn/o/1465092.html

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

相关文章

【C语言-期末项目/项目实践】-贪吃蛇(两万五千字详解,手把手教程博文,期末答辩神助手)

重要:游戏逻辑设计图 目录 1.游戏背景 2.项目效果展示 3.项目实现要求 4.技能要求 5.技术要点 6.Win32 API介绍 6.1Win32API 6.2控制台程序 6.3控制台屏幕上的坐标COORD 6.4GetStdHandle 6.5GetConsoleCursorInfo 6.5.1 CONSOLE_CURSOR_ INFO 6.6 Se…

初始Nginx(基本概念)

目录 一、Nginx的概念 二、Nginx常用功能 1、HTTP(正向)代理,反向代理 1.1正向代理 1.2 反向代理 2、负载均衡 2.1 轮询法(默认方法) 2.2 weight权重模式(加权轮询) 2.3 ip_hash 3、web缓存 三、基础特性 四…

JAVA工程师面试专题-Mysql篇

一、基础 1、mysql可以使用多少列创建索引? 16 2、mysql常用的存储引擎有哪些 存储引擎Storage engine:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。常用的存储引擎有以下: Innodb引擎:In…

Git拉取gitee代码至本地

首先需要有Git,才能拉取代码。 安装参考 Git安装与卸载_git卸载重装-CSDN博客 安装好后在自己想要拉取代码的位置,右键Git bash here gitee 点击 复制 填写到打开的窗口即可

GEE数据集——30 米全球年度烧毁面积地图 (GABAM)(更新)

30 米全球年度烧毁面积地图 (GABAM) 迄今为止,全球烧毁面积(BA)产品只有较高的空间分辨率,因为目前大多数全球烧毁面积产品都是在主动火灾探测或密集时间序列变化分析的帮助下生成的,这需要非常高的时间分辨率。不过&a…

GoLand 相关

goland 下载依赖 go mod tidy:保持依赖整洁 go mod tidy 命令的作用是清理未使用的依赖,并更新 go.mod 以及 go.sum 文件。 go mod tidy 和 go mod vendor 两个命令是维护项目依赖不可或缺的工具。go mod tidy 确保了项目的 go.mod 文件精简且准确&…

Nacos注册中心实战

目录 为什么需要注册中心? 注册中心选型 Nacos是什么? 微服务整合Nacos注册中心实战 Nacos Server环境搭建 微服务提供者整合Nacos 微服务调用者整合Nacos 整合RestTemplateSpring Cloud LoadBalancer实现微服务调用 为什么需要注册中心&#xf…

简单几步通过DD工具把云服务器系统Linux改为windows

简单几部通过DD安装其他系统,当服务器的web控制台没有我们要装的系统,就需要通过DD(Linux磁盘)工具来更改系统,(已知支持KVM系统) 本文如何简单的更换系统,不通过web控制台来更换&a…

掌握Docker:让你的应用轻松部署和管理

文章目录 一、引言(为什么要学习docker?)1.1 环境不一致1.2 隔离性1.3 弹性伸缩1.4 学习成本 二、Docker介绍2.1 Docker的由来2.2 什么是Docker2.3 为什么要用Docker2.3.1 虚拟机2.3.2 Linux容器 2.4 Docker与传统虚拟机的区别2.5 Docker的思…

利用采购软件有效管理采购支出流程

在资本驱动的商业世界中,企业花的每一分钱都必须通过可量化的回报来证明其合理性。 采购支出管理通过简化企业的采购流程来实现支出的无缝优化。适当的程序可通过加强与供应商和贸易伙伴的沟通,来帮助企业最大限度地节省成本。 采购支出管理的重要性 企…

代码随想录算法训练营第四十天 343. 整数拆分、 96.不同的二叉搜索树

代码随想录算法训练营第四十天 | 343. 整数拆分、 96.不同的二叉搜索树 343. 整数拆分 题目链接:343. 整数拆分 - 力扣(LeetCode) 例如 n 10, 可以拆分为 3 * dp[7] 。因为dp[7]之前已经计算过最大 3 * 4, 所以dp[10] 3 * 3 …

conda 进入python环境里pip install安装不到该环境或不生效

参考:https://blog.csdn.net/weixin_47834823/article/details/128951963 https://blog.51cto.com/u_15060549/4662570?loginfrom_csdn 1、直接进入python Scripts目录下安装 cmd打开运行窗口,cd切换路径至指定虚拟环境下的Scripts路径后再pip安装 擦…

二叉树中的第K大层和

1.题目 这道题是2024-2-23的签到题,题目难度为中等。 考察知识点为BFS算法(树的层序遍历) 大根堆(优先队列)。 题目链接:2583. 二叉树中的第 K 大层和 - 力扣(LeetCode) 给你一棵…

MySQL学习Day18——逻辑架构

一、逻辑架构剖析: 1.服务器处理客户端请求: 首先 MySQL 是典型的C/S架构,即client/Server架构,服务器端程序使用的mysqld。不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送段文本(SQL语…

QT中调用python

一.概述 1.Python功能强大,很多Qt或者c/c开发不方便的功能可以由Python编码开发,尤其是一些算法库的应用上,然后Qt调用Python。 2.在Qt调用Python的过程中,必须要安装python环境,并且Qt Creator中编译器与Python的版…

docker 可视化管理工具 ui-for-docker

1、查询 docker search ui-for-docker 2、拉取镜像 docker pull uifd/ui-for-docker 3、运行启动容器 docker run -it -d \ --name docker-web \ -p 9010:9000 \ --privilegedtrue \ -v /var/run/docker.sock:/var/run/docker.sock \ ui-for-docker 4、页面访问 ​http:/…

vex-table链接

vxe-table v4https://vxetable.cn/#/table/start/quick

测试开源C#人脸识别模块DlibDotNet

百度“C# 换脸”找到参考文献4,发现其中使用DlibDotNet检测并识别人脸(之前主要用的是ViewFaceCore),DlibDotNet是Dlib的.net封装版本,后者为开源C工具包,支持机器学习算法、图像处理等算法以支撑各类高级应…

应用感知型网络性能管理

网络基础设施似乎日益复杂和先进,迫使网络管理员抛弃传统的管理方法。应用感知型网络性能管理是一种用于监控网络性能的新型整体方法,它为管理员提供了强大的 IT 资源管理功能。应用感知型网络性能管理为 IT 管理员带来了精细视图、动态资源分配、主动故…

如何使用NPM包管理器在Node.js项目中安装和管理依赖

随着现代开发技术的快速发展,前端开发工程师们面临着越来越多的挑战。其中一个重要的挑战之一就是管理项目中的依赖关系。NPM(Node Package Manager)是一个业界领先的包管理器,被广泛应用于Node.js项目中。本文将详细介绍如何使用…