Python Selenium 无法使用 Selenium 和 Python 在#shadow-root (open) 中通过 xpath 找到元素

Posted

技术标签:

【中文标题】Python Selenium 无法使用 Selenium 和 Python 在#shadow-root (open) 中通过 xpath 找到元素【英文标题】:Python Selenium can't find element by xpath within #shadow-root (open) using Selenium and Python 【发布时间】:2022-01-15 10:52:19 【问题描述】:

我正在浏览这个网站:https://www.aldi-onlineshop.de/p/multimedia-pc-s23004-md34655-1014700/ 我尝试使用以下脚本单击按钮:“Alle bestätigen”:

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

driver = webdriver.Chrome()
driver.get("https://www.aldi-onlineshop.de/p/multimedia-pc-s23004-md34655-1014700/")
agree = driver.find_element_by_xpath('/html/body/div[4]//div/div/div/div/div/div[2]/div/div/div/div[1]/button')
agree.click()

但这不起作用,它收到了错误:

no such element: Unable to locate element: "method":"xpath","selector":"/html/body/div[4]//div/div/div/div/div/div[2]/div/div/div/div[1]/button"
(Session info: chrome=96.0.....)

我怎样才能解决这个问题,让它找到元素?

【问题讨论】:

【参考方案1】:

你的xpath可能不正确,建议你一步一步往下走,例如:

 agree = driver.find_element_by_xpath('/html/body/div[4]/)

如果正确:

 agree = driver.find_element_by_xpath('/html/body/div[4]/div/)

...

我注意到的另一件事是,双重"//" 是想要的吗? ('/html/body/div[4]//div...)

【讨论】:

【参考方案2】:

元素Alle bestätigen按钮在#shadow-root (open)


解决方案

在你需要使用querySelector()的所需元素上click(),你可以使用以下Locator Strategy:

driver.get("https://www.aldi-onlineshop.de/p/multimedia-pc-s23004-md34655-1014700/")
time.sleep(5)
driver.execute_script('''return document.querySelector('div#usercentrics-root').shadowRoot.querySelector('button[data-testid="uc-accept-all-button"]')''').click()
        

参考文献

您可以在以下位置找到一些相关的详细讨论:

How to extract info within a #shadow-root (open) using Selenium Python? How to get past a cookie agreement page using Python and Selenium?

【讨论】:

非常感谢。这对我有用。但是为什么我的代码不起作用?它会与 ec 可见性或类似的东西一起工作吗? 如果有#shadow-root (open),你必须使用querySelector()。即使是WebDriverWait 一个人也做不到。

以上是关于Python Selenium 无法使用 Selenium 和 Python 在#shadow-root (open) 中通过 xpath 找到元素的主要内容,如果未能解决你的问题,请参考以下文章

Selenium 似乎无法在 Firefox 49.0 上正常工作,有人熟悉吗?

无法通过 perl 绑定连接 selenium webDriver

python+selenium ?????????????????? ??????

按 ID 查找元素无法识别 - Selenium

Selenium2+python自动化1-环境搭建(悠悠课程之路)

使用 Selenium 和 Robot Framework 遍历 Web 元素