【问题标题】:python selenium: does not wait until page is loaded after a click() commandpython selenium:在click()命令后不等到页面加载
【发布时间】:2014-01-16 03:58:50
【问题描述】:

有人知道如何等待页面加载吗?我尝试了我在网上找到的所有可能的变体,但根本不起作用。

我需要在触发 click() 命令后等待,Web 服务器上有一些内部脚本会欺骗检查,例如(我排除了导入所需模块的代码并使用标准命名约定):

WebDriverWait(browser, 10).until(lambda d: d.find_element_by_id(the_id))

或

browser.implicitly_wait(10) 

或

elem2=wait.until(EC.presence_of_element_located((By.ID,the_id)))

上述所有检查都不起作用,即使页面仍在加载,它们也会返回 True。这会导致我正在阅读的文本不完整,因为在 click() 命令之后页面没有完全加载。似乎在 python 中,命令 clickAndWait 不可用(但同样,它可能无法解决问题,因为其他测试也失败了)。理想情况下,会有一个命令等待整个网页加载完毕(无论页面的特定元素如何)。

我设法通过在循环中手动插入 time.sleep(5) 来解决问题,但这是次优的,因为它可能会减慢整个过程。如果可能,最好只等待严格要求的时间。

谢谢

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    基本上,如果页面是由 JavaScript 生成的,那么就无法判断它何时“完成”加载。

    但是。我通常尝试检索页面元素,捕获异常并继续尝试直到达到超时。我还可以检查该元素是否可见,而不仅仅是存在。

    必须有一些 DOM 元素的可见性可以用来测试页面是否已“完成”加载。我的测试用例中通常有 wait_for_element_visibility 和 wait_for_element_presence 函数。

    def wait_for_visibility(self, selector, timeout_seconds=10):
        retries = timeout_seconds
        while retries:
            try:
                element = self.get_via_css(selector)
                if element.is_displayed():
                    return element
            except (exceptions.NoSuchElementException,
                    exceptions.StaleElementReferenceException):
                if retries <= 0:
                    raise
                else:
                    pass
    
            retries = retries - 1
            time.sleep(pause_interval)
        raise exceptions.ElementNotVisibleException(
            "Element %s not visible despite waiting for %s seconds" % (
                selector, timeout_seconds)
        )
    

    get_via_css 是我自己的功能之一,但我希望它相当清楚它在做什么。

    【讨论】:

    • 谢谢,我怀疑 wait_for_element_visibility 或 wait_for_element_presence 将不起作用,因为 is_enabled() 和 is_displayed() 是 True 即使页面仍在加载。正如您所建议的,我认为要走的路是一遍又一遍地尝试,直到达到超时为止。我将对实现循环的函数做一个包装器,并等待每次。
    【解决方案2】:

    这是我用过的版本:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    def waitForLoad(inputXPath): 
        Wait = WebDriverWait(browser, PATIENCE_TIME)       
        Wait.until(EC.presence_of_element_located((By.XPATH, inputXPath)))
    

    函数的第一行是通用等待。第二个是预期条件,它试图查找您知道页面上存在的元素。您可以更改它,而不是 Xpath 它执行 CSS_SELECTOR、NAME、ID、CLASS 等。还有很多其他的,但您必须查找预期条件文档。希望对我有所帮助,当我弄清楚时它对我有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 2017-09-18
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      相关资源
      最近更新 更多