Comment lire du texte sous # shadow-root (user-agent)

Sep 17 2020

J'utilise Selenium (Python) pour automatiser une page Web. J'essaie d'obtenir du texte à partir d'un champ de saisie qui se trouve sous # shadow-root (user-agent). Xpath j'ai utilisé:

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

ne renvoie rien. Ci-joint la capture d'écran de mon élément DOM. Condition: pour obtenir du texte à partir de la racine de l'ombre: 01:01

Réponses

1 DebanjanB Sep 17 2020 at 03:43

Selon le commentaire de@hayatoito (créateur de Shadow DOM) :

La motivation originale de l'introduction d'un arbre d'ombre fermé est "Never allow an access to a node in a closed shadow tree, via any APIs, from outside", AFAIK. Comme ça on ne peut pas accéder à un nœud dans l'arbre d'ombre caché interne qui est utilisé dans <video>element, dans Blink.

En fait, j'ai conçu un arbre d'ombre fermé de cette manière. S'il existe un moyen d'accéder à un nœud dans un arbre d'ombre fermé, cela doit être considéré comme un bogue de la spécification.

Je pense qu'il est tout à fait normal d'avoir une API pour permettre un accès dans la couche d'applications ou d'extensions Chrome. Cependant, pour une application Web normale, je pense que l'accord actuel l'est "Never allow it".

Si nous le permettons, cela signifie que nous n'avons pas besoin d'un arbre d'ombre fermé. Le simple fait d'avoir un arbre d'ombre ouvert suffit, je pense.

Furhter @Supersharpdans son commentaire ci-dessous sa propre réponse dans la discussion Comment obtenir l'élément dans la racine de l'ombre de l'agent utilisateur avec JavaScript? mentionne:

#shadow-root (user-agent)sont une implémentation native des fournisseurs de navigateurs, ils ne sont donc pas documentés et ne seront jamais accessibles. Seuls les DOM Shadow ouverts sont, selon les spécifications


Perspective WebDriver

Récemment, @AutomatedTester [David Burns, Chief Bacon Officer, Mozilla Corporation] a lancé une discussion sur WebDriver - Testabilité des composants Web

  • Demandes
  • Les propositions
  • Traqueur d'incidents

Actuellement, l' équipe Selenium est ouverte pour accepter les demandes d'extraction pour le même.


Référence

Vous pouvez trouver quelques discussions détaillées pertinentes dans:

  • Besoin d'aide pour cliquer sur l'élément sous le type Shadow Root (fermé)

Outro

Vous trouverez ici une discussion pertinente sur Comment automatiser les éléments shadow DOM à l'aide du sélénium?

AlvinOgwu Sep 17 2020 at 00:42

Vous pouvez utiliser driver.execute_scriptpour injecter du code JavaScript qui renvoie le ShadowRoot, puis l'utiliser find_elementpour obtenir l'élément children de la racine de l'ombre que vous recherchez.

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.

Si vous souhaitez utiliser xpath pour trouver des éléments

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