【问题标题】:Waiting function that waits for a loading circle to disappear selenium, unittest, python takes 12+ seconds even if the circle has done loading等待加载圈消失的等待函数 selenium,unittest,python 即使圈已经完成加载也需要 12+ 秒
【发布时间】:2020-11-21 09:28:26
【问题描述】:

鉴于此代码会等到加载圈从网页上消失:

    def wait_loadingCircle(self):

    try:
        while self.browser.find_element_by_xpath('//div[@class="sk-circle-container"]').is_displayed() is True:
            time.sleep(1)
    except (NoSuchElementException, StaleElementReferenceException, TimeoutException):
        print('Loading circle has expired')

问题是当圆圈消失时(xpath 消失).is_displayed() 函数在 12+ 秒内返回 false,有没有其他方法可以等到圆圈消失(页面上不再找到 xpath)?

编辑:

此代码示例需要更长的时间:

    def wait_loadingCircle(self):

    try:
        # while self.browser.find_element_by_xpath('//div[@class="sk-circle-container"]').is_displayed() is True:
        while self.browser.find_element_by_xpath('//div[@class="sk-circle-container"]') != None:
            time.sleep(1)
    except (NoSuchElementException, StaleElementReferenceException, TimeoutException):
        print('Element loading a disparut')

基本上在 xpath 从页面中消失后,当页面的复杂度稍大时,代码识别它的速度太慢了

【问题讨论】:

    标签: python selenium unit-testing django-unittest


    【解决方案1】:

    是的,您可以使用WebDriverWait() 并使用预期条件invisibility_of_element_located()

    一旦元素在 20 秒内变得不可见(正如您所说,它需要 12 秒才能消失),这将移至下一条语句,否则如果元素仍未消失,则在 20 秒后抛出异常。

    WebDriverWait(driver,20).until(EC.invisibility_of_element_located((By.XPATH,'//div[@class="sk-circle-container"]')))
    

    您需要导入以下库。

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    

    【讨论】:

    • 是的,尝试了你的解决方案,同样的结果,如果页面有点大,圆圈实际上从页面消失后需要很长时间才能抛出异常,基本上我希望圆圈消失后立即以某种方式尽可能快地抛出异常
    • @Henry-G :您是否尝试过为元素使用正确的 xpath?预期的条件将检查元素是否可见。正如您所说,在圆圈实际上从页面中消失后抛出异常需要很多时间.这意味着您正在检查的元素消失它仍然在页面上,因为如果相同的元素消失,它将移至下一条语句而不抛出异常。请检查元素或者您可以分享您的网址进行调查?
    • 不幸的是,它是一个本地主机,但是 xpath 消失了,它不仅在屏幕上消失了,它也从页面的结构中消失了
    • @Henry-G :您能否使用 chrome 开发工具检查您的 xpath 在 DOM 上获得了多少元素?或通过代码print(len(driver.find_elements_by_xpath('//div[@class="sk-circle-container"]')))
    【解决方案2】:

    您需要专注于您的用例,等到加载圈从网页上消失不是您的用例。

    您的用例可能是等待初始加载圈从网页上消失,然后与元素进行交互。在这种情况下,首先您需要为加载程序的invisibility_of_element_located() 诱导WebDriverWait,然后为所需的element_to_be_clickable() 诱导WebDriverWait,如下所示:

    WebDriverWait(driver, 20).until(EC.invisibility_of_element_located((By.XPATH, "//div[@class='sk-circle-container']")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "xpath_desired_element"))).click()
    

    注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

    更新

    wait_loadingCircle(self) 方法似乎是完全开销,因为等待 加载循环 不是您的实际用例。我们已经在几次讨论中讨论了这个方面。最好的方法是探索is_displayed() is True,诱导WebDriverWait。您可以在以下位置找到一些相关讨论:


    参考

    您可以在以下位置找到相关的详细讨论:

    【讨论】:

    • 是的,基本上,这就是我正在做的事情,但是我使用了 while is_dispalyed() true 而不是 ec.invisibility_of_element_located 因为它更快,我的问题是去下一步,在圆圈实际消失后单击一个元素。这是我的问题,即使圆圈消失了,代码也需要很长时间才能看到它消失
    • @Henry-G 查看答案更新,让我知道您的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2023-01-28
    • 2014-10-03
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多