【发布时间】:2017-10-07 20:44:38
【问题描述】:
我正在尝试使用 pywinauto 和 Python 3.6 自动化一个简单的应用程序。该应用程序有一个像这样的 Windows“打开”对话框,我想单击“取消”按钮:
我使用 SWAPY 来获取按钮的 class_name 和 control_id 属性。
现在的问题是,当我使用这些参数调用 find_element() 方法时,它会引发 ElementNotFoundError。这是我的代码:
cancel_button = pywinauto.findwindows.find_element(class_name="button", control_id=2)
我尝试过(class_name="button", control_id="2")、(class_name="Button", control_id=2),但它们都给出了相同的错误。我尝试在此对话框中找到的任何其他元素都会出现同样的问题。
那么我该如何使用从 SWAPY 读取的属性呢?我没有发现官方的 pywinauto 文档很有用。很多事情都没有解释清楚。
编辑:我决定不使用 find_elements 方法,而是使用 find_windows() 来获取打开对话框的句柄。
w_open_handle = pywinauto.findwindows.find_windows(title=u'Open', class_name='#32770')[0]
然后我使用这个句柄得到一个 WindowSpecification 对象:
w_open = app.window_(handle=w_open_handle)
然后我打电话:
w_open['Cancel'].click()
这行得通。现在我想在“文件名:”编辑框中输入一个文件名,然后单击打开按钮打开该文件。所以我这样做:
w_open['File name:'].type_keys("abc.txt")
这行得通。我使用 print_control_identifiers() 打印出控件标识符,并获得了“打开”按钮的名称。所以使用 draw_outline() 我在它外面画了一个边界,它显示了正确的按钮。
w_open['SplitButton6'].draw_outline()
但是在 'SplitButton6' 上调用 .click() 方法会引发 WindowSpecification 类没有 'click' 方法 错误。知道是什么原因造成的吗?该错误似乎具有误导性,因为 WindowSpec 类确实具有 .click 方法。
【问题讨论】:
-
Getting Started Guide 应该解释很多。
-
正如我所说,官方指南并没有解释这些事情。
-
但它解释了您应该使用更高级别的东西来获得更好的生产力。有关详细信息,请参阅我的答案。
-
文档中描述了
top_level_only的证明链接:pywinauto.readthedocs.io/en/latest/code/…