有时我无法通过ParentDlg.child_window()找到一个窗口

时间:2019-07-17 15:13:42

标签: python pywinauto

我刚刚开始学习python。现在我的工作是尝试使用pywinauto进行一些自动测试。有时我可以通过ParentDlg.child_window(**criterion)来获得一个对话框,有时却不能。

您可以认为我的应用程序(PageManager.exe)有两个按钮,[Page1]按钮和[Page2]按钮。启动应用程序时,您可以单击按钮以启动Page.exe进程。这意味着同时有两个Page.exe。启动Page.exe时,它将启动ImageCalculate.exe。所以有两个ImageCalculate.exe两个。 ImageCalculate.exe的父对话框是Page.exe。

单击[Page1]按钮时,将显示Page.exe(用于Page1),并隐藏Page.exe(用于Page2)。当您单击[Page2]按钮时,将显示Page.exe(用于Page2)并隐藏Page.exe(用于Page1)。

我的问题是当显示一个Page.exe时,例如Page.exe(用于Page1)。我可以通过ParentDlg = Desktop(backend="uia").window(best_match="Page1")找到Page.exe的主对话框。之后,我使用psutil.pids()和进程名"ImageCalculate.exe"来获取ImageCalculate.exe的两个PID,例如,一个是1234,另一个是5678。请注意,两个ImageCalculate.exe具有几乎相同的属性,相同的标题,班级名称等。 最后,我尝试通过ParentDlg.child_window(**criterion)来获取ImageCalculate.exe的主对话框。

但是根据我的测试,有时我可以获取主对话框并继续操作其控件,有时则不能。我不知道为什么,希望有人可以帮助我或提供其他方式来获取ImageCalculate.exe的主对话框。因为我具有ImageCalculate.exe的PID,也许我可以通过PID获得流程的主对话框?然后,也许我可以检查该对话框是否显示,或者不确认该对话框属于哪个Page.exe(如果显示此对话框,我认为该对话框属于Page1的Page.exe的ImageCalculate.exe)。

ParentDlg = Desktop(backend="uia").window(best_match="Page1")
// pids contains two pid of ImageCalculate.exe
for pid in pids:
    try:
        criterion = {}
        criterion['class_name_re'] = "AfxFrameOrView*"
        criterion['process']=pid
        ImageCalculate_dialog = parent.child_window(**criterion)
        # I think if ImageCalculate_dialog.writable_props is successful. 
        # Page1’s Page.exe’s ImageCalculate.exe's main dialog is found. 
        # But some times ImageCalculate_dialog.writable_props is failed two times and throws  ElementNotFoundError
        _cname = ImageCalculate_dialog.writable_props
    except pywinauto.findwindows.ElementNotFoundError:
        continue
    else:
        return ImageCalculate_dialog 


# Now I am trying to use following codes to get main dialog
ImageCalculateApp = Application().connect(process=pid)
dialogs = ImageCalculateApp.windows()
for dialog in dialogs:
    print(dialog)
# When I check print result in console
# I can find "hwndwrapper.DialogWrapper - 'ImageCalculate - Untitled',Afx:00400000:b:00010003:00000006:003908A5"
# But I don't know how to use hwndwrapper.DialogWrapper object,
# who could tell me how to use this object or give me some documents about this object?

0 个答案:

没有答案