pywinauto:如何选择这个对话框?使用哪种间谍工具?我需要什么信息?

J. *_*oes 4 python automation 7zip pywinauto python-3.x

如何在 7-zip“添加到存档”对话框的第一个字段中写入“hello”?

到目前为止,我设法使用此触发 7-zip (windows 64x)“添加到存档”对话框

from pywinauto.application import Application
app = Application().start(r"C:\Program Files\7-Zip\7zFM.exe") #set the app
app.top_window_().Edit.type_keys(r"C:\Users\me\Desktop{ENTER}") 
app.top_window_().SysListView32.Select(r'test.txt') #select files in list
app.top_window_().ToolbarAdd.TypeKeys("{ENTER}") #apply
Run Code Online (Sandbox Code Playgroud)

然后我无法选择“添加到存档”对话框。

1:这不起作用。我猜是因为它没有找到对话框。如果是这样,为什么?

app.window(title_re="Add to Archive", class_name="#32770").print_control_identifiers()
Run Code Online (Sandbox Code Playgroud)

2:这也不起作用:

app.window(title_re="Add to Archive", class_name="#32770").Edit.type_keys("hello")
Run Code Online (Sandbox Code Playgroud)

3:我尝试使用查找我的应用程序上的所有可用对话框print(app.windows())

但它打印出这个:

[<pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004033D68>, <pywinauto.controls.common_controls.ToolTipsWrapper object at 0x0000000004089128>, <pywinauto.controls.hwndwrapper.HwndWrapper object at 0x0000000004089208>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x
00000000040893C8>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004089390>]
Run Code Online (Sandbox Code Playgroud)

我没有看到任何“添加到存档”窗口,为什么?这些东西是什么(例如 in32_controls.DialogWrapper)?

对话框中 不同间谍工具spy++的打印屏幕在此输入图像描述

在第一个控件上进行间谍++(它说编辑,但是au 在此输入图像描述

对话框的spectr.exe: 在此输入图像描述

J. *_*oes 5


\n\n

瓦西里已经回答了这个问题。我只是想收集评论和最新文档中提到的所有要点)。(答案为斜体)。请毫不犹豫地填补这个基本教程中留下的漏洞(仍然存在几个问题),或者纠正它。

\n\n
\n\n

1/ 我无法连接到此对话框

\n\n
app.window(title_re="Add to Archive", class_name="#32770").print_control_identifiers()\n
Run Code Online (Sandbox Code Playgroud)\n\n

答:它不起作用,因为它是另一个过程。所以这是一种新的应用程序(app2)。因此,您需要重新连接到它(某些应用程序可以为它们启动的每个窗口启动一个新进程)。

\n\n

对于某些应用程序,您还需要指定“后端”,默认情况下它是“win32”。如果间谍工具(参见下面)可以在“uia”模式下看到“控件”(每个字段的名称、类等、按钮...),则应该使用Application(backend=\'uia\')

\n\n

要重新连接,您需要再次执行操作app2=Application().connect(path=\'7zG.exe\'),然后选择控件

\n\n

似乎您指定的连接内容越多,连接就越容易。这可能就是瓦西里使用路径+标题的原因。我只是想表明它也仅适用于本例中的标题 \xe2\x80\x95

\n\n

2/ 是的,但是我怎么知道这是一个新流程?

\n\n

答案:您可以在间谍工具中看到这一点(参见 6/ 和下面的打印屏幕)。

\n\n

3/ 我无法选择该对话框上的控件(在字段中输入文本):

\n\n
app.window(title_re="Add to Archive", class_name="#32770").Edit.type_keys("hello")\n
Run Code Online (Sandbox Code Playgroud)\n\n

答:这是正常的,您需要先连接到对话框。首先连接到 app2(参见上文),然后执行以下操作:

\n\n
app2.window(title_re="Add to Archive", class_name="#32770").Edit1.type_keys(r"great success!", with_spaces = True)\n
Run Code Online (Sandbox Code Playgroud)\n\n

4/我尝试使用查找我的应用程序上的所有可用对话框print(app.windows())但它打印了这个(以及其他奇怪的东西):

\n\n
[<pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004033D68>, <pywinauto.controls.common_controls.ToolTipsWrapper object at 0x0000000004089128>, <pywinauto.controls.hwndwrapper.HwndWrapper object at 0x0000000004089208>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x\n00000000040893C8>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004089390>]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我没有看到任何“添加到存档”窗口,为什么?这些东西是什么(例如 in32_controls.DialogWrapper)?

\n\n

答案:“它为每个窗口返回可操作的包装器”。每个字符串都是对象的内存位置(地址)。我不知道如何使用它们

\n\n

您可以使用获取一些文本print ([w.window_text() for w in app.windows()]) (它打印出[\'C:\\\\Users\\\\Me\\\\Desktop\\\\\', \'\', \'\', \'M\', \'Default IME\']不知道这意味着什么。)

\n\n

5/ 如果我获得了访问这些对话框和控件所需的所有信息,我真的需要打印这些对话框或控件列表吗?

\n\n

我不知道。我还没有完全理解打印对话框列表的必要性。但我理解(也许)是这个控件列表提供了缩短代码的方法。例如。它给出了类似的东西AddToArchiveapp2.window(title_re="Add to Archive").你可以写而不是写app2.AddToArchive.

\n\n

6/ Spy++ 和inspect.exe 甚至不显示进程(加上第二个很重且有错误)

\n\n

答案:最好的间谍工具似乎是来自 AutoHotkey 的工具(下面是 AU3_Spy.exe 的打印屏幕)。它在一个小窗口中显示名称/类/进程,甚至控件名称(和其他内容),而无需加载 CPU。与其他 2 个间谍工具不同,AutoHotkey 给出了正确的控件名称

\n\n

另请注意,控件名称从一种间谍工具更改为另一种。最准确的似乎是来自 autohotkey 的(到目前为止所有测试都有效)。它只提供你需要的东西,其他间谍工具会显示很多无用的东西,除了你需要的东西(例如进程和控件的真实名称)

\n\n

在此输入图像描述

\n\n

你会在这里找到一堆间谍工具Acc explorer 非常好 Ahk (它的功能与间谍++相同,但更好)。

\n\n

(欢迎使用我的截图)

\n\n
\n\n

额外提示:

\n\n

有没有办法缩短代码?

\n\n
.window(title_re="Add to Archive", class_name="#32770")\n
Run Code Online (Sandbox Code Playgroud)\n\n

相当于.AddtoArchive. 所以你也可以写:

\n\n
app2.AddtoArchive.type_keys(r"great success!", with_spaces = True)\n
Run Code Online (Sandbox Code Playgroud)\n\n

同上其他应用程序,如同上:

\n\n
dittoApp=Application().connect(path=\'Ditto.exe\')\nditto_dialog=ditto.window(best_match=\'Ditto\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

相当于:

\n\n
ditto=Application().connect(path=\'Ditto.exe\')\ndittoApp.Ditto\n
Run Code Online (Sandbox Code Playgroud)\n\n

有我可以玩的动作列表吗?\n您将在这里执行许多操作(在列表、按钮、编辑字段...)。

\n\n

您可以使用以下方法列出对象的所有可用方法:

\n\n
print(dir(dlg_spec.wrapper_object()))\n
Run Code Online (Sandbox Code Playgroud)\n\n

前任:

\n\n
print(dir(ditto.ditto.SysListView321.wrapper_object()))\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用之前需要导入 pywinauto 模块!\n模块是您需要导入的类(例如:pywinauto.application module)\n要使用它们,请不要忘记导入该类!例如,要使用findbestmatch 模块中列出的方法之一,您需要:from pywinauto import findbestmatch

\n\n

另一个例子:你需要from pywinauto import keyboard使用SendKeys(\'^a^c\')

\n