1

Win32GUIとWatsupを使用して、インターフェイスが付属していないプログラムを介してアクセスされるデータベース全体の検索を自動化するPythonコードを少し書いています。そのため、リストから文字列を取得し、それを検索ボックスに入力して、「ルックアップ」を押すことができます。

ただし、検索で1000を超える結果が返されると、プログラムは警告ダイアログ(結果の数の通知)をスローし、Pythonコードの実行を停止します。ルックアップを押す行を超えてコードを進めることができません。

推測では、これはウィンドウを期待していないか、警告の処理方法を知らないためですが、手動で受け入れる以外は、どちらもしません。以下は、関連するコードのサンプルですが、おそらくあまり啓蒙的ではありません。「clickButton(LookupButton)」の後、実行は停止します。

LookupButtonlocation = elemstring.find("Lookup", AuthNameFieldlocation) - 15

#Use Regex search to find handles
number_regex = re.compile(';(\d+);')
AuthNameEdit = int(number_regex.search(elemstring[AuthNameFieldlocation:]).group(1))
LookupButton = int(number_regex.search(elemstring[LookupButtonlocation:]).group(1))

#Input new Author into Edit Field
setEditText(AuthNameEdit, "John Campbell")
#Click lookup button
clickButton(LookupButton)
4

1 に答える 1

1

私は WATSUP ユーザーではありませんが、pywinauto を使用して非常に似たようなことをしています。私の場合、同様の方法で不便な警告ダイアログを表示するさまざまなサードパーティ プログラムを開く多数の自動テストを実行しています。知らないダイアログを処理するのは少し難しいですが、どのダイアログが表示されるかはわかっていても、いつ表示されるかがわからない場合は、それらのポップアップを処理するためのスレッドを開始できます。以下は私がやっていることの簡単な例で、pywinauto を使用していますが、WATSUP のアプローチを適応させることができます:

import time
import threading

class ClearPopupThread(threading.Thread): 
    def __init__(self, window_name, button_name, quit_event):
        threading.Thread.__init__(self)
        self.quit_event = quit_event
        self.window_name = window_name
        self.button_name = button_name
    def run(self):
        from pywinauto import application, findwindows                
        while True:
            try:
                handles = findwindows.find_windows(title=self.window_name)
            except findwindows.WindowNotFoundError:
                pass #Just do nothing if the pop-up dialog was not found
            else: #The window was found, so click the button
                for hwnd in handles:
                    app = application.Application()
                    app.Connect(handle=hwnd)
                    popup = app[self.window_name]                    
                    button = getattr(popup, self.button_name)
                    button.Click()                    
            if self.quit_event.is_set():
                break            
            time.sleep(1) #should help reduce cpu load a little for this thread

基本的に、このスレッドはポップアップ ウィンドウを名前で探す無限ループであり、見つかった場合はボタンをクリックしてウィンドウを閉じます。多数のポップアップ ウィンドウがある場合は、ポップアップごとに 1 つのスレッドを開くことができます (ただし、あまり効率的ではないバグです)。これは無限ループなので、メイン プログラムからスレッドを停止できるように、イベントが設定されているかどうかをスレッドで確認します。したがって、メインプログラムでは、次のようなことを行います。

#Start the thread
quit_event = threading.Event()
mythread = ClearPopupThread('Window Popup Title', 'Yes button', quit_event)
# ...
# My program does it's thing here
# ...
# When my program is done I need to end the thread
quit_event.set()

これは必ずしもあなたの問題に対処する唯一の方法ではありませんが、私にとってはうまくいった方法です. 申し訳ありませんが、私は WATSUP の取り扱いについてあまりお役に立てません (いつも pywinauto の方が使いやすいと感じていました) 例 2 は、スレッドを使用せずに同様のことを行います。つまり、名前付きウィンドウを探し、そのウィンドウの特定のボタンをクリックします。

于 2011-04-26T14:05:25.903 に答える