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 相关文章推荐
动态创建类实例代码
Oct 07 Python
python爬取网站数据保存使用的方法
Nov 20 Python
python中mechanize库的简单使用示例
Jan 10 Python
Python找出list中最常出现元素的方法
Jun 14 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
Python requests模块实例用法
Feb 11 Python
python中的数据结构比较
May 13 Python
Python实现的微信红包提醒功能示例
Aug 22 Python
pytorch中的transforms模块实例详解
Dec 31 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
python实现KNN近邻算法
Dec 30 Python
用python批量解压带密码的压缩包
May 31 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
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
python简单实现获取当前时间
2016/08/27 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
医学生职业规划范文
2014/01/05 职场文书
创先争优承诺书范文
2014/03/31 职场文书
村班子对照检查材料
2014/08/18 职场文书
2014年绿化工作总结
2014/12/09 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
工作感想范文
2015/08/07 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
MySQL数据库 安全管理
2022/05/06 MySQL