簡體   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