当元素为 data-testid 时如何处理弹出“接受所有 cookie” - 在 Python 中使用 Selenium
Posted
技术标签:
【中文标题】当元素为 data-testid 时如何处理弹出“接受所有 cookie” - 在 Python 中使用 Selenium【英文标题】:How to handle the popup "Accepting all cookies" when the element is data-testid - Using Selenium in Python 【发布时间】:2022-01-17 15:49:12 【问题描述】:所以我开始了一个新项目来帮助我工作的太阳能电池板的中型业务......基本上我想用硒从特定网站获取数据并在我的 GUI 上看到它的另一个朋友我正在处理它......我的主要问题是当我使用 python 打开带有 selenium 的网站时,弹出的 cookie“接受所有 cookie”已经显示出来,因为我是 selenium 的新手,我不知道如何处理我已经搜索了大约 2 天来解决这个问题,但我尝试过的任何方法都没有奏效,所以我认为我是特例 xD...
以下是你们需要知道的所有信息,以帮助我:
► 网址◄
https://www.kostal-solar-portal.com/#/
► 图片◄
[图1]=https://i.stack.imgur.com/ZR89s.png|
[图2]=https://i.stack.imgur.com/Zirft.png|
► 代码◄
`driver = webdriver.Chrome(PATH)
driver.implicitly_wait(10)
kostal_url = "https://www.kostal-solar-portal.com/#/"
driver.get(kostal_url)
driver.find_element_by_xpath('//*[@id="usercentrics-root"]//div/div/div[1]')
cookies = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH,)))
cookies.click()`
►错误◄
Traceback (most recent call last):
File "c:/Users/Hp/Desktop/ΜΑΚΗΣ/App/open_websites.py", line 27, in <module>
driver.find_element_by_xpath('//*[@id="usercentrics-root"]//div/div/div[1]')
File "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 520, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1246, in find_element
'value': value)['value']
File "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
self.error_handler.check_response(response)
File "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: "method":"xpath","selector":"//*[@id="usercentrics-root"]//div/div/div[1]"
【问题讨论】:
【参考方案1】:您尝试访问的元素位于 Shadow Root 内。 因此,您首先需要进入该影子根,然后获取“接受 cookie”元素。 您还应该改进定位器。 这应该有效:
driver = webdriver.Chrome(PATH)
driver.implicitly_wait(10)
kostal_url = "https://www.kostal-solar-portal.com/#/"
driver.get(kostal_url)
shadow_section = driver.execute_script('return arguments[0].shadowRoot', find_element_by_id("usercentrics-root"))
shadow_section.find_element_by_css('button[data-testid="uc-accept-all-button"]').click()
【讨论】:
感谢您的宝贵时间...但我发现上面的答案更简单! :* 他的回答并不简单,它只是在 1 个复杂的 javascript 脚本中结合了 2 个动作...... @DebanjanB 我不确定。至少有时它会使代码变得不那么清晰,更难调试。在这种特定情况下,我不知道哪种方法更好。【参考方案2】:元素Accept All在#shadow-root (open)内。
解决方案
要点击Accept All,您必须使用shadowRoot.querySelector()
,您可以使用以下Locator Strategy:
代码块:
driver.get("https://www.kostal-solar-portal.com/#/")
time.sleep(5)
element = driver.execute_script("""return document.querySelector('#usercentrics-root').shadowRoot.querySelector("button[data-testid='uc-accept-all-button']")""")
element.click()
参考文献
您可以在以下位置找到一些相关讨论:
Can't locate elments within shadow-root (open) using Python Selenium How to get past a cookie agreement page using Python and Selenium?【讨论】:
谢谢你从字面上拯救了我的一天!......顺便说一下,你放在那里的#shadow-root(open)链接是用Java编写的,所以我直接进入你的代码块并复制全部 xD ......尽管我有一个问题,如果我离开 driver.implicity_wait(10) 看到下面的答案,我应该能够删除睡眠方法吗? @Thomas 查看其他嵌入式链接和参考资料。我不确定,但implicity_wait()
在这里可能无效,但您仍然可能想测试一下。以上是关于当元素为 data-testid 时如何处理弹出“接受所有 cookie” - 在 Python 中使用 Selenium的主要内容,如果未能解决你的问题,请参考以下文章
使用Selenium框架在做Web自动化测试时,如何处理弹出框?