Python pywinauto find_elements()返回ElementNotFoundError

Python pywinauto find_elements()返回ElementNotFoundError,python,pywinauto,Python,Pywinauto,我正在尝试使用pywinauto和Python3.6自动化一个简单的应用程序。该应用程序有一个Windows“打开”对话框,如下所示,我想单击“取消”按钮: 我使用SWAPY获取按钮的类名称和控件id属性。 现在的问题是,当我使用这些参数调用find_element()方法时,它会引发ElementNotFoundError。这是我的密码: cancel_button = pywinauto.findwindows.find_element(class_name="button", cont

我正在尝试使用pywinauto和Python3.6自动化一个简单的应用程序。该应用程序有一个Windows“打开”对话框,如下所示,我想单击“取消”按钮:

我使用SWAPY获取按钮的类名称和控件id属性。

现在的问题是,当我使用这些参数调用find_element()方法时,它会引发ElementNotFoundError。这是我的密码:

cancel_button = pywinauto.findwindows.find_element(class_name="button", control_id=2)
我试过
(class\u name=“button”,control\u id=“2”)
(class\u name=“button”,control\u id=2)
,但它们都给出了相同的错误。我试图在此对话框中找到的任何其他元素都会出现相同的问题

那么如何使用从SWAPY读取的属性呢?我没有发现pywinauto的官方文档非常有用。它不能清楚地解释很多事情

编辑:我决定不使用find_elements方法,而是使用find_windows()来获取打开对话框的句柄

w_open_handle = pywinauto.findwindows.find_windows(title=u'Open', class_name='#32770')[0]
然后,我使用以下句柄获取WindowsSpecification对象:

w_open = app.window_(handle=w_open_handle)
然后我打电话:

w_open['Cancel'].click()
这是有效的。现在我想在“文件名:”编辑框中输入文件名,然后单击“打开”按钮打开该文件。所以我这样做:

w_open['File name:'].type_keys("abc.txt")
这很有效。我使用print_control_identifiers()打印了控件标识符,并获得了Open按钮的名称。因此,我使用draw_outline()在其外部绘制边界,并显示正确的按钮

w_open['SplitButton6'].draw_outline()

但是在“SplitButton6”上调用.click()方法会抛出一个WindowsSpecification类没有“click”方法错误。知道是什么引起的吗?这个错误似乎有误导性,因为WindowSpec类确实有一个.click方法。

正确的答案是您错过了
top\u level\u only=False
(默认情况下为
True
,因为更高级别的API至少调用了它两次)。然后,您可能有两个控件符合此条件(可能来自不同的应用程序)<代码>查找元素是一个低级功能。我不建议直接使用它(代码太长,在更高级别的API中考虑了许多陷阱)

这正是《入门指南》(你说你已经读过)中所写的内容

幸运的是,您可以使用方法
。单击任何控件的\u input()

w_open['SplitButton6'].click_input()
我可以说得更多:WindowSpecification没有
click
方法。这是一种动态实例化的
按钮rapper
方法。例如,这些语句的工作方式相同(但Python可以隐藏
.wrapper\u object()
调用):


同样的,这些都是在。请阅读整个指南。你会发现很多有用的高级东西。如果有些地方仍然不清楚,我可以为一些角落案例提供建议。

应该解释很多。正如我所说,官方指南没有解释这些内容。但它解释了您应该使用的更高级别的内容,以实现更好的生产力。有关更多详细信息,请参阅我的答案。文档中描述了
top\u level\u only
的证明链接:我尝试将top\u level\u only设置为False&我仍然得到ElementNotFoundError!你运行哪个语句?pywinauto.findwindows.find_元素(class_name=“Button”,control_id=2,top_level_only=False)我决定不使用find_元素方法。相反,我使用find_窗口来获得打开对话框的句柄。
find_窗口
只是我们为向后兼容而制作的
find_元素
的包装。为什么不干脆
app.OpenDialog.CancelButton.click()
?或者
app.OpenDialog.child\u窗口(class\u name='Button',control\u id=2)。单击()?
w_open['SplitButton6'].wrapper_object()
w_open['SplitButton6'].click_input()
w_open['SplitButton6'].wrapper_object().click_input()
w_open['SplitButton6'].click_input()