Selenium(Python)显式等待超时错误

时间:2018-07-09 16:55:29

标签: python selenium timeout webdriverwait

我正在尝试使利用Web服务器执行各种计算任务的过程自动化。在多个页面上有多个任务,因此我正在使用显式等待。此功能适用于除一项特定任务以外的所有任务,该任务需要5到7分钟的时间才能完成(比其他任何事情都要长得多)。

每当我尝试以下操作时:

def next5():
    try:
        myElem5 = WebDriverWait(driver, 600).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#fmdsetup > table > tbody > tr:nth-child(2) > td > input[type="radio"]')))
        next5 = driver.find_element_by_class_name('nav_entry')
        next5.click()
    except TimeoutException:
    print("Timed out waiting for page to load (next5)")

我收到TimeoutException打印语句。我尝试了更长的等待时间,但是总是超时。奇怪的是,它在10分钟过去之前抛出了TimeoutException。

此外,如果我仅使用睡眠功能,该脚本就可以完美运行:

def next5():
    time.sleep(600)
    next5 = driver.find_element_by_class_name('nav_entry')
    next5.click()

正如我之前所说,我有多个next<#>()函数实例,它们可以完美地工作,只是等待时间不同。这种情况有什么不同,我如何使它起作用?

1 个答案:

答案 0 :(得分:0)

因为:

def next5():
    try:
        myElem5 = WebDriverWait(driver, 600).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#fmdsetup > table > tbody > tr:nth-child(2) > td > input[type="radio"]')))
        next5 = driver.find_element_by_class_name('nav_entry')
        next5.click()
    except TimeoutException:
    print("Timed out waiting for page to load (next5)")

def next5():
    time.sleep(600)
    next5 = driver.find_element_by_class_name('nav_entry')
    next5.click()

是不同的,第一个无效,第二个有效,我可以说问题出在myElem5元素上。它根本不可单击,因此添加等待时间没有任何意义,或者该元素在DOM中不存在。我不能说你的情况到底是什么。如果element在DOM中并且是可单击的,则尝试准确查看。尝试手动执行相同的操作,然后尝试进行调试。我想您会发现问题。

编辑:根据您的反馈,您这样做:

def next5(counter=1):
    try:
        if counter == 5:
            WebDriverWait(driver, 10).until(EC.url_contains(("the new url, where elem 5 exists")))
        myElem5 = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, '#fmdsetup > table > tbody > tr:nth-child(2) > td > input[type="radio"]')))
        next5 = driver.find_element_by_class_name('nav_entry')
        next5.click()
        counter += 1
    except TimeoutException:
        print("Timed out waiting for page to load (next5)")

PS确保该元素不在iframe/frame中(如果是),首先您必须打开它,然后该元素才可以与其进行交互。您可以使用这种方法:

WebDriverWait(driver, 600).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//xpath/to/frame")))
# do your stuff
driver.switch_to.default_content()