18.11 项目:自动填表程序
在所有无聊的任务中,填表是最烦人的。到了现在,在最后一章的项目中,你
将搞定它。假设你在电子表格中有大量的数据,必须重复将它输入到另一个应用的表单界面中,没有实习生帮你完成。尽管有些应用有导入功能,让你上传包含信息的电子表格,但有时候似乎没有其他方法,只好不动脑子地点击
和输入几个小时。读到了本书的这一章,你“当然”知道会有其他方法。
本项目的表单是 Google Docs 表单,你可以在 http://nostarch.com/automatestuff
找到,如图 18-4 所示。
总的来说,你的程序应该做到:
• 点击表单的第一个文本字段。
• 遍历表单,在每个输入栏键入信息
• 点击Submit 按钮。
• 用下一组数据重复这个过程。这意味着代码需要做下列事情:
• 调用pyautogui.click() 函数,点击表单和 Submit 按钮。
• 调用pyautogui.typewrite() 函数,在输入栏输入文本。
• 处理 KeyboardInterrupt 异常,这样用户能按 Ctrl-C 键退出。打开一个新的文件编辑器窗口,将它保存为 formFiller.py。
第 1 步:弄清楚步骤
在编写代码之前,你需要弄清楚填写一次表格时,需要的准确击键和鼠标点击。
18.4 节中的 mouseNow.py 脚本可以帮助你弄清楚确切的鼠标坐标。你只需要知道第一个文本输入栏的坐标。在点击第一个输入栏之后,你可以Tab
键,将焦点移到下一个输入栏。这让你不必弄清楚每一个输入栏的 x、y 坐标。
下面是在表单中输入数据的步骤:
1.点击 Name 输入栏(在将浏览器窗口最大化后,用 mouseNow.py 程序来确定坐标。在 OS X 上,可能需要点击两次:一次让浏览器获得焦点,第二次让 Name输入栏获得焦点)。
2.键入名称,然后按 Tab 键。
3.键入最大的恐惧(greatest fear),然后按 Tab 键。
4.按向下键适当的次数,选择魔力源(wizard power source):一次是 Wand,两次是 Amulet,三次是 Crystal ball,四次是 money。然后按 Tab
键(请注意,在 OS X中,你必须为每次选择多按一次向下键。对于某些浏览器,你也需要按回车键)。
5.按向右键,选择 RoboCop 问题的答案。按一次是 2,两次是 3,三次是 4,四次是 5,或按空格键选择 1(它是默认加亮的)。然后按 Tab 键。
6.键入附加的备注,然后按 Tab 键。
7.按回车键,点击“Submit”按钮。
8.在提交表单后,浏览器将转到一个页面。然后你需要点击一个链接,返回到表单页面。
请注意,如果你稍后再次运行这个程序,可能需要更新鼠标点击的坐标,因为浏览器窗口可能已经改变了位置。要避免这一点,请一直确保浏览器窗口最大化,然后再寻找第一个表单输入框的坐标。而且,不同操作系统上的不同
浏览器,工作起来可能与这里的步骤稍有不同,所以在运行程序之前,要确保这些击键组合适合你的计算机。
第 2 步:建立坐标
在浏览器中载入示例表单(图 18-4),并将浏览器窗口最大化。打开一个新的终端窗口或命令行窗口,来运行 mouseNow.py 脚本,然后将鼠标放在输入框上,弄清楚它的 x、y
坐标。这些数字将赋给程序中的变量。同时,找出蓝色Submit 按钮的 x、y 坐标和 RBG 值。这些值将分别赋给变量 submitButton 和 submitButtonColor。
接下来,在表单中填入一些假的数据,点击Submit。你需要看到下一个页面的样子,
以便使用程序mouseNow.py 寻找这个页面中Submit another response 链接的坐标。
让你的源代码看起来像下面的样子。确保用自己测试得到的坐标代替斜体的值:
#! python3
# formFiller.py - Automatically fills in the form. import pyautogui, time
# Set these to the correct coordinates for your computer. nameField = (648, 319)
submitButton = (651, 817)
submitButtonColor = (75, 141, 249)
submitAnotherLink = (760, 224)
# TODO: Give the user a chance to kill the script. # TODO: Wait until the form page
has loaded.
# TODO: Fill out the Name Field.
# TODO: Fill out the Greatest Fear(s) field.
# TODO: Fill out the Source of Wizard Powers field. # TODO: Fill out the RoboCop
field.
# TODO: Fill out the Additional Comments field.
# TODO: Click Submit.
# TODO: Wait until form page has loaded.
# TODO: Click the Submit another response link.
现在你需要实际想要输入这张表格的数据。在真实世界中,这些数据可能来自电子表格、纯文本文件或某个网站。可能需要额外的代码,将数据加载到程序中。但对于这个项目,只需要将这些数据硬编码给一个变量。在程序中加
入以下代码:
#! python3
# formFiller.py - Automatically fills in the form.
--snip--
formData = [{'name': 'Alice', 'fear': 'eavesdroppers', 'source': 'wand', 'robocop': 4,
'comments': 'Tell Bob I said hi.'},
{'name': 'Bob', 'fear': 'bees', 'source': 'amulet', 'robocop': 4, 'comments': 'n/a'},
{'name': 'Carol', 'fear': 'puppets', 'source': 'crystal ball', 'robocop': 1, 'comments':
'Please take the puppets out of the break room.'},
{'name': 'Alex Murphy', 'fear': 'ED-209', 'source': 'money', 'robocop': 5, 'comments':
'Protect the innocent. Serve the public trust. Uphold the law.'},
]
--snip--
formData 列表包含 4 个字典,针对 4 个不同的名字。每个字典都有文本字段的
名字作为键,响应作为值。最后一点准备是设置 pyautogui 的 PAUSE 变量,在每次函数调用后等待半秒钟。在程序的 formData 赋值语句后,添加下面的代码:
pyautogui.PAUSE = 0.5
第 3 步:开始键入数据
for 循环将迭代 formData 列表中的每个字典,将字典中的值传递给 pyautogui
函数,最后在文本输入区输入。在程序中添加以下代码:
#! python3
# formFiller.py - Automatically fills in the form.
--snip--
for person in formData:
# Give the user a chance to kill the script.
print('>>> 5 SECOND PAUSE TO LET USER PRESS CTRL-C <<<')
➊ time.sleep(5)
# Wait until the form page has loaded.
➋ while not pyautogui.pixelMatchesColor(submitButton[0], submitButton[1],
submitButtonColor):
time.sleep(0.5)
--snip--
作为一个小的安全功能,该脚本有 5 秒暂停➊。如果发现程序在做一些预期之外的事, 这让用户有机会按 Ctrl-C ( 或将鼠标移到屏幕的左上角, 触发
FailSafeException 异常),从而关闭程序。然后程序等待,直到 Submit 按钮的颜色可见➋,这让程序知道,表单页面已经加载了。回忆一下,你在第 2
步中已经弄清楚了坐标和颜色信息,并将它们保存在submitButton 和submitButtonColor 变量中。要调用 pixelMatchesColor(),就传递坐标
submitButton[0] 和 submitButton[1],以及颜色 submitButtonColor。
在等待 Submit 按钮颜色可见的代码之后,添加以下代码:
#! python3
# formFiller.py - Automatically fills in the form.
--snip--
➊ print('Entering %s info...' % (person['name']))
➋ pyautogui.click(nameField[0], nameField[1])
# Fill out the Name field.
➌ pyautogui.typewrite(person['name'] + '\t')
# Fill out the Greatest Fear(s) field.
➍ pyautogui.typewrite(person['fear'] + '\t')
--snip--
我们添加了偶尔的 print() 调用,在终端窗口中显示程序的状态,让用户知道进展。➊
既然程序知道表格已经加载,就可以调用 click(),点击 Name 输入框➋,并调用 typewrite(),输入 person['name']
中的字符串➌。字符串末尾加上了 '\t' 字符,模拟
按下Tab 键,它将输入焦点转向下一个输入框,Greatest Fea(r s)。另一次typewrite() 调
用,将在这个输入框中输入 person['fear'] 中的字符串,然后用 Tab 跳到表格的下一个输入框➍。
第 4 步:处理选择列表和单选按钮
“wizard powers”问题的下拉菜单和RoboCop 字段的单选按钮,处理起来比文本输入框需要更多技巧。要用鼠标点选这些选项,你必须搞清楚每个可能选项的 x、 y
坐标。然而,用箭头键来选择会比较容易。
在程序中加入以下代码:
#! python3
# formFiller.py - Automatically fills in the form.
--snip--
# Fill out the Source of Wizard Powers field.
➊ if person['source'] == 'wand':
➋ pyautogui.typewrite(['down', '\t']) elif person['source'] ==
'amulet':
pyautogui.typewrite(['down', 'down', '\t']) elif person['source'] == 'crystal ball':
pyautogui.typewrite(['down', 'down', 'down', '\t']) elif person['source'] == 'money':
pyautogui.typewrite(['down', 'down', 'down', 'down', '\t'])
# Fill out the RoboCop field.
➌ if person['robocop'] == 1:
➍ pyautogui.typewrite([' ', '\t']) elif person['robocop'] ==
2:
pyautogui.typewrite(['right', '\t']) elif person['robocop'] == 3:
pyautogui.typewrite(['right', 'right', '\t']) elif person['robocop'] == 4:
pyautogui.typewrite(['right', 'right', 'right', '\t']) elif person['robocop'] == 5:
pyautogui.typewrite(['right', 'right', 'right', 'right', '\t'])
--snip--
在下拉菜单获得焦点后(回忆一下,你写了代码,在填充 Greatest Fear(s)输入框后模拟了按 Tab 键),按下向下箭头,就会移动到选择列表的下一项。根据 person['source']
中的值,你的程序应该发出几次向下按键,然后再切换到下一个输入区。如果这个用户词典中的 'source' 值是 'wand' ➊,我们模拟按向下键一次(选择 Wand),并按
Tab 键➋。如果 'source' 键的值是 'amulet',模拟按向下键两次,并按
Tab 键。对其他可能的值也是类似。
RoboCop 问题的单选按钮,可以用向右键来选择。或者,如果你想选择第一个选项➌,就按空格键➍。
第 5 步:提交表单并等待
可以用函数 typewrite() 填写备注输入框,将 person['comments'] 作为参数。你可以另外输入'\t',将焦点移到下一个输入框或 Submit 按钮。当Submit
按钮获得焦点后,调用 pyautogui.press('enter'),模拟按下回车键,提交表单。在提交表单之后,程序将等待 5 秒,等下一页加载。
在新页面加载之后,它会有一个 Submit another response 链接,让浏览器转向一个新的、全空的表单页面。在第二步,你已将这个链接的坐标作为元组保存在
submitAnotherLink 中,所以将这些坐标传递给 pyautogui.click(),点击这个链接。
新的表单准备好后,脚本的外层 for 循环将继续下一次迭代,在表单中输入下一个人的信息。
添加以下代码,完成你的程序:
#! python3
# formFiller.py - Automatically fills in the form.
--snip--
# Fill out the Additional Comments field. pyautogui.typewrite(person['comments'] + '\t')
# Click Submit. pyautogui.press('enter')
# Wait until form page has loaded. print('Clicked Submit.') time.sleep(5)
# Click the Submit another response link. pyautogui.click(submitAnotherLink[0],
submitAnotherLink[1])
在主 for 循环完成后,程序应该已经插入了每个人的信息。在这个例子中,只有 4 个人要输入。但如果有 4000 个人,那么编程来完成这个任务将节省大量的输入时间。
18.11 项目:自动填表程序相关推荐
- android快速填表,Android 11将自动填表功能整合到键盘输入建议中
这一点终于在Android 11中得到了解决,你不用再为了选择你想要填写的密码或信用卡信息而到处找信用卡了. 自动填写系统通常的工作方式是,在填写密码.信用卡信息.发货信息等内容时,你必须在需要填写此 ...
- 网页复选框设置只能选一个_网页自动填表基础教程从简单开始
通常来说,网页自动填表包含单选框.复选框.文本框.多行文本框.下拉列表框的自动填写.本文讲讲这些项目的自动填写方法.所用到的工具是网页自动操作通用工具. 一.文本输入框及多行文本输入框的自动填写 下面 ...
- 基于RK3399ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录
基于RK3399&ESP8285自动售货柜项目-ESP8266(8285)程序编写与烧录 本系列文章讲详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法,从硬件连接到网络通信再 ...
- 【To Do】程序员面试金典——18.11最大子方阵
程序员面试金典--18.11最大子方阵 Solution1:我的答案.最笨的方法,时间复杂度是O(n3)O(n3)O(n^3) class SubMatrix { public:int maxSubM ...
- android微信小程序自动填表_微信小程序自动化,记录趟过的坑!
项目思想:关键字+数据驱动混合测试 基于Android-微信小程序自动化的关键是:webview的切换 对于微信App来说如何从NATIVE切换到webview的过程 测试版本信息 1.微信版本:7. ...
- 小工具开发笔记—IE自动填表器—第一篇:你好,世界
系列导航: 小工具开发笔记-IE自动填表器-第零篇:序 小工具开发笔记-IE自动填表器-第一篇:你好,世界 继上篇博文初步介绍了小工具,本文就作为开发笔记正文第一篇,来叙述一下如何使用C++开发一个完 ...
- HighNewTech:18.11.07—第五届世界互联网大会—互联网届的奥斯卡大奖—15张PPT见证15项世界互联网领先科技成果
High&NewTech:18.11.07-第五届世界互联网大会-互联网届的奥斯卡大奖-15张PPT见证15项世界互联网领先科技成果 目录 现场图片 1.马化腾:微信小程序商业模式创新 2.阎 ...
- 利用SVN的post-commit钩子实现多项目自动同步
svn的post-commit钩子脚本在每次提交(commit)之后运行,我们可以在这个脚本里实现一些比较实用的功能,比如发送邮件提醒.自动备份版本库,自动同步代码到web服务器等. 这里用post- ...
- 在打包的时候,创建应用程序池,并自动将程序assign到新创建的池中(MSI制作)
在打包的时候,创建应用程序池,并自动将程序assign到新创建的池中(MSI制作) 我在在部署ASP.net应用程序的时候,在IIS中都是创建在默认的应用池当中.我们能否在部署的时候创建自己的应用池呢 ...
最新文章
- pandas案例分析
- 计算机网络wfq,计算机网络基础试题-a卷-信科09.doc
- C++中判断在字符串中是否存在空格 以及 如何输入带空格的字符串
- 帧内16*16模式的宏块数据传输顺序
- 第五篇:路由网关(zuul) zuul路由 服务过滤 (Finchley版本)V2.0_dev
- nvm管理node版本
- python和java哪个好-现在Java和Python哪个前景更好?
- Python自然语言处理学习笔记(60):7.1 信息抽取
- 【问题解决】sql2012安装时卡在正在启动操作系统功能"NetFx3"上不动的解决办法
- cisco命令大全解释、注释
- 草图大师2021安装教程(超详细图文教程)
- ios未受信任的企业级开发者
- 10年涨7倍!纵观南京房价变迁史,看哭多少买房人!
- 用hundred造句子_冬至暖心短信问候祝福句子,冬至祝福词
- objectc:dictionary使用
- hdf heg 批量拼接_MODIS处理工具MRT已被HEG代替
- 论文阅读《Knowledge Graph Refinement: A Survey of Approaches and Evaluation Methods》
- php虚拟电话号码,虚拟号码能挡住骚扰电话垃圾短信?
- react 项目框架的搭建(一)
- 二进制视频数据常见标志位
热门文章
- 巴菲特50年投资之道
- mysql安装后目录介绍,MySQL安装后的目录结构及配置文件详解
- C/C++、OS、网络面经
- 派大星的面试题以及解决
- 如何优化WebService进行大批量数据传送(WSE3.0应用技巧)
- 对 BFC 规范(块级格式化上下文:block formatting context)的理解?
- android 输入法全屏,android 输入法不全屏
- 旅游景区|“沉浸式夜游”如何玩?深圳光语数字
- 人机交互设备(HID)
- 2023年中国石油大学(华东)生物化工考研上岸前辈备考经验