无法使用pywinauto使用标识符访问win32应用程序的元素
Unable to access elements of win32 application using identifier using pywinauto
我对 windows 基于桌面的测试自动化很陌生,对 python 也很陌生,在花了一些时间之后,pywinauto 变成了 [=33] 的明显选择=] 基于应用程序测试使用 python。
我正在使用 pywinauto 访问演示应用程序中的元素。我浏览了相关文档和 Whosebug 问答,GitHub 上的示例。这就是我所做的
app = Application(backend="win32").start(r"C:\XXX\Bin\XXX.exe")
while not app.Windows_():
time.sleep(1)
if app.window(title="Start Application - XXX 2.3").Exists():
app.window(title="Start Application - XXX 2.3").PrintControlIdentifiers()
我得到的输出是这样的
b'\nHwndWrapper[XXX.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519] - \'Start Application - XXX 2.3\' (L668, T45, R1786, B969)\n[\'HwndWrapper[XXX.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519]\', \'Start Application - XXX 2.3HwndWrapper[Zen.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519]\', \'Start Application - XXX 2.3\']\nchild_window(title="Start Application - XXX 2.3", class_name="HwndWrapper[XXX.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519]")'
我使用过 swapy 工具,但不知何故不提供可用的控件并使用 inspect.exe 检查 class 名称等
我检查了各种其他方法,例如使用 findwindows、findwindows.find_element 来查找 child window,以某种方式单击一个按钮(不想使用coordinate) 然后按 tab 键点击,但是 none 这给了我一个合适的控制,就像我可以使用一些付费工具如 Test Complete 找到的那样。
想知道,是否可以使用 pywinauto 执行如下操作
Aliases.XXX.HwndSource_mainWindow.mainWindow.leftToolAreaControl.ToolAreaTabItem.TabControl.ClickTab("Acquisition")
目前我唯一能做的就是打开应用程序,然后使用包装器关闭或最小化应用程序。
如有任何建议,我们将不胜感激。
这里只是总结评论:
如果使用Inspect.exe
成功,还需要使用backend='uia'
。这可能对现代应用程序更有帮助。有关后端的更多详细信息,请参见 Getting Started Guide.
print_control_identifiers()
的大量输出不是堆栈跟踪,而是控件树。您可以从该输出中每个控件描述的第二行复制并粘贴可能的属性名称。例如,在这里您可以使用此列表中的几个名称:
[u'Size on disk:', u'Size on disk:Static', u'Static4']
当然要更正以符合属性名称限制,比如说dlg.Size_on_disk_Static.window_text()
。
另请注意,属性解析魔术应该跨层次工作。所以你可以省略一些级别,它应该搜索子树内的控件。
还有一件更重要的事情:window 规范可以是多级的,但是 UIAWrapper 不能对较低级别进行属性访问。首先,您需要弄清楚什么是 window 规范以及它如何找到包装器。
我对 windows 基于桌面的测试自动化很陌生,对 python 也很陌生,在花了一些时间之后,pywinauto 变成了 [=33] 的明显选择=] 基于应用程序测试使用 python。
我正在使用 pywinauto 访问演示应用程序中的元素。我浏览了相关文档和 Whosebug 问答,GitHub 上的示例。这就是我所做的
app = Application(backend="win32").start(r"C:\XXX\Bin\XXX.exe")
while not app.Windows_():
time.sleep(1)
if app.window(title="Start Application - XXX 2.3").Exists():
app.window(title="Start Application - XXX 2.3").PrintControlIdentifiers()
我得到的输出是这样的
b'\nHwndWrapper[XXX.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519] - \'Start Application - XXX 2.3\' (L668, T45, R1786, B969)\n[\'HwndWrapper[XXX.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519]\', \'Start Application - XXX 2.3HwndWrapper[Zen.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519]\', \'Start Application - XXX 2.3\']\nchild_window(title="Start Application - XXX 2.3", class_name="HwndWrapper[XXX.exe;;ebf7c21b-5fef-4eb7-a562-3d36735e7519]")'
我使用过 swapy 工具,但不知何故不提供可用的控件并使用 inspect.exe 检查 class 名称等
我检查了各种其他方法,例如使用 findwindows、findwindows.find_element 来查找 child window,以某种方式单击一个按钮(不想使用coordinate) 然后按 tab 键点击,但是 none 这给了我一个合适的控制,就像我可以使用一些付费工具如 Test Complete 找到的那样。
想知道,是否可以使用 pywinauto 执行如下操作
Aliases.XXX.HwndSource_mainWindow.mainWindow.leftToolAreaControl.ToolAreaTabItem.TabControl.ClickTab("Acquisition")
目前我唯一能做的就是打开应用程序,然后使用包装器关闭或最小化应用程序。
如有任何建议,我们将不胜感激。
这里只是总结评论:
如果使用
Inspect.exe
成功,还需要使用backend='uia'
。这可能对现代应用程序更有帮助。有关后端的更多详细信息,请参见 Getting Started Guide.print_control_identifiers()
的大量输出不是堆栈跟踪,而是控件树。您可以从该输出中每个控件描述的第二行复制并粘贴可能的属性名称。例如,在这里您可以使用此列表中的几个名称:[u'Size on disk:', u'Size on disk:Static', u'Static4']
当然要更正以符合属性名称限制,比如说
dlg.Size_on_disk_Static.window_text()
。另请注意,属性解析魔术应该跨层次工作。所以你可以省略一些级别,它应该搜索子树内的控件。
还有一件更重要的事情:window 规范可以是多级的,但是 UIAWrapper 不能对较低级别进行属性访问。首先,您需要弄清楚什么是 window 规范以及它如何找到包装器。