Selenium3自动化测试【34】执行JS脚本

引言

页面上的操作,有时通过Selenium是无法实现的,如滚动条、时间控件等,此时就需要借助JavaScript来完成。JavaScript是一种脚本语言,它在客户端运行,即在浏览器上运行。
WebDriver提供了一个内置方法来操作JavaScript。
driver.execute_script(self,script,args)
可以通过两种方式在浏览器中执行JavaScript。


同步视频知识与系列知识内容,可关注:【公众号】:柒哥测试;【WX】:Lee-890;【视频号】:柒哥思维


1.1 在文档根级别执行JavaScript

在这种方式下,使用JavaScript提供的方法捕获想要的元素,然后声明一些操作并使用WebDriver执行此JavaScript。
例如:

JSScript = "document.getElementsByName('input')[1].click();"
driver.execute_script(JSScript)

1.2 在元素级别执行JavaScript

在这种方式下,使用WebDriver捕获想要使用的元素,然后使用JavaScript声明一些操作,并通过将web元素作为参数传递给JavaScript来使用WebDriver执行此JavaScript。
例如:

BtnName = driver.find_element_by_xpath("//input[@name=' go']")
driver.execute_script("arguments[0].click();", BtnName)

解释:

  1. WebDriver提供的xpath方法捕获元素
    BtnName = driver.find_element_by_xpath(“//input[@name=’ go’]”)
  2. JavaScript声明并对元素执行单击操作
    arguments[0].click()
  3. execute_script() 使用的JavaScript语句作为字符串值调用方法
    driver.execute_script(“arguments[0].click();”, BtnName)~~

当有多个JS操作时,可以如下书写代码:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")

SearchName = driver.find_element_by_xpath("//input[@name='q']")
BtnName = driver.find_element_by_xpath("//input[@name='go']")
driver.execute_script("arguments[0].value='bella'; arguments[1].click(); ",SearchName,BtnName)
sleep(3)
driver.quit()

注:
JS操作中,value='bella’是给元素赋值,click()是对元素进行单击。

JS操作日期控件

日期控件在网站上是经常遇到的,如12306网站、旅游订票网站(如携程、去哪儿等)、租车网站(如神州租车等)等。

2.1 常规日期控件的操作

我们拿神州租车官网,【上门取送】下租为例,如图所示。
1.jpg
::: hljs-center

时间控件

:::

当通过send_keys给时间控件赋值时,观察到只是把时间控件打开了,并没有选择设定的日期。采用JS赋值,则可以完成对时间控件的操作,代码如下:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.zuche.com")

#通过send_keys无法操作时间控件
# driver.find_element_by_xpath('//*[@id="fromDate"]').send_keys("2020-05-26")

# JS可以实现对时间控件的操作
DateJS="document.getElementById('fromDate').value='2020-05-26'"
driver.execute_script(DateJS)

通过上面的代码,观察到给日期控件赋值,是通过JS方法改掉了输入框的value值。

2.2 Readonly日期控件的操作

有些日期控件元素包含readonly属性,要想实现给readonly属性的日期控件赋值,需要先通过JS去掉readonly属性,然后再给日期控件赋值。
以12306官网为例,如图所示,打开出发日期控件,设定出发日期。
2.jpg.png
::: hljs-center

居中

:::
时间控件
先通过WebDriver提供的send_keys()方法操作,代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.12306.cn/index/")
sleep(5)

driver.find_element_by_xpath("//*[@id='train_date']").clear()
driver.find_element_by_xpath("//*[@id='train_date']").send_keys("2020-03-20")

代码运行后,观察到运行失败,代码运行clear()方法时就出错,错误如下。

driver.find_element_by_xpath(“//*[@id=‘train_date’]”).clear()
Selenium.common.exceptions.InvalidElementStateException: Message: Element is read-only:


将代码优化为通过JS给时间控件元素赋值,代码如下:
from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.12306.cn/index/")

sleep(5)
driver.find_element_by_xpath("//*[@id='train_date']").clear()
DateJS="document.getElementById(' train_date ').value='2020-05-26'"
driver.execute_script(DateJS)

代码运行后,观察到同样是运行失败,报与使用send_keys()方法同样的错误。
通过FireFox的开发者工具,观察到,12306日期控件的属性中包含readonly属性,如图所示。
3.jpg.png
::: hljs-center

时间控件

:::

时间控件标签代码如下:

<input type="text" class="input inp-txt_select" value="2018-07-21" id="train_date" readonly="">

通过查看代码,看到该元素包含readonly属性后。需要借助JS先去掉元素的readonly属性,然后再赋值,代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.12306.cn/index/")
sleep(5)

# 去掉readonly属性
JS = 'document.getElementById("train_date").removeAttribute("readonly")'
driver.execute_script(JS)

# 去掉readonly属性,通过clear,send_keys可正确运行
driver.find_element_by_xpath("//*[@id='train_date']").clear()
driver.find_element_by_xpath("//*[@id='train_date']").send_keys("2020-03-20")

运行代码后,可观察到成功给日期控件赋值。
上面的代码,也可通过JS方法改掉了输入框的value值,给日期控件直接赋值,代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("https://www.12306.cn/index/")
sleep(5)

# 去掉readonly属性
JS = 'document.getElementById("train_date").removeAttribute("readonly")'
driver.execute_script(JS)

# 去掉readonly属性,通过send_keys可正确运行
# driver.find_element_by_xpath("//*[@id='train_date']").clear()
# driver.find_element_by_xpath("//*[@id='train_date']").send_keys("2020-03-20")
# 去掉readonly属性,借助JS赋值,可正确运行
driver.find_element_by_xpath("//*[@id='train_date']").clear()
DateJS="document.getElementById('train_date').value='2020-05-26'"
driver.execute_script(DateJS)

如果你觉的文章读的不过瘾,可以查看详细的视频教程。

【2021】UI自动化测试:Selenium3自动化测试
https://edu.51cto.com/course/26488.html

【测试全系列视频课程】请点击我哦…
( https://edu.51cto.com/lecturer/968349.html)

学习路线如下

微信图片_20210816100905.png微信图片_202108161009051.png微信图片_202108161009052.png
软件测试技能体系.jpg

图书京东、当当有售
京东: https://item.jd.com/12784287.html
当当: http://product.dangdang.com/29177828.html

0.9733767060093851.png

同步视频知识与系列知识内容,可关注:【公众号】:柒哥测试;【WX】:Lee-890;【视频号】:柒哥思维


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、linux 1,linux常用命令 2,某个时间段日志的查询 3,linux文件的上传和下载 二、功能测试 1,工作中所遇到的错误 2,测试流程: 3,测试计划元素: 4,测试报告元素: 5,测试点: 6,测试方法: 7,bug相关问题 8,adb常用命令 9,软件测试原则 10,测试用例编写的要素 11,测试用例的设计原则 12,软件产品质量特性 13,android四大组件 14,web测试和app测试的区别 15,app的anr的根本原因 16,app的crash的原因 17,h5页面图片未加载出来问题排查 18,区分原生和h5页面 19,为什么不能用jenkins打包 三、性能测试 1,了解jmeter 2,性能指标 3,如何做性能测试 四、接口测试 1,如何设计接口测试用例 2,为什么要做接口测试 3,接口测试的关注点 4,request处理cookie的三种方式 五、自动化测试 1,自动化核心框架 2,自动化测试的好处 3,自动化的前提 4,自动化测试的场景 5,元素定位的8种方式 6,如果一个元素无法定位,一般会考虑哪些原因 7,driver.close()和driver.quit()的区别 8,自动化脚本断言 9,判断页面元素是否存在 10,js在web自动化中的作用展示 11,自动化代码优化 12,selenium对比RF 13,自动化测试脚本三种等待 14,PO模式 六、HTTP协议 1,HTTP协议特点: 2,HTTP传输原理 3,get和post的区别 4,HTTP响应代码 5,osi七层模型 6,三次握手过程 7,session和cookie的区别 8,tcp和udp的区别 9,sockect通信原理 10,post的三种请求方式 七、数据库 1,sql分类 2,数据库事务特性:ACID 3,mysql索引的类型 4,池化思想 5,redis 6,如何提高数据库运行效率 八、java 1,面向对象的三个特征 2,重写和重载 3,比较sping,sping mvc 4,进程和线程的区别 5,java三层架构 6,处理异常 九、python 1,字符串反转的7种方法 2,new 和 _init_ 3,不使用中间变量交换两个变量的值 4,python四大内置高阶函数 5,python带颜色输出 6,python *args,**kargs用法 7,python常用模块 8,python多线程 9,python发送邮件 10,python操作图像 11,python的replace()方法的使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo_Eagle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值