当元素为 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自动化测试时,如何处理弹出框?

android软键盘弹出时如何处理页面布局

当数据库为表中的一列返回空值时如何处理错误

当 ListView 有 ItemTemplate 时如何处理 ListViewItem 的右键单击?

JWT:当用户打开新标签时如何处理 GET 请求?

JWT:当用户打开新标签时如何处理 GET 请求?