无法在 python selenium 中使用 selenium chrome webdriver 定位元素

Posted

技术标签:

【中文标题】无法在 python selenium 中使用 selenium chrome webdriver 定位元素【英文标题】:Unable to locate element using selenium chrome webdriver in python selenium 【发布时间】:2021-04-12 16:31:39 【问题描述】:

我是 python 新手,正在尝试做一些网页抓取,但有一些实际问题。或许你能帮帮我。

html

<input autocomplete="off" type="search" name="search-search-field" placeholder="150k companies worldwide" data-cy-id="search-search-field" class="sc-dnqmqq grpFhe" value="">

我的代码的第一部分如下所示,运行良好,没有任何问题:

driver.get("https:")
login = driver.find_element_by_xpath(email_xpath).send_keys(email)
login = driver.find_element_by_xpath(pwd_xpath).send_keys(pwd)
login = driver.find_element_by_xpath(continue_xpath)
login.click()
time.sleep(10)

email 和 pwd 是变量,包括我的登录详细信息。正如我所说,这部分工作得很好。

我遇到的问题与以下代码行有关:

search = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/header/div/nav/div[1]/div/div/fieldset/input')

因此我收到以下错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: "method":"xpath","selector":"/html/body/div[1]/div/div[1]/header/div/nav/div[1]/div/div/fieldset/input"
 

我试了又试,但无法解决问题。如果有人可以帮助我,我将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

不要使用绝对的 xpath 或 css ,总是使用相对的,因为它更稳定

绝对(完整)xpath 将取决于父级,因此如果父级更改,定位器将无法找到元素

在 xpath 和 css 中,定位器可以以如下形式使用:

//tagname[@attributename="attriubutevalue"]   - Xpath
tagname[attributename="attriubutevalue"]      - CSS

因此您可以使用任何属性、类型、名称、id、类,以及元素中的任何属性,例如:

//input[@type="search"]  - xpath
input[type="search"]   - css


search = driver.find_element_by_xpath('//input[@type="search"]')

尝试等待:

WebDriverWait(driver,15).until(EC.presence_of_element_located((By.XPATH, '//input[@type="search"]')))

【讨论】:

Ty PDHide,你有具体的程序代码我可以测试吗? @Numpy search = driver.find_element_by_xpath('//input[@type="search"]') Ty,但不幸的是仍然出现以下错误:selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:“method”:“xpath”,“selector”:” //输入[@type="search"]" @Numpy 当你使用 wait 时会发生什么? WebDriverWait(driver,15).until(EC.presence_of_element_located((By.XPATH, '//input[@type="search"]'))) ,没有理由它不应该工作 不幸的是仍然返回错误:WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, '//input[@type="search"]'))) File " ...venv\lib\site-packages\selenium\webdriver\support\wait.py",第 80 行,直到引发 TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:【参考方案2】:

要找到搜索字段,您可以使用以下任一Locator Strategies:

使用css_selector

search = driver.find_element_by_css_selector("input[name='search-search-field'][data-cy-id='search-search-field']")

使用xpath:

search = driver.find_element_by_xpath("//input[@name='search-search-field' and @data-cy-id='search-search-field']")

理想情况下,要找到您需要为element_to_be_clickable() 诱导WebDriverWait 的元素,您可以使用以下任一Locator Strategies:

使用CSS_SELECTOR

search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='search-search-field'][data-cy-id='search-search-field']")))

使用XPATH

search = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='search-search-field' and @data-cy-id='search-search-field']")))

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

参考文献

您可以在NoSuchElementException 上找到一些相关讨论:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element while trying to click Next button with selenium selenium in python : NoSuchElementException: Message: no such element: Unable to locate element

【讨论】:

嗨 DebanjanB,非常感谢,但不幸的是,使用 css_selector 和使用您的 xpath 示例都对我有用。我仍然收到如下错误:selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:“method”:“css selector”,“selector”:“input [name ='search-overlay-search -field'][data-cy-id='search-overlay-search-field']" 或者如果我使用 WebDriverWait: search = Web ....) 文件“D:\...”,第 80 行,在直到 raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: @Numpy 这就是我们需要基于文本的元素相关 HTML 的实际原因,以便我们可以在发布之前测试我们的解决方案。 这太奇怪了。由于我使用另一个代码行最大化浏览器窗口使用 xpath 方法的建议,它运行没有任何错误。我使用以下代码: search_xpath = "//input[@name='search-search-field' and @data-cy-id='search-search-field']" driver.maximize_window() search = WebDriverWait(driver , 15).until(EC.presence_of_element_located((By.XPATH, search_xpath))).send_keys("test") 感谢您的支持 DebanjanB,element_to_be_clickable 也可以正常工作,但前提是我之前使用了 Maximize_window()。 太好了,感谢您的支持!【参考方案3】:

下面的 Xpath 可以工作,而且更简单。

/html/body/div[1]//fieldset/input

【讨论】:

Ty James,为我工作!你能告诉我你是如何获得xpath的吗?我使用的xpath,我只是使用了谷歌浏览器的检查选项,并复制了完整的xpath。 使用 chrome 开发者工具我注意到你正在寻找的元素是 fieldset 元素的第一个实例。我简化了您在第一个字段集中获取输入的路径。这实际上可以简化为//fieldset/input 太棒了,詹姆斯!

以上是关于无法在 python selenium 中使用 selenium chrome webdriver 定位元素的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 unittest 使用 python 运行 selenium

使用 Selenium 提取 span 文本内容

如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?

带有Python的Selenium Webdriver - 无法使用Selenium Web驱动程序在Web应用程序中提供输入(Date)

python selenium 无法使用 Firefox 扩展 - 消息:无法加载配置文件。简介目录

cx_freeze 使 selenium 无法在 python 中截屏