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

embedded/2024/12/20 14:11:41/

目录

场景应用和使用

页面滚动

获取返回值

返回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脚本如下:

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

2.滚动到窗口底部

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

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

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

javascript">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 才可以正常返回! 

代码如下:

python">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中使用它,还是以上一个例子为例,我们此时拿到“博客园”这一整个元素,便可以拿到它的所有属性了,如下:

python">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("显示的文本")

python">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.ppmy.cn/embedded/147296.html

相关文章

【C语言】库函数常见的陷阱与缺陷(一):字符串处理函数[2]--gets函数

C语言中的gets函数是一个用于从标准输入(通常是键盘)读取一行字符串的函数。然而,gets函数存在多个陷阱与缺陷,这些缺陷可能导致程序崩溃、安全漏洞或未定义行为。 一、gets功能与用法 gets函数的主要作用是从标准输入(通常是键盘)读取一行字符串,并将其存储在指定的缓…

AIGC:图像风格迁移技术实现猜想

定义以下函数&#xff1a; f(image) -> (style, content) g(style, content) -> image 函数f将图片&#xff08;image&#xff09;分解成风格&#xff08;style&#xff09;和内容&#xff08;content&#xff09;两部分 函数g将风格&#xff08;style&#xff09;和内容…

写入hive metastore报问题Permission denied: user=hadoop,inode=“/user/hive”

背景 使用Doris创建hive catalog后&#xff0c;想在hive上的库中创建一个表&#xff0c;报如下图片错误 解决办法 hdfs dfs -ls /看到如下图片所示&#xff0c;只有root用户有写的权限 所以通过export HADOOP_USER_NAMEroot将hadoop的用户名改成root&#xff0c;然后再hdfs…

鸿蒙Next状态管理优秀实践

在鸿蒙Next应用开发中&#xff0c;高效的状态管理对于提升应用性能至关重要。本文将介绍一些状态管理的优秀实践&#xff0c;帮助开发者避免常见的低效开发场景&#xff0c;提升应用质量。 一、使用ObjectLink代替Prop减少不必要的深拷贝 问题描述 在父子组件数值传递中&…

Visio——同一个工程导出的PDF文件大小不一样的原因分析

现象 在不同电脑&#xff0c;导出来的PDF文件大小不一样。 原因分析 文件小的未将字体嵌入&#xff0c;文件大的已经将字体嵌入了。

【数据集】玻璃门窗缺陷检测数据集3085张5类YIOLO+VOC格式

数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;3085 Annotations文件夹中xml文件总计&#xff1a;3085 labels文件夹中txt文件总计&#xff1a;3085 标签种类数&am…

aac怎么转为mp3?操作起来很简单的几种aac转mp3的方法

aac怎么转为mp3&#xff1f;aac格式的优势主要体现在音质和压缩效率&#xff0c;尤其是在较低比特率下&#xff0c;能够实现更清晰的音质&#xff0c;这也是为何许多现代设备和应用偏爱aac格式的原因之一。特别是在手机、平板以及智能音响等设备中&#xff0c;aac文件几乎可以无…

yolov目标检测的图片onnx输入尺寸及预处理

参考 (github.com) 当你使用不同的图像尺寸&#xff08;例如1280&#xff09;进行预测时&#xff0c;YOLOv8会自动对输入图像进行适当的预处理以适配模型。这通常包括缩放和填充操作&#xff0c;确保图像不会发生畸变&#xff0c;同时保持原始宽高比。 对于使用OpenCV进行预处…