簡體   English   中英

如何閱讀#shadow-root(用戶代理)下的文本

[英]How to read text that is under #shadow-root (user-agent)

我正在使用 Selenium (Python) 來自動化網頁。 我正在嘗試從 #shadow-root (user-agent) 下的輸入字段中獲取文本。 我使用的 Xpath:

driver.find_element_by_xpath("**//*/p-calendar/span/input**").text

沒有返回任何東西。 附上我的 DOM 元素的屏幕截圖。 要求:從影子根獲取文本:01:01

#shadow-root(用戶代理)

您可以使用driver.execute_script注入返回 ShadowRoot 的 JavaScript 代碼,然后使用find_element獲取您正在尋找的影子根的子元素。

input_shadow = driver.execute_script('''return document.querySelector("$1").shadowRoot''')
div_text = inputShadow.find_element_by_tag_name("div").text

$1 - Your element's identifier or selector

如果您熱衷於使用 xpath 查找元素

input_shadow = driver.execute_script('''return $x(\"//*/p-calendar/span/input\")[0]''')
div_text = inputShadow.find_element_by_tag_name("div").text

根據@hayatoito (Shadow DOM 的創建者)的評論

引入封閉影子樹的最初動機是"Never allow an access to a node in a closed shadow tree, via any APIs, from outside" ,AFAIK。 像這樣,我們無法訪問 Blink 中<video>元素中使用的內部隱藏陰影樹中的節點。

其實我就是這樣設計了一個封閉的影子樹的。 如果有一種方法可以訪問封閉陰影樹中的節點,則應將其視為規范的錯誤。

我認為擁有一個 API 來允許在 Chrome 應用程序或擴展程序層中進行訪問是完全可以的。 但是,對於普通的網絡應用程序,我認為當前的協議是"Never allow it"

如果我們允許,這意味着我們不需要封閉的影子樹。 我認為只要有一棵開放的影子樹就足夠了。

Furhter @Supersharp在他自己的回答下面的評論中,在討論中如何使用 JavaScript 獲取用戶代理影子根中的元素? 提到:

#shadow-root (user-agent)是瀏覽器供應商的本地實現,因此它們沒有記錄並且永遠無法訪問。 根據規范,只有開放的 Shadow DOM


WebDriver 視角

近日,@AutomatedTester [David Burns,Mozilla Corporation 首席培根官]發起了一場關於WebDriver - Web 組件的可測試性的討論

目前, Selenium 團隊開放接受相同的拉取請求。


參考

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


奧特羅

在這里您可以找到有關如何使用 selenium 自動化 shadow DOM 元素的相關討論

暫無
暫無

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

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