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.

Error de NoSuchElementException al extraer el texto del elemento #shadow-raíz (abierta) utilizando Selenium Python.

Actualmente estoy usando Selenium para obtener la información del producto de Schneider Electric y este es el error que estoy recibiendo:

selenium.common.exceptions.NoSuchElementException: Mensaje:
no hay tal elemento: no se puede localizar el elemento:
{"method":"xpath","selector":"/html/body/div[2]/main/div[5]/ul/li/div/div/div/div/div/ul/li[1]/div/div/div[2]/div[2]/section/div/product-cards-wrapper//div/ul/li[1]/product-card/artículo/div/div[1]/product-card-main-info//div/pes-router-link[2]/a/h3"}

Actualmente, el sitio web del que estoy intentando obtener esta información es esta URL: https://www.se.com/us/en/product-range/63426-powerlogic-accusine-pcs%2B/?N=4176697776&No=0&Nrpp=12

El archivo Xpath es para la descripción de sus productos, que según mi inspección y hallazgos es este:

/html/body/div[2]/main/div[5]/ul/li/div/div/div/div/div/ul/li[1]/div/div/div[2]/div[2]/section/div/product-cards-wrapper//div/ul/li[1]/product-card//artículo/div/div[2]/div[1]/pes-product-price/p/span[1]

¿Alguna idea?

Código actual:

def page_function():
    driver.get('https://www.se.com/us/en/product-range/63426-powerlogic-accusine-pcs%2B/?N=4176697776&No=12&Nrpp=12')
    driver.maximize_window()
    # obtiene la cantidad de productos en la barra de búsqueda
    print("Número de productos:", 69)
    # ciclo for para leer el nombre y descripción del producto

    # producto = driver.find_element(By.CSS_SELECTOR, ".search-item")
    # producto = producto.text
    # print(producto)
    pr = "]/product-card/artículo/div/div[2]/div[1]/pes-product-price/p/span[1]"
    nam = "]/product-card/artículo/div/div[1]/product-card-main-info//div/pes-router-link[1]/a"
    des = "]/product-card/artículo/div/div[1]/product-card-main-info//div/pes-router-link[2]/a/h3"

    # des_path = "#search-items > .search-item .details > a > .row.pt-5.pb-sm-5 > .multilines-3.text-truncate-multilines.xs-single-col-8.col-12 > .font-weight-bold.text-dark"
    follow_loop = range(1, 70)
    for x in follow_loop:
        y = x
        if (x > 61):
            y = x - 60
        elif (x > 49):
            y = x - 48
        elif (x > 37):
            y = x - 36
        elif (x > 25):
            y = x - 24
        elif(x > 13):
            y = x - 12
        else:
            print("")
        if ( ((x % 13) == 0) ):
            driver.delete_all_cookies()
            next_arrow = driver.find_element(By.CLASS_NAME, "page-links__arrow page-links__arrow--next js-page-link js-page-link-next")
            driver.execute_script("arguments[0].click();", next_arrow)

        xpath = "/html/body/div[2]/main/div[5]/ul/li/div/div/div/div/div/ul/li[1]/div/div/div[2]/div[2]/section/div/product-cards-wrapper//div/ul/li["
        xpath += str(y)
        xpath += des
        driver.implicitly_wait(5)
        description.append(driver.find_element(By.XPATH, xpath))
        xpath2 = xpath.replace(des, '')
        xpath2 += pr
        unit_price.append(driver.find_element(By.XPATH, xpath2).text)
        xpath3 = xpath2.replace(pr, '')
        xpath3 += nam
        name.append(driver.find_element(By.XPATH, xpath3).text)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    A partir del mensaje de error, parece que el XPath proporcionado no puede localizar el elemento en la página web. Una posible razón podría ser que la página web contiene elementos dinámicos que no están disponibles inmediatamente cuando se carga la página.

    Una solución a este problema es esperar a que el elemento esté disponible antes de intentar acceder a él. Selenium proporciona varios métodos de espera, incluyendo esperas implícitas y explícitas.

    Una espera implícita establece un tiempo de espera para que el controlador busque un elemento. Esto significa que el controlador esperará durante un tiempo especificado antes de levantar una excepción si no se encuentra el elemento. Por otro lado, una espera explícita espera a que ocurra una condición específica antes de continuar. Esto puede ser útil para esperar a que se dispongan elementos específicos.

    En el código actual, ya se incluye una espera implícita de 5 segundos antes de intentar acceder al elemento. Sin embargo, esto puede no ser suficiente para los elementos dinámicos. Una solución posible es utilizar una espera explícita para esperar a que el elemento sea clickeable antes de acceder a él.

    Aquí se muestra un ejemplo de cómo utilizar una espera explícita para esperar a que el elemento se vuelva clickeable:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # Espera a que el elemento sea clickeable
    wait = WebDriverWait(driver, 10) # Espera hasta 10 segundos
    xpath = "/html/body/div[2]/main/div[5]/ul/li/div/div/div/div/div/ul/li[1]/div/div/div[2]/div[2]/section/div/product-cards-wrapper//div/ul/li[1]/product-card//article/div/div[1]/product-card-main-info//div/pes-router-link[2]/a/h3"
    element = wait.until(EC.element_to_be_clickable((By.XPATH, xpath)))
    
    # Accede al elemento
    description.append(element.text)
    

    Este código esperará hasta 10 segundos para que el elemento sea clickeable y luego accederá al texto del elemento. Puede ajustar el tiempo de espera según sea necesario.

    También vale la pena señalar que el XPath proporcionado puede ser frágil y propenso a romperse si se cambia la estructura de la página web. Puede ser un enfoque mejor utilizar un selector más robusto, como un selector CSS, o utilizar un enfoque más alto nivel como usar una biblioteca como BeautifulSoup para analizar la página web.

Comments are closed.