如果您真正正在寻找的是一个自学如何与其他应用程序交互的好借口,那么这可能不是最好的。 Web 浏览器很混乱,时间安排难以预测,等等。因此,您承担了一项非常艰巨的任务,而如果您按照通常的方式(直接与服务器对话,创建直接文本文件等,所有这些都无需接触任何其他程序)。
但是,如果您确实想与其他应用程序交互,有多种不同的方法,哪种方法合适取决于您需要处理的应用程序类型。
有些应用程序被设计为从外部自动化。在 Windows 上,这几乎总是意味着它们是 COM 接口,通常带有 IDispatch 接口,您可以使用pywin32
的 COM 包装器;在 Mac 上,它意味着 AppleEvent 接口,您可以使用它ScriptingBridge
or appscript
;在其他平台上没有通用标准。 IE(但可能不是 Chrome)和 Word 都有这样的界面。
某些应用程序具有非 GUI 界面 - 无论是您可以使用的命令行popen
,或者您可以通过加载的 DLL/SO/DYLIBctypes
。或者,理想情况下,其他人已经为您编写了 Python 绑定。
有些应用程序除了 GUI 之外什么都没有,而且没有办法绕过 GUI 自动化。您可以通过制作 WM_ 消息以通过以下方式发送来在较低级别上执行此操作pywin32
在 Windows 上,在 Mac 等上使用可访问性 API,或者在更高级别上使用诸如pywinauto
,或者可能处于非常高的水平selenium
或用于自动化特定应用程序的类似工具。
因此,您可以使用任何东西来完成此操作,从用于 Chrome 的 selenium 和用于 Word 的 COM 自动化,到自己制作所有 WM_ 消息。如果这是一次学习练习,那么问题是您今天想学习哪些内容。
让我们从 COM 自动化开始。使用pywin32,您可以直接访问应用程序自己的脚本接口,而不必从用户那里控制 GUI,弄清楚如何导航菜单和对话框等。这是编写“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')
如果你看微软Word脚本,你可以看到一堆例子。但是,您可能会注意到它们是用 VBScript 编写的。如果您四处寻找教程,它们都是为 VBScript(或更旧的 VB)编写的。大多数应用程序的文档都是针对 VBScript(或 VB、.NET,甚至低级 COM)编写的。我所知道的所有关于使用 Python 中的 COM 自动化的教程,例如客户端 COM 和 Python 快速入门,是为那些已经了解 COM 自动化并且只是想知道如何从 Python 中执行此操作的人编写的。事实上,Microsoft 不断更改所有内容的名称,这使得搜索变得更加困难 — 您怎么认为在 Google 上搜索 OLE 自动化、ActiveX 脚本、Windows Scripting House 等与了解 COM 自动化有什么关系呢?所以,我不确定应该推荐什么来开始。我可以保证,一旦你学会了所有的废话,这一切就像上面的例子看起来一样简单,但我不知道如何克服最初的障碍。
无论如何,并不是每个应用程序都是自动化的。有时,即使是这样,描述 GUI 操作(用户在屏幕上单击的内容)也比根据应用程序的对象模型进行思考要简单。 “选择第三段”很难用 GUI 术语来描述,但“选择整个文档”很容易 - 只需按下 Control-A,或者转到“编辑”菜单并选择全部。 GUI 自动化比 COM 自动化困难得多,因为您必须向应用程序发送 Windows 本身发送的相同消息来表示您的用户操作(例如,请参阅“菜单通知”)或者更糟糕的是,制作鼠标消息,例如“从左上角开始 (32, 4) 像素,单击,鼠标向下移动 16 像素,再次单击”来表示“打开文件菜单,然后单击新建”。
幸运的是,有类似的工具pywinauto它将两种 GUI 自动化的东西包装起来,使其变得更加简单。还有像这样的工具swapy这可以帮助您找出要发送的命令。如果您不熟悉 Python,还有一些工具,例如AutoIt and Actions比使用更容易swapy
and 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()
最后,即使使用所有这些工具,Web 浏览器也很难实现自动化,因为每个网页都有自己的菜单、按钮等,这些菜单、按钮等不是 Windows 控件,而是 HTML。除非你想一直下降到“将鼠标移动12像素”的级别,否则很难处理这些。那就是那里selenium
进来 - 它编写 Web GUI 的方式与pywinauto
编写 Windows GUI 脚本。