Selenium执行JavaScript脚本的方法示例


Posted in Javascript onDecember 31, 2020

JavaScript是运行在客户端(浏览器)和服务器端的脚本语言,允许将静态网页转换为交互式网页。可以通过 Python Selenium WebDriver 执行 JavaScript 语句,在Web页面中进行js交互。那么js能做的事,Selenium应该大部分也能做。WebDriver是模拟终端用户的交互,所以就不能点击不可见的元素,有时可见元素也不能点击。在这些情况下,我们就可以通过WebDriver 执行JavaScript来点击或者执行页面元素。本文将介绍如何使用 WebDriver执行 JavaScript语句。

Web元素定位及操作

使用execute_script() 执行 JavaScript 代码,有两种方法实现元素操作

方法1:文档级别操作

直接使用JavaScript实现元素定位和动作执行,主要方法有:

document.getElementById
document.getElementsByClassName
document.getElementsByName
document.getElementsByTagName
document.getElementsByTagNameNS

测试示例:

  • 打开百度一下
  • 输入框输入”test“
  • 点击百度一下

python代码:

def test_baidu(self):
  self.driver.get("http://www.baidu.com")
  self.driver.execute_script('document.getElementById("kw").value = "test"')
  time.sleep(2)
  self.driver.execute_script('document.getElementById("su").click()')
  time.sleep(2)

在执行过程中,WebDriver 将 JavaScript 语句注入到浏览器中,然后脚本将执行。这个注入 JavaScript 有自己的名称空间,不会干扰实际网页中的 JavaScript运行。

方法2:元素级别操作

可以先使用WebDriver获取想要操作的元素,然后使用JavaScript执行操作。

input_ele = driver.find_element_by_id("su") 
driver.execute_script("arguments[0].click();", input_ele)

python代码:

def test_baidu2(self):
  self.driver.get("http://www.baidu.com")
  input_ele = self.driver.find_element_by_id("kw")
  self.driver.execute_script("arguments[0].value = 'test';", input_ele)
  time.sleep(2)
  baidu_ele = self.driver.find_element_by_id("su")
  self.driver.execute_script("arguments[0].click();", baidu_ele)
  time.sleep(2)

可以在语句中使用多个 JavaScript动作:

username = driver.find_element_by_xpath("//*[@id='username']")
password = driver.find_element_by_xpath("//*[@id='password']")
driver.execute_script("arguments[0].value = 'admin';arguments[1].value = 'admin';", username, password)

获取返回值

可以返回JavaScript的执行结果:

driver.execute_script("return document.getElementById('kw').value")
driver.execute_script("return document.title;") # 返回网页标题

滑动

在 Web自动化测试 | ActionChains、TouchAction 中介绍了TouchAction类中scroll_from_element()也可以滑动页面。

滑动到浏览器底部

document.documentElement.scrollTop=10000
window.scrollTo(0, document.body.scrollHeight)

滑动到浏览器顶部

document.documentElement.scrollTop=0
window.scrollTo(document.body.scrollHeight,0)

更改元素属性

大部分时间控件都是 readonly属性,需要手动去选择对应的时间。自动化测试中,可以使用JavaScript代码取消readonly属性。

测试页面: https://www.12306.cn/index/

Selenium执行JavaScript脚本的方法示例

测试步骤:

  • 打开测试页面
  • 修改出发日期
  • 断言日期是否修改成功

python测试代码:

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')")  
  self.driver.execute_script("document.getElementById('train_date').value='2020-10-01'")
  time.sleep(3)
  now_time = self.driver.execute_script("return document.getElementById('train_date').value")
  assert '2020-10-01' == now_time

总结

Selenium WebDriver 执行 JavaScript代码是一个非常强大的功能,可以实现WebElement 接口所有功能,甚至更多的功能。比如在web性能测试中可以调用Web API接口window.performance来测试Web性能。

到此这篇关于Selenium执行JavaScript脚本的方法示例的文章就介绍到这了,更多相关Selenium执行JavaScript脚本内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
为JavaScript添加重载函数的辅助方法
Jul 04 Javascript
jQuery实现动画效果的实例代码
May 07 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
Apr 17 Javascript
本人自用的global.js库源码分享
Feb 28 Javascript
JavaScript生成SQL查询表单的方法
Aug 13 Javascript
Bootstrap每天必学之基础排版
Nov 20 Javascript
AngularJS执行流程详解
Feb 17 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
Sep 11 Javascript
JS从非数组对象转数组的方法小结
Mar 26 Javascript
web页面和微信小程序页面实现瀑布流效果
Sep 26 Javascript
Vue指令指令大全
Feb 09 Javascript
JS typeof fn === 'function' && fn()详解
Aug 22 Javascript
javascript实现随机抽奖功能
Dec 30 #Javascript
JS+JQuery实现无缝连接轮播图
Dec 30 #jQuery
微信小程序弹窗禁止页面滚动的实现代码
Dec 30 #Javascript
vue-cli4.0多环境配置变量与模式详解
Dec 30 #Vue.js
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 #Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 #Vue.js
js+html+css实现手动轮播和自动轮播
Dec 30 #Javascript
You might like
PHP与MySQL交互使用详解
2006/10/09 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
JsRender for object语法简介
2014/10/31 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
Python标准异常和异常处理详解
2015/02/02 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
python中安装django模块的方法
2020/03/12 Python
什么是Python中的顺序表
2020/06/02 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
python合并多个excel文件的示例
2020/09/23 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
如何一键升级Python所有包
2020/11/05 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
应届大学生求职的自我评价
2013/11/17 职场文书
建筑文秘专业个人求职信范文
2013/12/28 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2016春节家属慰问信
2015/03/25 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
httpclient调用远程接口的方法
2022/08/14 Java/Android