python-3.x 关闭的Shadow DOM中的选择按钮,使用Selenium

r9f1avp5  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(141)

我试图解决一个谷歌验证码与 selenium ,使用Python
我使用this简单的例子网站进行测试,但我有困难理解如何选择一个按钮,是在一个阴影根。
这个图像显示了我需要获取的按钮元素。

我知道我需要先获取外部的div元素,然后搜索内部的元素,但是我没有这样做,因为我并不100%清楚如何在执行以下操作后导航到内部元素:
driver.execute_script("return document.querySelector('div[class=\"button-holder help-button-holder\"]')
This问题是关于类似的(相同?))问题,但没有工作解决方案。

7kjnsjlb

7kjnsjlb1#

元素被放置在shadow-root中,状态为closed
当影子根的模式为“closed”时,影子根的实现内部是不可访问和不可更改的,因此您无法访问shadowRoot属性。
由于Selenium实现了CDP协议API,因此在页面加载时,可以使用open状态覆盖shadow-rootclosed状态。
您只需要覆盖Element类原型方法attachShadow,并在页面加载之前在新文档上评估脚本。
How to override Element properties
How to executed script on load via CDP Protocol

代码示例:

url = "yourUrl"
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': """
Element.prototype._attachShadow = Element.prototype.attachShadow;
Element.prototype.attachShadow = function () {
    return this._attachShadow( { mode: "open" } );
};
"""})
driver.get(url)
closed_shadow_host = driver.find_element(By.CSS_SELECTOR, 'div[class=\"button-holder help-button-holder\"]')
shadow_root = driver.execute_script('return arguments[0].shadowRoot', closed_shadow_host)

相关问题