El siguiente código funciona porque puedo hacer clic en un botón en la página web usando Python/Selenium/Firefox.
driver.execute_script('''return document.querySelector('dba-app').shadowRoot.getElementById('configRenderer').shadowRoot.querySelector('ing-default-layout-14579').querySelector('dba-overview').shadowRoot.querySelector('ing-feat-agreement-overview').shadowRoot.querySelector('ing-ow-overflow-menu-14587').shadowRoot.querySelector('button')''').click()Sin embargo, algunos elementos son dinámicos y los números cambian cada vez que vuelve a ejecutar el script.
Los elementos cambiantes:
¿Qué debo hacer para sortear los elementos dinámicos?
Una opción es buscar otros atributos que permanezcan iguales en todas las cargas de página. Por ejemplo, dado su HTML, podría hacer:
document.querySelector('#configRenderer') // returns the config renderer element document.querySelector('[data-tag-name="ing-default-layout"]') // returns the ing-default-layout element document.querySelector('[data-tag-name="dba-overview]') // returns the dba-overview elementY así. O podría usar el mismo método para identificar a un padre o un hijo, y luego navegar hasta el hijo o el padre, respectivamente.
Si el HTML no es lo suficientemente estable incluso para eso, otro enfoque sería buscar a través de todos los elementos y encontrar aquellos cuyo nombre de tagName comience con lo que necesita.
for (const elm of document.querySelectorAll('*')) { if (elm.tagName.toLowerCase().startsWith('ing-ow-overflow-menu')) { // do stuff with elm, which is the overflow menu element } }