EC返回元素时,python selenium WebDriverWait不起作用

时间:2018-10-17 22:35:33

标签: python selenium selenium-webdriver webdriver webdriverwait

我已经使用了很多硒,但是没有机会使用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调用中返回吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

但是,当使用 time.sleep(secs) 使用 Selenium WebDriver 进行自动化时,没有任何要达到的特定条件 违反了自动化 的目的,因此应不惜一切代价避免。根据文档:

  

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

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

现在,由于您的目标是在元素上调用click(),因此您需要使用 presence_of_element_located() ,而不是像element_to_be_clickable(locator)那样使用Expected_conditions: / p>

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

中找到相关的详细讨论