es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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 utilizando querySelector y luego interactuar con él.

    Aquí está el script modificado:

    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/")
    
    # Esperar a que se cargue el elemento del shadow DOM
    wait = WebDriverWait(driver, 10)
    shadow_root = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".uc-btn-group__item:nth-child(2)")))
    # Acceder al elemento del shadow DOM utilizando JavaScript
    agree_button = driver.execute_script('return arguments[0].shadowRoot.querySelector("button")', shadow_root)
    agree_button.click()
    

    En este script modificado, primero esperamos a que el elemento del shadow DOM se cargue utilizando WebDriverWait. Luego, utilizamos execute_script para ejecutar código JavaScript y poder acceder al elemento del botón del shadow DOM utilizando querySelector. Finalmente, interactuamos con el botón localizado utilizando el método click().

    Esto debería resolver el problema de localizar el elemento del botón dentro del shadow DOM.

Comments are closed.