提问者:小点点

Selemium webdriver:驱动程序会尝试多少次查找带有隐式等待超时的元素?


假设我有这样的代码:

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

我很难理解Selenium文档中的这一行:隐式等待是告诉WebDriver在试图查找一个或多个元素(如果它们不能立即可用)时轮询DOM一定时间。

那么这是否意味着驱动程序将等待10秒,然后才会首先尝试查找元素?或者这是否意味着驱动程序将首先找到元素,如果没有找到,等待10秒,然后再次查找,如果没有找到,则抛出timeout异常?驱动程序总共尝试查找元素两次?


共2个答案

匿名用户

实际上,您可以通过将JSON Wire协议命令记录到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中,我们有:

[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)

正如您所看到的,只有一个< code>FindElement命令被发送到WebDriver,但是只有在10秒钟的延迟后才得到响应和抛出< code > NoSuchElementException 。

内部发生的事情在这里的文档中进行了描述:在 10 秒内,它会轮询 DOM 试图找到所需的元素,忽略 NoSuchElementException。当时间到了并且没有找到元素时,它会抛出NoSuchElementException

隐式等待是告诉 WebDriver 在尝试查找一个或多个元素(如果它们不是立即可用)时轮询 DOM 一段时间。默认设置为 0。设置后,将为 WebDriver 对象实例的生存期设置隐式等待。

匿名用户

如果元素driver . find element(by . id(" nothing "));它将找到webelement并继续下一个代码。如果webelement不在网页中,那么驱动程序将等待10秒,就像您给出的隐式等待10秒一样。最后测试会失败,因为没有找到元素。因此只有一次驱动程序试图找到webelement。