3

IE7 用の Python で記述されたオートメーション スクリプトがあります。アラートボックスがトリガーされた場合を除いて、完全に機能します。アラート ボックスは本文のオンロードでトリガーされます。つまり、スクリプトが到達する前に実行されます。

アラートボックスがクリックされるまでハングする待機機能として次のものがあります。

def _waitReady(self):
    """ Waits until IE finishes loading. """
    while self.oIE.Busy: time.sleep(0.1)
    while self.oIE.Document.readyState != "complete": time.sleep(0.1)

単純にすべてのアラート ボックスを無効にしたいのですが、IE では無効にできないようです。別の方法として、アラート ボックスが開いていることを検出し、それに応じてアクションを実行する (単にクリックするなど) ことを望んでいました。これを達成する方法について何か提案はありますか?

編集: IE の子ウィンドウを切り替えることができることはわかっていますし、アラート ボックスが見つかったら閉じることができることもわかっています。

win32gui.EnumChildWindows(hwnd, function, None) # cycles through child windows
win32api.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) # closes window

ここで、ウィンドウをアラート ボックスとして識別する何らかの方法が必要です。考え?

4

2 に答える 2

1

私の問題を解決しました。システム内のすべてのウィンドウを単純に繰り返し処理し、クラス名を確認し、それがアラート クラスである場合はウィンドウを閉じました (#32770)。

より的を絞ったアプローチを試みましたが、IE アプリケーションの下にある警告ウィンドウを見つけることができなかったようです。

def _waitReady(self):
while self.oIE.Busy:
    time.sleep(0.1)
    waitCount += 0.1

    if waitCount > 5:
        print("killing alert boxes")
        _killAllAlertBoxes()
       waitCount = 0

def _killAllAlertBoxes():
# iterates through all active windows
win32gui.EnumChildWindows(0, _closeWindow, None)

def _closeWindow(hwnd, lparam):
# if window is an alert box (class = '#32770')
if win32gui.GetClassName(hwnd) == '#32770':
    print("Closing Alert Box")
    win32api.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) # closes window

回答してくれた人に感謝します!

于 2013-01-22T03:39:17.990 に答える
0

このコードは、Firefox の警告ウィンドウで機能しますが、IE 用に変更する必要がある場合があります。

   import time

   time.sleep(2)
   driver.switch_to_alert().accept(); time.sleep(2); time.sleep(2); time.sleep(2);time.sleep(2)
   driver.switch_to_window(browser.window_handles[1])
于 2013-01-21T19:26:35.750 に答える