Python3+Selenium+Chrome实现自动填写WPS表单


Posted in Python onFebruary 12, 2020

引言

  本文通过python3、第三方python库Selenium和谷歌浏览器Chrome,完成WPS表单的自动填写。

开发环境配置

  python3的安装:略,网上都有教程。

  Selenium的安装:在命令行输入pip3 install selenium并回车即可完成安装,如果不成功,查找网上教程。

  Chrome的安装:略,网上都有教程。

  因为Selenium需要ChromeDriver来驱动Chrome,所以还需要下载驱动ChromeDriver。下面重点介绍一下ChromeDriver的安装(如不太清楚,查找网上教程):

  1.确定谷歌浏览器的版本号:首先打开谷歌浏览器,点击右上角竖着的三个点—帮助—关于Google Chrome,可以看到谷歌浏览器的版本号。

  2.下载ChromeDriver:从ChromeDriver镜像站里找到谷歌浏览器版本号对应的文件夹并打开,从中找到对应的系统后下载。 

 3.配置:将压缩包解压后得到可执行文件,将其配置到环境变量Path下,Windows可以直接放到Python的Scripts目录下(因为该目录一般都在环境变量里)。

  4.验证:在命令行输入chromeDriver并回车,如果不报错,即完成安装。   也可以采用火狐浏览器(也需要额外下载相应驱动)和PhantomJS浏览器引擎(不需要额外下载相应驱动,但是无可视化界面)。

  完成以上步骤即可进行代码编写。

编写代码

  这个是测试用的WPS表单。

Python3+Selenium+Chrome实现自动填写WPS表单

  如上图,我们先分析一下这个表单:

  这个表单已经列举出大部分WPS表单问题形式:

  1.像问题1和3这种需要输入文字或者数字的都属于INPUT组件。我们用如下代码操作这种组件。其中?要修改为N-1,表示第N个问题,比如问题1的话,input_?应该改为input_0;问题3的话,input_?应该改为input_2'XXX'应改改为自己的内容,即文字或者数字。

answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_?_!')))
answer.click()

  2.像问题2、4和6(其中问题6后面再说)这种不需要输入只需要一次选择的都属于LABEL组件(本来应该是单选和多选组件,但是WPS表单是用Label组件实现的)。我们用如下代码操作这种组件。其中?要修改为N-1,表示第N个问题,用法同上;'!'也要修改为N-1,表示第N个选项,比如问题2要选中第1个选项的话,select_label_wrap_?_!应改为select_label_wrap_1_0;要选中第2个选项的话,select_label_wrap_?_!应改为select_label_wrap_1_1

answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_?_!')))
answer.click()

  对于问题6,虽然其组件也属于LABEL组件,但涉及到填写时间,所以利用time库来获取当前时间,与选项作比较后赋值给t,从而选中第t+1个选项。其中?要修改为N-1,表示第N个问题,用法同上。

localtime = time.localtime(time.time())
if localtime.tm_hour < 7:
	t = 0
	print("填写时间为:0700-0900")
elif localtime.tm_hour < 11:
	t = 1
	print("填写时间为:1100-1200")
else:
	t = 2
	print("填写时间为:1800-2000")
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_?_' + str(t))))
answer.click()

  3.像问题5这种需要多次点击选择的都属于PICKER组件。这种PICKER组件只能针对性的编写代码,好在一般表单只有一个日期PICKER控件。我们用如下代码操作这种组件。这个不需要修改,但是如果有两个日期PICKER控件,还要视情况修改,应该没有这么变态的表单。

answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-picker')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-today-btn')))
answer.click()

  因此,图示表单应该用以下代码进行自动填写,运行后会弹出Chrome浏览器窗口,打开对应WPS表单网页,自动填入内容,等待10s秒(方便检查或者反悔,反悔的话关闭网页即可)后,自动确认完成填写,最后命令行输出Perfect!(只有命令行输出Perfect!或者网页显示表单填写成功才表示自动填写成功)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# WPS表单的网址
url = 'https://f.wps.cn/form-write/uwDUPB2N/'
# 完成浏览器对象的初始化,设定超时时间为10秒。
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get(url)

################################
# 针对INPUT组件,XXX替换成自己的内容。
answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_0')))
answer.send_keys('XXX')
# 针对LABEL组件。
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_1_0')))
answer.click()
# 针对INPUT组件,XXX替换成自己的内容。
answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_2')))
answer.send_keys('18')
# 针对LABEL组件。
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_3_0')))
answer.click()
# 针对PICKER组件。
answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-picker')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-today-btn')))
answer.click()
# 针对询问时间的INPUT组件。
localtime = time.localtime(time.time())
if localtime.tm_hour < 7:
	t = 0
	print("填写时间为:0700-0900")
elif localtime.tm_hour < 11:
	t = 1
	print("填写时间为:1100-1200")
else:
	t = 2
	print("填写时间为:1800-2000")
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_5_' + str(t))))
answer.click()
################################

# 等待10秒
time.sleep(10)
# 点击提交
commit = wait.until(EC.element_to_be_clickable((By.ID, 'submit_button')))
commit.click()
# 确认提交
yes = wait.until(EC.element_to_be_clickable((By.ID, 'bind_phone_modal_confirm_button')))
yes.click()
# 反馈成功
print('Perfect!')

  类似WPS表单,只需要修改网址url和32个#之间的内容即可。

  建议将time.sleep()中的值调大一些,这样还可以留出足够的时间让自己检查一下,也可以把以下代码删掉,这样的话,只会自动填写,不会自动确认。

# 点击提交
commit = wait.until(EC.element_to_be_clickable((By.ID, 'submit_button')))
commit.click()
# 确认提交
yes = wait.until(EC.element_to_be_clickable((By.ID, 'bind_phone_modal_confirm_button')))
yes.click()

  这里再给一份针对某表单的代码,仅供参考学习交流,谨记若表单变动,代码也要变动:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
url = '填入WPS表单的网址'
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get(url)
answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_0')))
answer.send_keys('XXX')
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_1_1')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_2_0')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_3_0')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-picker')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.ant-calendar-today-btn')))
answer.click()
localtime = time.localtime(time.time())
if localtime.tm_hour < 7:
	t = 0
	print("填写时间为:0700-0900")
elif localtime.tm_hour < 11:
	t = 1
	print("填写时间为:1100-1200")
else:
	t = 2
	print("填写时间为:1800-2000")
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_5_' + str(t))))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'input_6')))
answer.send_keys('36.6')
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_7_0')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_8_0')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_9_0')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_10_1')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_11_0')))
answer.click()
answer = wait.until(EC.element_to_be_clickable((By.ID, 'select_label_wrap_12_0')))
answer.click()
time.sleep(5)
commit = wait.until(EC.element_to_be_clickable((By.ID, 'submit_button')))
commit.click()
yes = wait.until(EC.element_to_be_clickable((By.ID, 'bind_phone_modal_confirm_button')))
yes.click()
print('Perfect!')

总结

以上所述是小编给大家介绍的Python3+Selenium+Chrome自动填写WPS表单,希望对大家有所帮助!

尾言

  最后,祝福武汉早日康复,武汉加油!

Python 相关文章推荐
python自动化工具日志查询分析脚本代码实现
Nov 26 Python
一个计算身份证号码校验位的Python小程序
Aug 15 Python
Python标准库内置函数complex介绍
Nov 25 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
python利用sklearn包编写决策树源代码
Dec 21 Python
python正则实现提取电话功能
Feb 24 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
python中24小时制转换为12小时制的方法
Jun 18 Python
pytorch中使用cuda扩展的实现示例
Feb 12 #Python
pycharm内无法import已安装的模块问题解决
Feb 12 #Python
PyTorch笔记之scatter()函数的使用
Feb 12 #Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 #Python
pycharm无法导入本地模块的解决方式
Feb 12 #Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 #Python
解决pycharm同一目录下无法import其他文件
Feb 12 #Python
You might like
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
PHP Class&amp;Object -- 解析PHP实现二叉树
2013/06/25 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
PHP中Array相关函数简介
2016/07/03 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
js电信网通双线自动选择技巧
2008/11/18 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
JavaScript类的写法
2016/09/17 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
Vue官网todoMVC示例代码
2018/01/29 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
python中from module import * 的一个坑
2014/07/20 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
一些PHP的面试题
2015/05/06 面试题
运动会解说词200字
2014/02/06 职场文书
保险内勤岗位职责
2014/04/05 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
2014年采购员工作总结
2014/11/18 职场文书
七一慰问简报
2015/07/20 职场文书
感恩教师节主题班会
2015/08/12 职场文书
把77A收信机改造成收音机
2022/04/05 无线电
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js