如何在 Python 中使用 Selenium 设置动态显式等待?

Posted

技术标签:

【中文标题】如何在 Python 中使用 Selenium 设置动态显式等待?【英文标题】:How can I set a dynamic explicit wait using Selenium in Python? 【发布时间】:2021-11-18 02:43:40 【问题描述】:

我几天前构建的一个程序在这里遇到了一点问题,所以我将非常简单地解释它:

我正在使用我的程序从页面中抓取数据,为此,我设置了此显式等待:

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH,'/this_is_the_XPATH')))

在大多数情况下,它工作得很好,但是,有时上面的显式等待会导致此错误:

超时异常

这使我的程序停止并不得不再次重复一个漫长的过程。

我意识到设置为 10 秒的等待参数并不总是一个好的参数,所以我想知道你们是否有办法将此参数设置为始终获得准确加载时间的变量(在秒)对于完全加载的页面。

其他更简单的想法可能是强制重复该过程直到元素的可见性最终被加载,例如使用尝试和异常块,但我不知道我应该在异常块中输入什么来一遍又一遍地重复尝试,直到它完成。

一如既往,感谢您的反馈,感谢您提前阅读。

【问题讨论】:

【参考方案1】:

您正在使用 Selenium 的预期条件功能。 10 秒的初始等待只是设置允许等待的最长时间,以防预期条件函数无法获取任何内容。

如果一直失败,您可能需要提高 10 秒的最长等待时间。

如果满足预期条件条件,等待将提前结束(即不是 10 秒)。

因此,重要的部分是确保 EC 功能按预期工作。我喜欢使用 element_to_be_clickable 而不是您的 visibility_of_element_located,也许可以尝试一下,(或其他,完整的条件列表 here)

试试这个:

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 20) #set a max wait time
element = wait.until(EC.element_to_be_clickable((By.XPATH, 'some xpath'))) #set the dynamic wait, which should end the wait early (ie not 20 seconds)

【讨论】:

【参考方案2】:

始终为重复操作编写可重用函数,并为这些函数编写 exception-handling

您的代码

 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH,'elementTxt')))

创建可重用函数

def clickElement(elementTxt, driver, time) 
    try :

      element = WebDriverWait(driver, time).until(EC.visibility_of_element_located((By.XPATH,'/this_is_the_XPATH')))
      element.click()

     except ElementClickInterceptedException as e: 
        driver.execute_script ("arguments[0].click();",element)

     except TimeoutException as te
     element = WebDriverWait(driver, time).until(EC.element_to_be_clickable((By.XPATH,'/this_is_the_XPATH')))
     element.click()
    

调用函数:现在,您可以在需要执行click 操作的任何地方调用此clickElement 函数。您需要传递xPath 值、驱动程序实例以秒为单位的时间

clickElement(xPathText, driver, 30)

其他更简单的想法可能是强制重复该过程,直到 元素的可见性终于被加载了

如果我们知道元素将不可见,那么我们不应该等到它显示。它会导致代码停留在无限循环中,但您可以再搜索一次元素。如果您看到上面的示例,在TimeoutException 块中,如果仍然无法访问元素,我们将再次搜索相同的元素,那么我们需要考虑其他方式。

【讨论】:

以上是关于如何在 Python 中使用 Selenium 设置动态显式等待?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 和 Selenium 将 cookie 保存在浏览器中

如何在 python 中使用 selenium 下载 pdf 文件

如何在 Python 中使用 Selenium 在 Firefox 中禁用 Flash?

如何使用Selenium和Python在网站内的页面中导航?

如何使用 Selenium 和 Python 在控制台中跳过调试日志

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]