Como ler o texto que está sob # shadow-root (user-agent)

Sep 17 2020

Estou usando Selenium (Python) para automatizar uma página da web. Estou tentando obter texto de um campo de entrada que está em # shadow-root (user-agent). Xpath que usei:

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

não está devolvendo nada. Anexado a captura de tela do meu elemento DOM. Requisito: Para obter texto da raiz da sombra: 01:01

Respostas

1 DebanjanB Sep 17 2020 at 03:43

Como por @hayatoito's (criador de Sombra DOM) comentário :

A motivação original de introduzir uma árvore de sombra fechada é "Never allow an access to a node in a closed shadow tree, via any APIs, from outside", AFAIK. Assim, não podemos acessar um nó na árvore de sombra interna oculta que é usada no <video>elemento, no Blink.

Na verdade, eu projetei uma árvore de sombra fechada dessa maneira. Se houver uma maneira de acessar um nó em uma árvore de sombra fechada, isso deve ser considerado um bug da especificação.

Eu acho que está tudo bem ter uma API para permitir um acesso na camada de aplicativos ou extensões do Chrome. No entanto, para um aplicativo da web normal, acho que o acordo atual é "Never allow it".

Se permitirmos, isso significa que não precisamos de uma árvore de sombra fechada. Apenas ter uma árvore de sombra aberta é o suficiente, eu acho.

Continue @Supersharpem seu comentário abaixo de sua própria resposta na discussão Como obter o elemento na raiz sombra do agente do usuário com JavaScript? menções:

#shadow-root (user-agent)são implementações nativas de fornecedores de navegadores, portanto, não são documentadas e nunca estarão acessíveis. Apenas o Shadow DOM aberto é, de acordo com as especificações


Perspectiva WebDriver

Recentemente, @AutomatedTester [David Burns, Chief Bacon Officer, Mozilla Corporation] iniciou uma discussão sobre WebDriver - Testabilidade de componentes da web

  • solicitações de
  • Propostas
  • Rastreador de problemas

Atualmente a Selenium Team está aberta para aceitar solicitações pull para o mesmo.


Referência

Você pode encontrar algumas discussões detalhadas relevantes em:

  • Precisa de ajuda para clicar no elemento sob a sombra do tipo Root (fechado)

Outro

Aqui você pode encontrar uma discussão relevante sobre como automatizar elementos DOM sombra usando selênio?

AlvinOgwu Sep 17 2020 at 00:42

Você pode usar driver.execute_scriptpara injetar o código JavaScript que retorna o ShadowRoot e então usar find_elementpara obter o elemento filho da raiz da sombra que você está procurando.

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.

Se você estiver interessado em usar o xpath para encontrar elementos

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