2016-11-04 27 views
1

我試圖遠程控制一個Windows應用程序,有時會在啓動時使用pywinauto顯示一個警告窗口。Pywinauto - 如何閱讀彈出窗口中的文本來識別它?

下面的代碼標識窗口,因爲它沒有菜單。

我想閱讀彈出文本以查找短語「請與您的系統管理員聯繫」。在彈出的窗口中知道它是 正確的一個。

mywindows = pywinauto.findwindows.find_windows(title_re=".*MyProgramTitle") 

# proof that two windows are found 
print(len(mywindows)) 

for handle in mywindows: 
    print('\nhandle {}'.format(handle)) 

    app = Application().connect(handle=handle) 
    navwin = app.window(handle=handle) 

    if not navwin.menu_items(): 
     # no menu - I bet it's a pop up 
     print('{} is the window I\'m looking for'.format(handle)) 
     navwin.print_control_identifiers() 

上面的代碼打印出所有窗口的信息,包括 「靜 - ‘位置映射失敗,請與系統管理員聯繫。’」

但我需要趕上打印輸出進行進一步的處理它。

回答

0

作爲一個哈克解決方案,我通過 print_control_identifiers()源代碼去,發現這種方式來遍歷窗口

navwin.print_control_identifiers() 

for x in navwin.descendants(): 
    print (x.window_text()) 
    print (x.class_name()) 
0

find_windows的控制是非常自動化低級別的入口點。使用WindowSpecification對象,您可以等待打開所需的對話框/控件,或者只是檢查它是否存在(全部使用定製超時)。

Getting Started Guide查看更詳細的解釋。

您可以使用exists()visible()方法(返回布爾值)而不是wait('exists')wait('visible')如果失敗可能會引發異常。

對於您的情況下,它可能看起來如此:

static = app.DialogName.child_window(title_re='.*Please contact your system administrator.', 
            class_name_re='Static') 
if static.exists(timeout=20): # if it opens no later than 20 sec. 
    app.DialogName.OK.click() 
+0

謝謝,我花了很多時間閱讀的入門指南。你的方法要求我需要知道** Dialogname **。找出這當前是一個挑戰。如果有多個具有相同標題的對話框(其中只有一個具有所需的文本),此方法是否可行? 'app.DialogName.OK.click()'如何知道它需要點擊'static'而不是其他同名窗口? – 576i

+0

對於默認'backend ='win32'',你可以使用'app.windows()'來處理所有的頂級窗口。說'print [wnd.window_text()for wnd in app.windows()]''。這就是如何知道'DialogName'。 –

+0

如果有多個具有相同名稱的對話框,可以使用'app.window(title ='Dialog name',active_only = True)'而不是'app.DialogName'來消除搜索條件的歧義。或者更詳細的選擇:'app.window(title ='Dialog name',found_index = 0)'。 –

相關問題