Selenium之execute_script()方法执行js脚本

目录

场景应用和使用

页面滚动

获取返回值

返回JavaScript定位的元素对象

修改元素属性

弹出提示框


场景应用和使用

在自动化测试中,部分场景无法使用自动化Selenium原生方法来进行测试:

  •         滚动到某个元素(位置)
  •         修改时间控件(修改元素属性)
  •         其它场景

因此我们需要使用js脚本来执行,js脚本有两种执行场景:

  •         在页面上直接执行js
  •         定位到指定元素再执行js 

WebDriver有两个方法来执行JavaScript,分别是:

  1. execute_script(同步执行)
  2. execute_async_script(异步执行)

下面将介绍使用execute_script()方法执行js的实例

页面滚动

1.滚动页面操作

        页面滚动我们可以滚到到指定位置,也可以滚到到页面底部

页面滚动使用

window.scrollTo(x,y)

来进行滚动,其中x表示横向滚动的位置,y表示纵向滚动的位置

1.滚动到指定位置

假设我们想滚动到距离顶部1000的位置,我们可以设置x=0,y=1000,如下:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import Byclass casetest(object):def __init__(self):self.driver = webdriver.Edge()self.driver.get('http://wwww.baidu.com')def test_execute(self):# 滚动条滚动self.driver.find_element(By.ID,('kw')).send_keys('selenium')self.driver.find_element(By.ID,('su')).click()sleep(2)#滚动到指定位置js= 'window.scrollTo(0,1000)'#使用execute_script执行js脚本self.driver.execute_script(js)sleep(2)if __name__ == '__main__':case = casetest()case.test_execute()case.driver.quit()

运行后,我们发现位置已经在距离顶部1000的位置了

或者我们可以使用Document来实现

js脚本如下:

js = 'document.documentElement.scrollTop=1000'
  • document:这是 JavaScript 中的一个全局对象,代表当前网页文档。
  • documentElement:这是 document 对象的一个属性,它代表整个文档的根元素,在 HTML 页面中通常是 <html> 元素。
  • scrollTop:这是 document.documentElement 的一个属性,表示当前文档根元素的垂直滚动条的位置,即页面在垂直方向上滚动的距离,以像素为单位。1000即为滚动1000个像素

2.滚动到窗口底部

同样的,如果我们想滚动到窗口底部,我们可以使用刚才说的 scrollTo方法,这样写js脚本:

js = 'window.scrollTo(0,document.body.scrollHeight)'

 只不过y轴高度变成了整个文档元素的高,相当于滑到了最底下:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import Byclass casetest(object):def __init__(self):self.driver = webdriver.Edge()self.driver.get('http://wwww.baidu.com')def test_execute(self):self.driver.find_element(By.ID,('kw')).send_keys('selenium')self.driver.find_element(By.ID,('su')).click()sleep(2)#滚动到网页底部js = 'window.scrollTo(0,document.body.scrollHeight)'#使用execute_script执行js脚本self.driver.execute_script(js)sleep(2)if __name__ == '__main__':case = casetest()case.test_execute()case.driver.quit()

这样就把窗口界面的滚动说完了

获取返回值

以博客园某作者为例,https://www.cnblogs.com/yoyoketang/,以获得“博客园”这个文本为例

我们首先定位到博客园,找到该元素的相关属性

这样我们找到了id属性,便可以利用js定位到该属性了,然后我们可以使用innerText()来获得该文本。

我们首先可以不在代码中执行,打开F12,点击控制台,输入定位的元素. innerText,可以直接进行调试,获得返回结果,我们可以看一下:

可以看到已经返回结果了,此时我们可以把这段js写到代码中了,需要注意的是,在代码中加入时,需要在前面写上return 才可以正常返回! 

代码如下:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import Byclass casetest(object):def __init__(self):self.driver = webdriver.Edge()self.driver.get('https://www.cnblogs.com/yoyoketang/')def test_execute(self):js = ('return ''document.getElementById("blog_nav_sitehome").innerText')res = self.driver.execute_script(js)print(res)sleep(2)if __name__ == '__main__':case = casetest()case.test_execute()case.driver.quit()

可以看到文本值已经被返回并输出出来了:

返回JavaScript定位的元素对象

当我们定位元素以后,我们使用js可以将它获取到,然后继续再selenium中使用它,还是以上一个例子为例,我们此时拿到“博客园”这一整个元素,便可以拿到它的所有属性了,如下:

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import Byclass casetest(object):def __init__(self):self.driver = webdriver.Edge()self.driver.get('https://www.cnblogs.com/yoyoketang/')def test_execute(self):js = ('return document.getElementById("blog_nav_sitehome")')res = self.driver.execute_script(js)#获取元素文本print(res.text)#获取元素href属性link = res.get_attribute("href")print(link)#点击元素res.click()sleep(2)if __name__ == '__main__':case = casetest()case.test_execute()case.driver.quit()

可以看到文本和;链接已经被打印出来了:

同时也点击了“博客园”这个元素,进入了我们想要的界面

修改元素属性

大部分时间控件都是 readonly属性,需要手动去选择对应的时间。自动化测试中,可以使用JavaScript代码取消readonly属性,这样便可以自己输入时间,而避免了必须选择手动日期

测试网站:中国铁路12306网站

整体测试步骤:

1.打开测试页面

2.定位元素,移除只读属性

3.修改日期并断言是否修改成功

代码如下:

from selenium import webdriver
import time
from selenium.webdriver.common.by import Byclass casetest(object):def __init__(self):self.driver = webdriver.Edge()def test_datettime(self):self.driver.get("https://www.12306.cn/index/")# 取消readonly属性self.driver.execute_script("dat=document.getElementById('train_date'); dat.removeAttribute('readonly')")#修改出发时间为2023-10-1self.driver.execute_script("document.getElementById('train_date').value='2023-10-01'")time.sleep(3)now_time = self.driver.execute_script("return document.getElementById('train_date').value")#判断是否修改成功assert '2023-10-01' == now_timeif __name__ == '__main__':case = casetest()case.test_datettime()case.driver.quit()

可以看到日期已经被成功修改

 

弹出提示框

alert可以弹出一个提示框,用法为alert("显示的文本")

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import Byclass casetest(object):def __init__(self):self.driver = webdriver.Edge()self.driver.get("http://baidu.com")def test_execute(self):js = "alert('This is a Test!')"self.driver.execute_script(js)sleep(2)if __name__ == '__main__':case = casetest()case.test_execute()case.driver.quit()

测试效果如下:

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

        简洁来说,就是使用selenium执行js脚本,进而完成selenium自动化不能完成的事情

到这里本文章就结束了,入如果有疑问,欢迎指正私信或评论区留言~

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

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

相关文章

Unity UGUI 之 Slider

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.Slider是什么 滑块&#xff0c;由三部分组成&#xff1a;背景 填充条 手柄 填充条就是…

【打工日常】使用Prometheus+Grafana+Alertmanager+Webhook-dingtalk搭建监控平台

一、监控平台介绍1.监控平台简述普罗米修斯四件套,分别为Prometheus、Grafana、Alertmanager、Webhook-DingTalk。Prometheus一套开源的监控&报警&时间序列数据库的组合,由SoundCloud公司开发,广泛用于云原生环境和容器化应用的监控和性能分析。其提供了通用的数据模…

《昇思 25 天学习打卡营第 20 天 | Pix2Pix实现图像转换 》

《昇思 25 天学习打卡营第 20 天 | Pix2Pix实现图像转换 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 Pix2Pix模型概述 Pix2Pix是一种基于条件生成对抗网络&#xff08;cGAN&#xff09;的图像转换模型&#x…

无人机侦察:一维相扫雷达技术详解

一维相扫雷达技术&#xff0c;即相位扫描雷达技术&#xff0c;在无人机侦察中扮演着重要角色。该技术通过在雷达发射天线上施加变化的相位差&#xff0c;使天线波束在固定平面内进行一维扫描&#xff0c;从而实现对目标区域的搜索和跟踪。与传统的机械扫描雷达相比&#xff0c;…

本地部署SearXNG

SearXNG SearXNG 是一个免费的互联网元搜索引擎&#xff0c;整合了各种搜索服务的结果。用户不会被跟踪&#xff0c;也不会被分析。 1. 使用 Docker 安装 SearXNG 容器 复制 docker run --rm \-d -p 8080:8080 \-v "${PWD}/searxng:/etc/searxng" \-e "BASE_…

leetcode.nvim使用cookie无法登陆问题

错误描述&#xff1a; 使用力扣 (LeetCode) 全球极客挚爱的技术成长平台 的cookie在neovim上使用leetcode.nvim进行登录会出现curl xxx -D xxxx的报错。 解决方法&#xff1a; 使用LeetCode - The Worlds Leading Online Programming Learning Platform这个网站的cookie进行登…

hisilicon的APP开发

hisilicon的APP开发 hisilicon的APP开发1、在andorid 源码目录对第三方apk进行签名:2、命令启动app应用3、查看SELinux当前状态:4、梯形接口 1、在andorid 源码目录对第三方apk进行签名: 参考:Technology\android\生成系统签名.md java -Xmx2048m -Djava.library.path=&…

Vishay推出具有高辐射强度和短开关时间的新型890 nm红外发光二极管

高速器件采用表面发射器芯片技术&#xff0c;优异的VF温度系数达 -1.0 mV/K 美国 宾夕法尼亚 MALVERN、中国 上海 — 2024年7月24日 — 日前&#xff0c;威世科技Vishay Intertechnology, Inc.&#xff08;NYSE 股市代号&#xff1a;VSH&#xff09;宣布&#xff0c;推出一款采…

dorado7 打印校验失败的字段

// Bind #updateTrade.beforeExecute !function(self, arg, dsTrade) { var currentData dsTrade.get("data:#"); if (currentData ! undefined) { var context {}; //校验时传入一个context 打印的时候能把校验出错的字段打印出来 var state currentData.v…

FTP、NFS、SAMBA系统服务

⼀、rsync托管xinetd 1 、为什么要进⾏服务托管 独⽴服务&#xff1a;独⽴启动脚本 ssh ftp nfs dns ... 依赖服务 : 没有独⽴的启动脚本 rsync telnet 依赖 xinetd 服务&#xff08;独⽴服务&#xff09; 2 、如何将 rsync 托管给 xinetd 服务去管理&#xff1f; 第⼀步&am…

普发Pfeiffer TPG300手侧配置安装操作技术资疗包含

普发Pfeiffer TPG300手侧配置安装操作技术资疗包含

Spring WebFlux 介绍与效果演示示例

Spring WebFlux 是 Spring Framework 5 引入的一个新的 Web 框架,它专为构建反应式(Reactive)Web 应用程序而设计。以下是对 Spring WebFlux 的详细介绍和示例。 Spring WebFlux 介绍 响应式编程: Spring WebFlux 使用响应式编程的理念,其中数据流和异步操作是核心概念。…

React中的无状态组件:简约之美

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【掌握浏览器版本检测&#xff1a;从代码到用户界面】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论✍ 引言…

JAVA.4.多态

目录 1.表现形式 2.前提条件 1.有继承关系 2.有父类引用指向子类对象 3.有方法的重写 3.注意事项 代码演示 代码结构 1.表现形式 父类类型 对象名字 new 子类对象(); 2.前提条件 1.有继承关系 2.有父类引用指向子类对象 3.有方法的重写 3.注意事项 1.调用成…

ozon要保证金吗,俄罗斯ozon平台要不要保证金

在跨境电商的广阔舞台上&#xff0c;俄罗斯Ozon平台作为本土领先的B2C电商平台&#xff0c;吸引了众多国内外卖家的目光。然而&#xff0c;对于初入该平台的新手卖家而言&#xff0c;一个常见且关键的问题便是&#xff1a;“Ozon要保证金吗&#xff1f;俄罗斯ozon平台要不要保证…

CTF-NSSCTF题单[GKCTF2020]

[GKCTF 2020]CheckIN 这道题目考察&#xff1a;php7-gc-bypass漏洞 打开这道题目&#xff0c;开始以为考察反序列化&#xff0c;但实际并不是&#xff0c;这里直接用$_REQUEST传入了参数便可以利用了。这里出现了一个eval&#xff08;&#xff09;函数&#xff0c;猜测考察命…

centos系统mysql主从复制(一主一从)

文章目录 mysql80主从复制&#xff08;一主一从&#xff09;一、环境二、服务器master1操作1.开启二进制日志2. 创建复制用户3. 服务器 slave1操作4. 在主数据库中添加数据 mysql80主从复制&#xff08;一主一从&#xff09; 一、环境 准备两台服务器&#xff0c;都进行以下操…

理解嵌入式

嵌入式系统是指嵌入在其他设备中的计算机系统&#xff0c;通常用于完成特定的任务。与通用计算机不同&#xff0c;嵌入式系统的硬件和软件都是为特定任务设计和优化的&#xff0c;具有高度的集成性和可靠性。 嵌入式系统广泛应用于各个领域&#xff0c;包括消费电子、汽车电子、…

【FFmpeg】avcodec_receive_packet函数

目录 1.avcodec_receive_packet FFmpeg相关记录&#xff1a; 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调用ffmpeg库进行RTMP推流和拉流 【FFmpeg】调用ffmpeg库进行SDL2解码后渲染 流程分析&#xff1a; 【FFm…

js有关深度优先遍历和广度优先遍历

1.Ai智能回答 深度优先遍历和广度优先遍历是图论中两种基本的遍历算法&#xff0c;‌它们分别以不同的方式遍历图中的所有顶点。‌ 深度优先遍历&#xff08;‌DFS&#xff09;‌是一种用于遍历或搜索树或图的算法。‌这个算法会尽可能深地搜索图的分支。‌在图中&#xff0c;‌…