【问题标题】:python selenium WebDriverWait not working when EC returns elementEC返回元素时python selenium WebDriverWait不起作用
【发布时间】:2018-10-17 22:35:32
【问题描述】:

我经常使用 selenium,但没有机会使用 WebDriverWait。现在我需要单击一个后退按钮,虽然它似乎可以立即使用,但它有时一定不是一瞬间。我可以用 time.sleep(1) 把它放在一个循环中,它偶尔会循环一次。我可以忍受这一点,但我认为这是实现 WebDriverWait 的绝佳机会。 这有效:

browser.find_element_by_xpath('//div[@onclick="backToResults();"]')

除了偶尔的 NoSuchElementException...

这行不通,它只会运行 3 秒并超时(无论我尝试多长时间,它都不会返回成功):

elem = WebDriverWait(browser, 3).until(ec.presence_of_element_located((By.XPATH, '//div[@onclick="backToResults();')))

...但是没有等待的相同 ec 调用确实返回元素,所以等待应该工作:

ec.presence_of_element_located((By.XPATH, '//div[@onclick="backToResults();'))

所以,不是说该元素不存在并且至少在一秒左右内可访问,而是 WebDriverWait 没有从积极的 EC 调用中返回?

【问题讨论】:

    标签: python selenium selenium-webdriver webdriver webdriverwait


    【解决方案1】:

    不确定将 EC 分配给变量是否是一种好习惯...

    尝试删除 elem = 位,看看是否有帮助。

    另外,这行 - ec.presence_of_element_located((By.XPATH, '//div[@onclick="backToResults();')) - 似乎有效,所以我想知道这里的问题是什么......? :)

    【讨论】:

    • 好吧,根据docselem =是正确的。不管怎样,不管有没有elem =,它都不起作用。 wait 似乎没有按预期工作。
    • 可能是您在某处声明了全局等待(例如 10 秒)。现在,当你不给它一个特定的时间(比如等待 3 秒)时,它需要全局等待并在那个时间内实际找到元素。这是假设如果你不把等待直到 EC 之前,它会自动把它放在那里,但如果发生这种情况,我找不到任何地方。
    • 不,这是代码中等待的唯一用法。这是第一次尝试使用它。由于似乎没有人对此做出回应,正如我最初所说的那样,它是通过time.sleep(1) 完成的,所以我回到了那个并继续前进。我只是认为 SO 中的某个人之前可能遇到过这个问题并找到了解决方案。
    【解决方案2】:

    time.sleep() / NoSuchElementException

    暂停网络驱动程序的执行毫秒,您可以传递number of secondsfloating point number of seconds,如下所示:

    import time
    time.sleep(1) #sleep for 1 sec
    time.sleep(0.25) #sleep for 250 milliseconds
    

    但是,在使用 SeleniumWebDriver 进行 Automation 时,使用 time.sleep(secs) 而没有任何特定条件实现 违背了自动化的目的,应该不惜一切代价避免。根据文档:

    time.sleep(secs) 将当前线程的执行挂起给定的秒数。该参数可以是一个浮点数,以指示更精确的睡眠时间。实际的挂起时间可能少于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长。

    因此,有时即使在使用 time.sleep(secs) 之后,您也可能会看到 NoSuchElementException

    现在,由于您的目标是在元素上调用 click(),因此您需要使用 element_to_be_clickable(locator) 而不是使用 expected_conditions 作为 presence_of_element_located(),如下所示:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[starts-with(@onclick,'backToResults')]"))).click()
    

    您可以在How to sleep webdriver in python for milliseconds找到相关的详细讨论

    【讨论】:

    • 正如我在我的 OP 中所说的,I can put it in a loop with a time.sleep(1) and it will occasionally loop once,所以是的,它确实可以在循环中使用time.sleep(1)。这就是WebDriverWait 应该完成的工作,我很好奇为什么这不起作用。至于您的链接参考,我还说过 EC 与带有 presence_of_element_located 的元素以及您提供的链接中的所有这些标志一起返回。所以你的回答对为什么WebDriverWait在这里不起作用没有任何帮助?
    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 2017-12-03
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多