Selemium webdriver:驱动程序尝试使用隐式等待超时查找元素的次数是多少?

时间:2015-07-21 22:37:22

标签: java selenium selenium-webdriver webdriver

说我有这样的代码:

Webdriver driver = new ChromeDriver();
driver.manage().timeout().implicitWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("nothing"));

我无法理解Selenium doc中的这一行:隐式等待是告诉WebDriver在尝试查找一个或多个元素(如果它们不是立即可用)时轮询DOM一段时间。

这是否意味着司机会在第一次尝试找到该元素之前等待10秒?或者它是否意味着驱动程序将首先找到该元素,如果没有找到,等待10秒,然后再次找到,如果没有找到则抛出timeoutexception?驱动程序试图总共找到两次元素?

2 个答案:

答案 0 :(得分:1)

您可以通过将JSON Wire protocol commands记录到 Chrome服务日志中来实现清理。我们假设我们有这个Python代码(为了举个例子):

from selenium import webdriver

driver = webdriver.Chrome(service_log_path="/tmp/log")
driver.get("http://www.google.com")

driver.find_element_by_css_selector("strange.non.existing.element")

driver.quit()

我们立即获得NoSuchElementException/tmp/log我们有:{/ p>

[2.134][INFO]: COMMAND Navigate {
   "sessionId": "920fbde18d13995672cbbdd0a15e905a",
   "url": "http://www.google.com"
}
[2.195][INFO]: Waiting for pending navigations...
[2.239][INFO]: Done waiting for pending navigations
[2.593][INFO]: Waiting for pending navigations...
[3.704][INFO]: Done waiting for pending navigations
[3.704][INFO]: RESPONSE Navigate
[3.706][INFO]: COMMAND FindElement {
   "sessionId": "920fbde18d13995672cbbdd0a15e905a",
   "using": "css selector",
   "value": "strange.non.existing.element"
}
[3.706][INFO]: Waiting for pending navigations...
[3.706][INFO]: Done waiting for pending navigations
[3.720][INFO]: Waiting for pending navigations...
[3.720][INFO]: Done waiting for pending navigations
[3.720][INFO]: RESPONSE FindElement no such element
  (Session info: chrome=43.0.2357.134)

现在,让我们将隐式等待设置为10秒:

from selenium import webdriver

driver = webdriver.Chrome(service_log_path="/tmp/log")
driver.get("http://www.google.com")

# setting the implicit wait
driver.implicitly_wait(10)

driver.find_element_by_css_selector("strange.non.existing.element")

driver.quit()

现在,如果我们查看日志:

[1.996][INFO]: COMMAND Navigate {
   "sessionId": "657700804d0d8f71b2bfee6dc222c289",
   "url": "http://www.google.com"
}
[2.073][INFO]: Waiting for pending navigations...
[2.106][INFO]: Done waiting for pending navigations
[2.477][INFO]: Waiting for pending navigations...
[3.371][INFO]: Done waiting for pending navigations
[3.371][INFO]: RESPONSE Navigate
[3.374][INFO]: COMMAND SetImplicitWait {
   "ms": 10000.0,
   "sessionId": "657700804d0d8f71b2bfee6dc222c289"
}
[3.374][INFO]: RESPONSE SetImplicitWait
[3.376][INFO]: COMMAND FindElement {
   "sessionId": "657700804d0d8f71b2bfee6dc222c289",
   "using": "css selector",
   "value": "strange.non.existing.element"
}
[3.376][INFO]: Waiting for pending navigations...
[3.376][INFO]: Done waiting for pending navigations
[13.410][INFO]: Waiting for pending navigations...
[13.410][INFO]: Done waiting for pending navigations
[13.410][INFO]: RESPONSE FindElement no such element
  (Session info: chrome=43.0.2357.134)

因为,您可以看到只有一个FindElement命令被发送到WebDriver,但响应又回来了,NoSuchElementException仅在延迟10秒后被抛出。

内部发生的是described in the docs here:在10秒内,它会轮询DOM,试图找到忽略NoSuchElementException的所需元素。当时间到了并且还没有找到任何元素时,它会抛出NoSuchElementException

  

隐式等待是告诉WebDriver对DOM进行轮询   尝试查找一个或多个元素的时间量   没有立即可用。默认设置为0.一旦设置,   隐式等待是为WebDriver对象实例的生命周期设置的。

答案 1 :(得分:0)

如果元素为driver.findElement(By.id("没有"));在您的网页上可以找到webelement并继续下一个代码。如果网页中没有该元素,则驱动程序将等待10秒,因为您给出了隐式等待10秒。由于未找到元素,因此测试将失败。所以只有一次驾驶员试图找到这个元素。