簡體   English   中英

無法使用 Selenium 和 Python 在 #shadow-root(打開)中找到登錄元素

[英]Unable to locate the Sign In element within #shadow-root (open) using Selenium and Python

我正在嘗試使用 selenium 來自動執行某些操作,但無法在頁面https://developer.servicenow.com/dev.do上找到第一個元素,因此無法登錄

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver_path = "../bin/chromedriver.exe"
driver = webdriver.Chrome(driver_path)

driver.get("https://developer.servicenow.com/dev.do")

driver.find_element_by_xpath("/html/body/dps-app//div/header/dps-navigation-header//header/div/div[2]/ul/li[3]/dps-login//div/dps-button//button/span")

我得到錯誤

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/dps-app//div/header/dps-navigation-header//header/div/div[2]/ul/li[3]/dps-login//div/dps-button//button/span"}

登錄按鈕位於多個#shadow-root (open)的深處

shadow-root-open-multiple


解決方案

要在所需元素上click() ,您可以使用shadowRoot.querySelector()並且可以使用以下定位器策略

from selenium import webdriver

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get('https://developer.servicenow.com/dev.do')
SignInButton = driver.execute_script("return document.querySelector('dps-app').shadowRoot.querySelector('dps-navigation-header').shadowRoot.querySelector('header.dps-navigation-header dps-login').shadowRoot.querySelector('dps-button')")
SignInButton.click()
        
  • 瀏覽器快照:

影子根打開


參考

您可以在以下位置找到一些相關的詳細討論:

您可以查看 servicenow 商店中的 Automatepro 應用程序。 它使用 selenium,但他們在幕后預先編寫了 selenium 以與所有 servicenow UI 組件進行交互,包括使用影子 DOM 的組件。 您只需選擇 UI 元素並為您的測試提供數據。 我們發現它可以節省大量時間編寫和維護 selenium 代碼。

這個解決方案是我使用 Powershell 登錄我的實例所尋找的。

driver.executescript("return document.querySelector('dps-app').shadowRoot.querySelector('dps-navigation-header').shadowRoot.querySelector('header.dps-navigation-header dps-login').shadowRoot.querySelector('dps-button')").Click()

我認為這是因為您試圖在網站有時間加載所有元素之前訪問“登錄”。

我建議你使用

driver.set_page_load_timeout(120)

所以 selenium 將在網站上加載所有內容后查找按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM