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: referencia de elemento obsoleto: el elemento no está adjunto al documento de la página después de regresar una página

Actualmente estoy creando un script en Python que ingresa a https://www.mwcbarcelona.com/exhibitors, hace clic en cada expositor y luego regresa a la misma página para hacer clic en el siguiente expositor. Este es el código que he escrito:

from bs4 import BeautifulSoup
import requests
import csv
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome("chromedriver.exe")
driver.get('https://www.mwcbarcelona.com/exhibitors')

td_list = driver.find_elements_by_css_selector("tr[class='flex px-4 cursor-pointer hover:bg-gray-100 sm:table-row sm:text-gray-700 sm:font-medium']")

for desc in td_list:
    print(desc.text)
    desc.click()
    time.sleep(3)
    driver.back()
    time.sleep(3)

Cuando ejecuto mi código, solo puedo acceder al primer expositor y luego me muestra este error:

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

¿Alguien puede decirme qué está mal aquí?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “StaleElementReferenceException: Message: stale element reference: element is not attached to the page document” indica que la página se ha actualizado o que el elemento ha sido eliminado del DOM antes de que se complete la operación que se está realizando en él.

    En tu código, estás haciendo clic en el primer expositor y luego regresando inmediatamente a la página anterior utilizando “driver.back()”. Esto provoca que la página se actualice y que el elemento previamente localizado se vuelva obsoleto.

    Para solucionar esto, puedes intentar utilizar “WebDriverWait” para esperar a que la página del expositor se cargue completamente antes de realizar cualquier operación en ella. También puedes almacenar los enlaces de los expositores en una lista e iterar a través de ellos utilizando un bucle en lugar de hacer clic en cada expositor uno por uno.

    Aquí tienes un fragmento de código actualizado que puedes probar:


    from bs4 import BeautifulSoup
    import requests
    import csv
    import pandas as pd
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import os
    import time
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC

    driver = webdriver.Chrome(“chromedriver.exe”)
    driver.get(‘https://www.mwcbarcelona.com/exhibitors’)

    exhibitor_links = [elem.get_attribute(‘href’) for elem in driver.find_elements_by_css_selector(“tr[class=’flex px-4 cursor-pointer hover:bg-gray-100 sm:table-row sm:text-gray-700 sm:font-medium’] a”)]

    for link in exhibitor_links:
    driver.get(link)
    wait = WebDriverWait(driver, 10)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, “h1[class=’text-2xl font-semibold’]”)))
    print(driver.title)
    driver.back()
    time.sleep(3)
    “`

    En este código actualizado, primero obtenemos todos los enlaces de los expositores de la página y los almacenamos en una lista. Luego, iteramos a través de cada enlace utilizando un bucle for, lo cargamos en el driver, esperamos a que la página del expositor se cargue completamente utilizando “WebDriverWait” y luego volvemos a la página anterior.

    ¡Espero que esto ayude!

Comments are closed.