您实际上可以通过将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)
您可以看到只有一个FindElement 命令发送到WebDriver,但响应得到了回复,NoSuchElementException 在延迟 10 秒后才被抛出。
内部发生的是described in the docs here:在 10 秒内它轮询 DOM 试图找到所需的元素而忽略 NoSuchElementException。当时间到了但还没有找到元素时,它会抛出NoSuchElementException:
隐式等待是告诉 WebDriver 轮询 DOM
尝试查找一个或多个元素(如果它们是)时的时间量
无法立即使用。默认设置为 0。一旦设置,
为 WebDriver 对象实例的生命周期设置了隐式等待。