说我有这样的代码:
Webdriver driver = new ChromeDriver();
driver.manage().timeout().implicitWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("nothing"));
我无法理解Selenium doc中的这一行:隐式等待是告诉WebDriver在尝试查找一个或多个元素(如果它们不是立即可用)时轮询DOM一段时间。
这是否意味着司机会在第一次尝试找到该元素之前等待10秒?或者它是否意味着驱动程序将首先找到该元素,如果没有找到,等待10秒,然后再次找到,如果没有找到则抛出timeoutexception?驱动程序试图总共找到两次元素?
答案 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秒。由于未找到元素,因此测试将失败。所以只有一次驾驶员试图找到这个元素。