前言
在我们使用 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 timefrom 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 脚本来优化自动化测试和网页操作,从而更好地满足项目需求。
评论