Python selenium巧用Javascript脚本注入解决按钮点选问题
前段时间,笔者忙于应付公司组织的雅思考试,白天、晚上但凡有空,笔者都是埋头伏案,啃剑桥雅思(剑4~剑12)的官方模拟题或者做着与雅思考试相关的准备工作,这个过程持续了40余天。最近总算鼓起勇气走进考场,跟那些尚未毕业、怀揣出国梦想的小年轻同场竞争,虽然结果还未出来,但是至少短时间不用再高强度复习英语了,笔者工作重心得以回归到Python +Selenium的自动化中。
言归正传,笔者这次准备利用JavaScript来修改页面节点的属性,方便selenium传参。具体案例是这样的:
下图所示的页面中需要输入日期:

这是一个Bootstrap框架生成的模态窗,“开始时间”和“结束时间”对应的input按钮,它的html文本:<input value="" name="startDateSel" type="text" class="form-control" readonly="readonly">,这个readonly属性决定了,用户无法直接输入日期参数(网站考虑的是:用户输入的日期格式不规范,导致无法检索,故以这种方式控制输入),需要通过鼠标点选年月日来生成最后的日期。


具体操作见下图笔者录制的GIF动画:

如果出现“年、月、日”都要选择非默认值,则点选的操作略复杂,其易用性极端情况下不如手输;
当然,python+selenium完全可以操作这些“年、月、日、确定按钮”页面元素,比如,“月份”的html标签代码长这样:
<td colspan="7">
<span class="month">一</span>
<span class="month">二</span>
<span class="month">三</span>
<span class="month">四</span>
<span class="month">五</span>
<span class="month">六</span>
<span class="month">七</span>
<span class="month active">八</span>
<span class="month">九</span>
<span class="month">十</span>
<span class="month">十一</span>
<span class="month">十二</span>
</td>
年份的代码长这样:
<td colspan="7">
<span class="year old">2009</span>
<span class="year">2010</span>
<span class="year">2011</span>
<span class="year">2012</span>
<span class="year">2013</span>
<span class="year">2014</span>
<span class="year">2015</span>
<span class="year">2016</span>
<span class="year">2017</span>
<span class="year active">2018</span>
<span class="year">2019</span>
<span class="year old">2020</span>
</td>
不过,通过selenium模拟鼠标实现“点点点”,步骤略繁琐,执行效率低。笔者建议通过js修改html表情的readonly属性为false,达到input元素可编辑的状态。通过网页F12进入开发者模式,在控制台中编写JS脚本,通过querySelectorAll方法遍历input元素,删除特定节点属性(attribute)方法如下:
var rs = document.querySelectorAll("input[readonly='readonly']");
for(var i = 0; i < rs.length; i++)
{
rs[i].readOnly = false;
}
这段代码想要在python selenium中运行很简单,只用把这段js脚本当成字符串载入就可以了,唯一需要注意的是,上面的js脚本中已经有了单引号、双引号,所以,必须使用三引号""" """模式将这段文本括起来,具体代码如下:
js="""var rs = document.querySelectorAll("input[readonly='readonly']");for(var i = 0; i < rs.length; i++){rs[i].readOnly = false;}"""
driver.execute_script(js)
执行完代码后,可以看到光标可以正常在input框内闪烁,可以手动写入日期:

后面可以通过js的方法直接对input元素赋值,也可以先定位元素,然后用经典的send_keys()方法,根据实际情况任选一种方法即可,非常方便!
driver.find_element_by_name("startDateSel").send_keys("2018-09-01")
driver.find_element_by_name("endDateSel").send_keys("2018-11-09")
driver.find_element_by_css_selector("button.btn.btn-primary").click() #点击确定
Python selenium巧用Javascript脚本注入解决按钮点选问题的更多相关文章
- Python+selenium第一个自动化脚本
第一个自动化脚本(用Python写的) from selenium import webdriver #从selenium导入webdriber driver=webdriber.Firefox() ...
- Python+selenium之调用JavaScript
webdriver提供了操作浏览器的前进和后退的方法,但是对于浏览器公东条并没有提供相应的操作方法.于是就需要借助JavaScript来控制浏览器的滚动条.webdriver提供了execute_sr ...
- Python+Selenium+PhantomJS下载JavaScript异步加载网页
# -*- coding: utf-8 -*- from selenium import webdriver import selenium.webdriver.support.ui as ui fr ...
- python selenium第一个WebDriver脚本
#coding=utf-8from selenium import webdriverimport timeimport osos.environ["webdriver.firefox.dr ...
- Python+Selenium框架unittest执行脚本方法之discover()方法
继续接着介绍,如何利用unittest管理和执行测试用例的问题,这里我们还是利用之前已经有的三条测试用例,如果你跳过了前面文章,请回到框架设计篇的第八篇和第七篇,里面有相关测试类的文件.本文来介绍,如 ...
- Python+Selenium框架-unittest执行脚本方法之addTest
本文开始介绍如何通过unittest来管理和执行测试用例,这一篇介绍unittest下addTest()方法来加载测试用例到测试套件中去.为了演示效果,我在前面文章的脚本基础上,新建了一个测试脚本,这 ...
- Selenium执行JavaScript脚本
JavaScript是运行在客户端(浏览器)和服务器端的脚本语言,允许将静态网页转换为交互式网页.可以通过 Python Selenium WebDriver 执行 JavaScript 语句,在We ...
- 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...
- 【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第四篇博 ...
随机推荐
- RxPermissions Usage
refs:https://github.com/tbruyelle/RxPermissions https://www.jianshu.com/p/c3546e5cd2ffhttps://www.ji ...
- matplotlib figure图像-【老鱼学matplotlib】
如果我们想要显示多个图像,有点类似多窗口显示图像这个概念,则就会用到plt.figure() 直接上例子: import numpy as np import pandas as pd import ...
- C#使用CefSharp碰到的坑(一)
使用CEFSharp做模拟提交的话,在高版本下会出现一个神奇的错误: 如果站点使用的是阿里提供的验证控件的话,就是那种拖动条的,如果是使用CEFSharp的新版本的(目前我是测试过70的) ,会出现拖 ...
- 观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别
观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别 在翻阅资料的时候,有人把观察者(Observer)模式等同于发布(Publish)/订阅(Subscribe ...
- vscode断点调试工程化客户端文件
一.调试webpack配置文件 launch.json的配置如下,在webpack.dev.config.js文件中设置断点,开始调试. { "version": "0. ...
- Django——发送邮件
Django--发送邮件 在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现. Django中提供了邮件接口,使我们可以快捷的建设一个邮件发送系统. 以下是一个简单实例: se ...
- 20181115 python-第一章学习小结part1
知识点回顾: 什么是编程: 写代码,让计算机执行任务 编程语言的分类与特性: 1.机器语言,即二进制语言,最帖近于机器底层,可以由计算机直接执行,故速度最快,但不适合开发. 2.汇编语言,直接将二进制 ...
- EasyUI 分页 偶遇 问题
当 存在大量 重复 数据字段的 时候 entity.AsNoTracking().ToList().Skip((page.pageNumber - 1) * page.rows).Take(page. ...
- ECMA Script 6_函数的扩展
ES6规定只要函数参数使用了默认值.解构赋值.或者扩展运算符, 那么函数内部就不能显式设定为严格模式,否则会报错 1. 参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面 函数 ...
- 10_常见的get和post请求_路由器_ejs服务器渲染模板引擎
1. 常见的 get 和 post 请求有哪些? 常见的发送 get 请求方式: 在浏览器地址栏输入 url 地址访问 所有的标签默认发送的是 get 请求:如 script link img a f ...