Lesen von Text unter # shadow-root (Benutzeragent)

Sep 17 2020

Ich verwende Selenium (Python) zur Automatisierung einer Webseite. Ich versuche, Text aus einem Eingabefeld abzurufen, das sich unter # shadow-root (Benutzeragent) befindet. Xpath, den ich verwendet habe:

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

gibt nichts zurück. Hängte den Screenshot meines DOM-Elements an. Voraussetzung: Um Text von der Schattenwurzel zu erhalten: 01:01

Antworten

1 DebanjanB Sep 17 2020 at 03:43

Wie pro @hayatoito‚s (creator of Shadow DOM) Kommentar :

Die ursprüngliche Motivation für die Einführung eines geschlossenen Schattenbaums ist "Never allow an access to a node in a closed shadow tree, via any APIs, from outside"AFAIK. Auf diese Weise können wir nicht auf einen Knoten im internen versteckten Schattenbaum zugreifen, der im <video>Element in Blink verwendet wird.

Tatsächlich habe ich einen geschlossenen Schattenbaum so entworfen. Wenn es eine Möglichkeit gibt, auf einen Knoten in einem geschlossenen Schattenbaum zuzugreifen, sollte dies als Fehler der Spezifikation betrachtet werden.

Ich denke, es ist völlig in Ordnung, eine API zu haben, um einen Zugriff auf die Ebene der Chrome-Apps oder -Erweiterungen zu ermöglichen. Für eine normale Web-App denke ich jedoch, dass die aktuelle Vereinbarung ist "Never allow it".

Wenn wir es zulassen, brauchen wir keinen geschlossenen Schattenbaum. Nur einen offenen Schattenbaum zu haben, reicht aus, denke ich.

Weiter @Supersharpin seinem Kommentar unter seiner eigenen Antwort in der Diskussion Wie bekomme ich Element in User-Agent Schattenwurzel mit JavaScript? Erwähnungen:

#shadow-root (user-agent)sind native Implementierungen von Browser-Anbietern, daher sind sie nicht dokumentiert und werden niemals zugänglich sein. Nur offenes Schatten-DOM sind gemäß den Spezifikationen


WebDriver-Perspektive

Vor kurzem hat @AutomatedTester [David Burns, Chief Bacon Officer der Mozilla Corporation] eine Diskussion über WebDriver - Testbarkeit von Webkomponenten eingeleitet

  • Anfragen
  • Vorschläge
  • Issue Tracker

Derzeit ist das Selenium-Team offen für die Annahme von Pull-Anfragen.


Referenz

Einige relevante ausführliche Diskussionen finden Sie in:

  • Benötigen Sie Hilfe, um auf das Element unter dem Schattenwurzeltyp (geschlossen) zu klicken?

Outro

Hier finden Sie eine relevante Diskussion zum Automatisieren von Schatten-DOM-Elementen mit Selen.

AlvinOgwu Sep 17 2020 at 00:42

Sie können driver.execute_scriptJavaScript-Code einfügen, der den ShadowRoot zurückgibt, und dann das untergeordnete find_elementElement der gesuchten Schattenwurzel abrufen .

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.

Wenn Sie xpath verwenden möchten, um Elemente zu finden

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