弹出消失后,Selenium FireFox驱动程序停止响应

时间:2016-10-18 07:42:27

标签: python selenium selenium-firefoxdriver

我很欣赏一些关于手头问题的想法,我一直试图解决1-2天。

我正在使用FireFox 49.0.1上的Selenium 2.53.6运行Python脚本。该脚本应该单击页面上的一系列文档下载链接(我已将浏览器设置为自动下载这些文件类型而不是打开它们)。点击后,可能会展开以下两个事件之一:

  1. 出现一个弹出窗口。在下载文档之前,需要单击弹出窗口上的按钮将其关闭。
  2. 文档下载开始时,空白弹出窗口会自动消失。
  3. 以下是为处理上述事件而编写的脚本的摘录:

    file_link = tr.find_element_by_xpath('td[5]/a')
    file_link.click()
    time.sleep(7)  # Allows the blank pop-up to disappear automatically under Event2
    
    agree_button = None
    
    # Checks for the pop-up window
    try:
        print "Step 1"
        driver.switch_to.window(driver.window_handles[1])
        print "Step 2"  # SCRIPT STOPS RUNNING HERE
        agree_button = driver.find_element_by_xpath('//input[@value="Agree and proceed"]')
        print "Popup found"
    except:
        driver.switch_to.window(driver.window_handles[0])
    
    # Clicks the button if the pop-up window is found    
    if agree_button is not None:
        agree_button.click()
        print "Button clicked"
    

    当事件2的网络中存在高延迟时,会出现问题。在正常情况下,空白弹出窗口几乎立即消失,并在下载后立即开始下载。但是,如果网络速度较慢,则空白弹出窗口可能会持续超过分配的7秒,导致脚本在弹出窗口消失之前进入“步骤2”。

    奇怪的是,此时脚本不会继续寻找agree_button。如果确实如此,则会触发异常并且我将能够恢复到原始窗口以恢复步骤。脚本只是拖延而且看起来什么也没做。

    提前感谢您的时间!

1 个答案:

答案 0 :(得分:0)

您需要继续等待,直到弹出窗口消失。您可以这样做的一种方法是在代码中进行以下更改:

file_link = tr.find_element_by_xpath('td[5]/a')
file_link.click()
time.sleep(7)  # Allows the blank pop-up to disappear automatically under Event2

agree_button = None

# Checks for the pop-up window
try:
    print "Step 1"
    driver.switch_to.window(driver.window_handles[1])
    print "Step 2"  # SCRIPT STOPS RUNNING HERE
    while True:
        agree_button = driver.find_element_by_xpath('//input[@value="Agree and proceed"]')
        if agree_button is not None:
            break
        else:
            sleep(7)
    print "Popup found"
except:
    driver.switch_to.window(driver.window_handles[0])

# Clicks the button if the pop-up window is found    
if agree_button is not None:
    agree_button.click()
    print "Button clicked"