前言:
本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步。
Selenium能够执行js,这使得Selenium拥有更强大的功能。只要js可以完成的操作,Selenium大部分应该也能完成。
基于这一功能,Selenium直接使用js操作,可以解决很多click()不生效的情况。
1.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']
2.示例
示例一:使用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完成,
- 处理思路:
- 1.要取消日期的readonly属性;
- 2.给value赋值;
- 3.写代码来实现如上两步骤,再webdriver对js进行处理;
- 示例说明:
- 打开网址:https://www.12306.cn/
- 修改触发日期
- 打印出发日期
- 关闭网址
lass 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="2021-1-20"')
time.sleep(3)