我有自动化用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
现在我只需要一些方法将窗口识别为警告框。想法?
答案 0 :(得分: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
感谢那些回复的人!
答案 1 :(得分: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])