如果你真正想学习如何与其他应用程序交互,那么这可能不是最好的选择。网络浏览器很混乱,时间安排将是不可预测的等等。因此,你承担了一项非常艰巨的任务,如果你按照通常的方式(直接与服务器通信、直接创建文本文件等),而不接触任何其他程序,这将非常容易。
但是,如果你确实想要与其他应用程序交互,有许多不同的方法可供选择,适当的方法取决于你需要处理哪些应用程序。
有些应用程序是设计成可以从外部自动化的。在Windows上,这几乎总是意味着它们有一个COM接口,通常带有一个IDispatch接口,您可以使用pywin32
的COM包装器; 在Mac上,则意味着它有一个AppleEvent接口,您可以使用ScriptingBridge
或appscript
; 在其他平台上,没有通用标准。IE(但可能不包括Chrome)和Word都有这样的接口。
有些应用程序有非GUI界面-无论是您可以使用popen
驱动的命令行,还是您可以通过ctypes
加载的DLL / SO / DYLIB。或者,理想情况下,其他人已经为您编写了Python绑定。
有些应用程序除了GUI之外什么都没有,没有绕过GUI自动化的方法。您可以在低级别上进行操作,通过在Windows上使用pywin32
发送WM_消息,使用Mac上的可访问性API等方式,或者使用像pywinauto
这样的库在稍高级别上进行操作,或者可能在非常高的级别上使用selenium
或类似工具来自动化特定的应用程序。
因此,您可以使用任何工具来实现此目的,例如selenium用于Chrome和COM自动化用于Word,也可以手动编写所有WM_消息。如果这是学习练习,则需要考虑今天想要学习哪些内容。
让我们从COM自动化开始。使用pywin32
,您可以直接访问应用程序的脚本接口,而无需控制用户界面,弄清如何导航菜单和对话框等。这是编写“Word宏”的现代版本——宏可以是外部脚本,而不是在Word内部编写,它们不必使用VB编写,但它们看起来非常相似。您的脚本的最后一部分将类似于:
word = win32com.client.dispatch('Word.Application')
word.Visible = True
doc = word.Documents.Add()
doc.Selection.TypeText(my_string)
doc.SaveAs(r'C:\TestFiles\TestDoc.doc')
如果你看
Microsoft Word Scripts,你会看到很多例子。然而,你可能会注意到它们是用VBScript编写的。如果你寻找教程,它们都是为VBScript(或旧版VB)编写的。大多数应用程序的文档也是为VBScript(或VB、.NET甚至低级别的COM)编写的。我所知道的所有关于使用Python进行COM自动化的教程,例如
Quick Start to Client Side COM and Python,都是为那些已经了解COM自动化并想知道如何在Python中实现它的人编写的。微软不断更改一切的事实使得搜索变得更加困难——你怎么猜测搜索OLE自动化、ActiveX脚本、Windows Scripting House等是否与学习COM自动化有关呢?因此,我不确定该推荐什么来入门。我可以保证,一旦你学会了所有的废话,这一切看起来都像上面的例子一样简单,但我不知道如何克服最初的障碍。
无论如何,并不是每个应用程序都可以自动化。有时,即使可以自动化,描述 GUI 操作(用户在屏幕上单击的内容)比思考应用程序的对象模型更简单。"选择第三段" 在 GUI 方面很难描述,但 "选择整个文档" 很容易 - 只需按下 control-A 或转到编辑菜单并选择全部。GUI 自动化比 COM 自动化要困难得多,因为您必须向应用程序发送与 Windows 本身发送以表示您的用户操作相同的消息(例如,请参见 "
Menu Notifications"),或者更糟糕的是,制作鼠标消息,如“从左上角移动 (32, 4) 像素,单击,向下移动 16 像素,再次单击”来表示“打开文件菜单,然后单击新建”。
幸运的是,有像pywinauto
这样的工具将两种类型的GUI自动化封装起来,使其变得更加简单。而像swapy
这样的工具可以帮助您确定要发送的命令。如果您不喜欢Python,还有像AutoIt
和Actions
这样的工具,它们比使用swapy
和pywinauto
更容易上手。按照这种方式,您脚本的最后一部分可能会像这样:
word.Activate()
word.MenuSelect('File->New')
word.KeyStrokes(my_string)
word.MenuSelect('File->Save As')
word.Dialogs[-1].FindTextField('Filename').Select()
word.KeyStrokes(r'C:\TestFiles\TestDoc.doc')
word.Dialogs[-1].FindButton('OK').Click()
最后,即使有了所有这些工具,网页浏览器也很难自动化,因为每个网页都有自己的菜单、按钮等,它们不是 Windows 控件,而是 HTML。除非你想一直降到“移动鼠标 12 像素”的级别,否则很难处理这些问题。这就是
selenium
的作用——它以与
pywinauto
处理 Windows GUI 相同的方式脚本化 Web GUI。
urllib2
和BeautifulSoup
模块)。 - Matteo Italia