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学习笔记(一) js基本语法
Oct 25 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
Jul 31 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
Feb 26 Javascript
Jquery弹出层插件ThickBox的使用方法
Dec 09 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
javascript实现图片上传前台页面
Aug 18 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
Mar 08 Javascript
JScript实现地址选择功能
Aug 15 Javascript
小程序实现左右来回滚动字幕效果
Dec 28 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
May 07 Javascript
基于layPage插件实现两种分页方式浅析
Jul 27 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 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文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
php模板引擎技术简单实现
2016/03/15 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
动态样式类封装JS代码
2009/09/02 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
python不换行之end=与逗号的意思及用途
2017/11/21 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
施工资料员岗位职责
2014/01/06 职场文书
保安公司服务承诺书
2014/05/28 职场文书
公司活动总结范文
2014/07/01 职场文书
挂职学习心得体会
2014/09/09 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
考察邀请函范文
2015/01/31 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书