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



我正在尝试自动化一个利用网络服务器执行各种计算任务的过程。多个页面上有多个任务,所以我使用显式等待。这适用于除一个特定任务之外的所有任务,该任务需要 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)")

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

此外,如果我简单地使用睡眠函数,该脚本可以完美运行:

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

正如我之前所说,我有多个next<#>()函数实例可以完美运行,只是等待时间不同。这种情况有什么不同,我怎样才能让它工作?

因为:

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 中不存在。你的情况到底是什么,我不能说。尝试准确地查看,如果元素在 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()

相关内容

  • 没有找到相关文章

最新更新