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