3

我有用 Python 为 IE7 编写的自动化脚本。它完美地工作,除了触发警报框的情况。警告框在正文的 onload 中触发,这意味着它在我的脚本到达它之前被执行。

我有以下作为我的等待功能,它会一直挂起,直到单击警报框:

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 回答