假设我有这样的代码:
Webdriver driver = new ChromeDriver();
driver.manage().timeout().implicitWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("nothing"));
我很难理解Selenium文档中的这一行:隐式等待是告诉WebDriver在试图查找一个或多个元素(如果它们不能立即可用)时轮询DOM一定时间。
那么这是否意味着驱动程序将等待10秒,然后才会首先尝试查找元素?或者这是否意味着驱动程序将首先找到元素,如果没有找到,等待10秒,然后再次查找,如果没有找到,则抛出timeout异常?驱动程序总共尝试查找元素两次?
实际上,您可以通过将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。