您可以通过将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
我们:
[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)
由于您可以看到发送给WebDriver的命令只有一个FindElement
,但响应返回并且NoSuchElementException
仅在延迟10秒后才抛出。
什么内部发生是described in the docs here:对于10为秒,轮询DOM试图找到所需的元素忽略NoSuchElementException
。当时间到了,并没有元素发现但它会抛出NoSuchElementException
:
隐含的等待是告诉webdriver的轮询DOM一定 的时间努力,如果他们 找到一种或多种元素时没有立即可用。默认设置为0.一旦设置, 隐式等待设置为WebDriver对象实例的生命周期。
看看[QA](http://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-pageloading)。 [Ardesco](http://sqa.stackexchange.com/users/540/ardesco)的回答;隐式超时指定驱动程序在搜索元素时如果不立即出现,应该等待的时间量。 – lloyd