如何使用Selenium和Python获取Chrome的第一个Element?

问题描述

这是我当前要获取页面的第一个元素(或父元素)的操作:

first_element = page_or_parent.find_element_by_xpath('//*')

我最近才遇到的问题(Chrome和chromedriver版本84)是有时会引发异常:

selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“ method”:“ xpath”,“ selector”:“ // *”}

再次调用相同的方法通常会检索该元素,因此我认为文档树暂时不可用。但是,Web驱动程序日志中没有任何奇怪的提示:

[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()(复数),但是如果元素很多,那么很可能会生成大量数据,并且运行速度会慢得多。我目前能想到的唯一解决方案是捕获异常(如果发生),等待/睡眠,然后重试,但是感觉很脏。

解决方法

您必须等待一段时间,以便页面可以完全加载,然后才能继续执行脚本。否则,您也可以使用wait,如下所示-

# Import 
from selenium.webdriver.support import expected_conditions

wait = WebDriverWait(driver,5)

wait.until(expected_conditions.presence_of_element_located((By.XPATH,"Your XPATH")))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...