前言
在我们使用 selenium 进行自动化测试的时候,selenium 能够帮助我们实现元素定位和点击输入等操作,但是有的时候,我们会发现,即使我们的元素定位没有问题,元素也无法执行操作;也有部分情况是我们无法直接定位滚动条河时间控件来进行操作,这个时候,我们就需要借助 JavaScript 来解决问题。本文就来给大家介绍一下 selenium 如何执行 JavaScript 脚本,以及这种方法的一些常见应用场景和最佳实践。
Selenium 中调用 js
在 Selenium 中主要使用以下函数来调用 js:
execute_script(script, *args)
复制代码
说明:在当前窗口/框架中同步执行 JavaScript。
参数:
script:被执行的 js 脚本
*args:被执行的 js 脚本中使用的参数
使用方法:
driver.execute_script('return document.title;')
注意: js 脚本中return document.title
;中使用 return 可以获取 js 脚本返回的结果
源码:
def execute_script(self, script, *args):
converted_args = list(args)
command = None
if self.w3c:
command = Command.W3C_EXECUTE_SCRIPT
else:
command = Command.EXECUTE_SCRIPT
return self.execute(command, {
'script': script,
'args': converted_args})['value']
复制代码
使用 js 完成滑动操作
当页面显示的数据较多,需要点击底部的对象时,需要把鼠标移动到底部,才可以点击对象。
场景说明:
当我们在百度上搜索一个内容时,内容较多,我们想查看完整的页面需要滑动到页面底部。代码如下:
import time
from selenium import webdriver
class TestJs:
def setup(self):
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_js_scroll(self):
self.driver.get("https://www.baidu.com/")
# 定位搜索框,传入搜索内容
self.driver.find_element_by_id("kw").send_keys("selenium")
# 使用JS定位搜索按钮,点击搜索
ele_search = self.driver.execute_script('return document.getElementById("su")')
ele_search.click()
# 将搜索页面滑动至最下方
self.driver.execute_script('document.documentElement.scrollTop=10000')
time.sleep(3)
# 点击下一页
self.driver.find_element_by_xpath('//*[@id="page"]/div/a[10]').click()
time.sleep(3)
#打印js脚本执行后的返回结果
#返回页面标题
print(self.driver.execute_script('return document.title'))
#返回performance.timing
print(self.driver.execute_script('return JSON.stringify(performance.timing)'))
复制代码
使用 js 操作时间控件
大部分时间空间都是 readonly 属性,需要手动去选择对应的时间,手工测试中很容易做到,自动化中对控件的操作可以使用 js 完成,我们需要先移除 readonly 属性,再给 value 赋值,具体代码如下:
Class TestJs:
def setup(self):
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_js_datetime(self):
# 打开网址
self.driver.get('https://www.12306.cn/')
time.sleep(3)
# 定位时间元素;进行readonly属性去除操作;赋值新日期
# 注意:可以合并执行JS方法的写法
self.driver.execute_script(
'a=document.getElementById("train_date");a.removeAttribute("readonly");a.value="2024-3-20"')
time.sleep(3)
复制代码
总结
通过使用 Selenium 执行 JavaScript 脚本,我们可以更灵活地操作根级别文档和时间控件,提高了测试的效率和准确性。在实际应用中,开发者可以根据具体需求,灵活运用 JavaScript 脚本来优化自动化测试和网页操作,从而更好地满足项目需求。
评论