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

时间:2019-08-14 23:23:50

标签: python selenium

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

详细信息:我正在使用

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

从chrome浏览器弹出历史记录,然后按硒等待元素, 然后尝试通过以下方法单击它:

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

或通过:

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

两者都不起作用

您是否可以通过xpath告诉解决方案,因为我比较熟悉。或通过其他任何清除Chrome历史记录的方法,谢谢

2 个答案:

答案 0 :(得分:0)

查看“ Chrome设置”页面的源代码看起来像是您要查找的按钮,它隐藏在ShadowDOM

因此,您需要迭代ShadowRoot的多个级别

enter image description here

所以算法看起来像:

  1. 找到父项WebElement
  2. 找到其shadow-root并将其投放到WebElement
  3. 使用WebElement.find_element()函数找到下一个Web元素,它是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()

答案 1 :(得分:0)

我这样做可以使它起作用:

 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();");