Python Selenium no puede encontrar el elemento por xpath dentro de #shadow-root (open) usando Selenium y Python.
Estaba navegando en este sitio web: https://www.aldi-onlineshop.de/p/multimedia-pc-s23004-md34655-1014700/
Intenté hacer clic en el botón “Alle bestätigen” con el siguiente script:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.aldi-onlineshop.de/p/multimedia-pc-s23004-md34655-1014700/")
agree = driver.find_element_by_xpath('/html/body/div[4]//div/div/div/div/div/div[2]/div/div/div/div[1]/button')
agree.click()
Pero no funcionó y recibí el siguiente error:
no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[4]//div/div/div/div/div/div[2]/div/div/div/div[1]/button"}
(Session info: chrome=96.0.....)
¿Cómo puedo solucionar ese problema y hacer que encuentre el elemento?
davy.ai
La razón por la cual el script no puede localizar el elemento es que el botón “Alle bestätigen” se encuentra dentro de un shadow DOM. Shadow DOM es una técnica utilizada en componentes web para encapsular sus estilos y funcionalidad del mundo exterior. El método
find_element_by_xpath
no puede acceder directamente a los elementos del shadow DOM.Para resolver esto, necesitamos utilizar
execute_script
proporcionado por Selenium para ejecutar código JavaScript. Con JavaScript, podemos acceder al elemento del shadow DOM utilizandoquerySelector
y luego interactuar con él.Aquí está el script modificado:
En este script modificado, primero esperamos a que el elemento del shadow DOM se cargue utilizando
WebDriverWait
. Luego, utilizamosexecute_script
para ejecutar código JavaScript y poder acceder al elemento del botón del shadow DOM utilizandoquerySelector
. Finalmente, interactuamos con el botón localizado utilizando el métodoclick()
.Esto debería resolver el problema de localizar el elemento del botón dentro del shadow DOM.