繁体   English   中英

python selenium,无法从page_source中找到元素,而可以从浏览器中找到

[英]python selenium, can't find elements from page_source while can find from browser

我尝试通过 xpath 查找目标元素,以便我可以单击它。 但是在运行代码时找不到它,虽然可以在chrome浏览器上通过右键单击选项手动找到它。

详细信息:我正在使用

driver.get('chrome://settings/clearBrowserData')

从 chrome 获取历史弹出窗口,然后通过 selenium 等待元素,然后我尝试通过以下方式单击它:

driver.find_element_by_css_selector('* /deep/ #clearBrowsingDataConfirm').click()

或通过:

driver.find_element_by_xpath(r'//paper-button[@id="clearBrowsingDataConfirm"]').click()

两者都不起作用

如果可能,您能否通过 xpath 告诉解决方案,因为我更熟悉它。 或任何其他方式来清除 chrome 上的历史记录,谢谢

查看 Chrome 设置页面源,它​​看起来像按钮,你正在寻找隐藏在ShadowDOM 中

所以需要向下迭代几层ShadowRoot

在此处输入图片说明

所以算法看起来像:

  1. 定位父WebElement
  2. 找到它的shadow-root并将其投射到 WebElement
  3. 使用WebElement.find_element()函数定位下一个 WebElement,它是 ShadowRoot 的父级
  4. 重复步骤 1-3,直到您与要与之交互的元素处于相同的上下文中

示例代码:

from selenium import webdriver

def expand_root_element(element):
    shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root


driver = webdriver.Chrome("c:\\apps\\webdriver\\chromedriver.exe")
driver.maximize_window()
driver.get("chrome://settings/clearBrowserData")

settingsUi = driver.find_element_by_tag_name("settings-ui")
settingsUiShadowRoot = expand_root_element(settingsUi)

settingsMain = settingsUiShadowRoot.find_element_by_tag_name("settings-main")
settingsShadowRoot = expand_root_element(settingsMain)
settingsBasicPage = settingsShadowRoot.find_element_by_tag_name("settings-basic-page")
settingsBasicPageShadowroot = expand_root_element(settingsBasicPage)
settingsPrivacyPage = settingsBasicPageShadowroot.find_element_by_tag_name("settings-privacy-page")
settingsPrivacyShadowRoot = expand_root_element(settingsPrivacyPage)
settingsClearBrowsingDataDialog = settingsPrivacyShadowRoot.find_element_by_tag_name(
    "settings-clear-browsing-data-dialog")
settingsClearBrowsingDataDialogShadowRoot = expand_root_element(settingsClearBrowsingDataDialog)
settingsClearBrowsingDataDialogShadowRoot.find_element_by_id("clearBrowsingDataConfirm").click()

我通过这样做让它工作:

 driver.ExecuteScript("return document.querySelector('body > settings-ui').shadowRoot.querySelector('#main').shadowRoot.querySelector('settings-basic-page').shadowRoot.querySelector('#advancedPage > settings-section:nth-child(1) > settings-privacy-page').shadowRoot.querySelector('settings-clear-browsing-data-dialog').shadowRoot.querySelector('#clearBrowsingDataConfirm').click();");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM