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

2024-05-13 19:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

到目前为止,我成功地触发了7-zip(windows 64x)“Add to Archive”对话框

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

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

1:这不管用。我想是因为它没有找到对话。如果是,为什么?

app.window(title_re="Add to Archive", class_name="#32770").print_control_identifiers()

2:这个也不行:

app.window(title_re="Add to Archive", class_name="#32770").Edit.type_keys("hello")

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>]

我没有看到任何“添加到存档”窗口,为什么?这些是什么东西(例如在32_控件中,DialogWrapper)?

不同间谍工具的打印屏幕 对话框的spy++ enter image description here

在第一个控件上监视+(上面写着Edit,但是au enter image description here

检查对话框的.exe: enter image description here


Tags: toaddappobjecttopzipwindowedit
2条回答

瓦西里已经回答了这个问题。我只想收集评论和latest docs中提到的所有要点。(答案为斜体)。不要犹豫,填补这个基本图图留下的洞(几个问题仍然存在),或纠正它。


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

app.window(title_re="Add to Archive", class_name="#32770").print_control_identifiers()

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

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

要重新连接,需要重新进行app2=Application().connect(path='7zG.exe')然后选择控件

似乎越是指定要连接的内容,连接起来就越容易。这可能就是为什么瓦西里使用了路径+标题。我只想表明它也只适用于标题―在本例中

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

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

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

app.window(title_re="Add to Archive", class_name="#32770").Edit.type_keys("hello")

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

app2.window(title_re="Add to Archive", class_name="#32770").Edit1.type_keys(r"great success!", with_spaces = True)

4/我试图使用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>]

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

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

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

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

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

6/Spy++和inspect.exe甚至都不显示进程(另外,第二个进程又重又有错误)

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

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

enter image description here

你会发现一堆间谍工具hereAcc explorer很好地完成了Ahk(它与spy++做了相同的工作,但只是更好)。

(请随意使用我的截图)


额外提示:

有没有办法缩短代码?

.window(title_re="Add to Archive", class_name="#32770")

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

app2.AddtoArchive.type_keys(r"great success!", with_spaces = True)

其他应用程序如同上:

dittoApp=Application().connect(path='Ditto.exe')
ditto_dialog=ditto.window(best_match='Ditto')

相当于:

ditto=Application().connect(path='Ditto.exe')
dittoApp.Ditto

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

你可以列出所有可用的方法对象的ds使用:

print(dir(dlg_spec.wrapper_object()))

例如:

print(dir(ditto.ditto.SysListView321.wrapper_object()))

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

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

我看到7zFM.exe生成另一个进程(它甚至是另一个可执行文件!)通过这个对话。您需要连接到新进程。

app2 = Application().connect(path='7zG.exe', title='Add to Archive')
app2.AddToArchive.print_control_identifiers()

[编辑]

如果打开任务管理器(Win8.1或Win10上的“详细信息”选项卡),您将看到进程7zG.exe。另一种方法是:在Spy++中,当您查看windows层次结构时,右键单击对话框“Add to Archive”并选择“Properties”,然后切换到具有ProcessID值的选项卡(它显示为十六进制数)。为“文件管理器”对话框比较类似的数字。有不同的进程ID!

在Inspect.exe中,您还可以在屏幕截图上看到属性ProcessId(==5304)。在Task Manager/Details/columnPID中找到这个值。

相关问题 更多 >