【发布时间】:2020-08-11 16:54:40
【问题描述】:
这是我目前获取页面第一个元素(或父元素)的方法:
first_element = page_or_parent.find_element_by_xpath('//*')
我最近才遇到的问题(Chrome 和chromedriver 84 版)是有时这会引发异常:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*"}
再次调用相同的方法通常会检索元素,因此我认为文档树暂时不可用。但是,网络驱动程序日志并没有显示任何异常:
[1597164661.317][INFO]: [d88526be26bd6364d1b0ed2dab9d5733] COMMAND FindElement {
"using": "xpath",
"value": "//*"
}
[1597164661.317][INFO]: Waiting for pending navigations...
[1597164661.317][INFO]: Done waiting for pending navigations. Status: ok
[1597164661.418][INFO]: Waiting for pending navigations...
[1597164661.418][INFO]: Done waiting for pending navigations. Status: ok
[1597164661.418][INFO]: [d88526be26bd6364d1b0ed2dab9d5733] RESPONSE FindElement ERROR no such element: Unable to locate element: {"method":"xpath","selector":"//*"}
(Session info: chrome=84.0.4147.89)
然后我的主要问题是如何可靠地获取第一个元素?
有没有比我现在使用 XPath 更好的方法?我考虑过find_elements_by_xpath()(复数),但如果有很多元素,那么可能会生成大量数据并且运行速度会慢得多。目前我能想到的唯一解决方案是在异常发生时捕获异常,等待/睡眠,然后重试,但感觉很脏。
【问题讨论】:
标签: python selenium xpath selenium-chromedriver