Poseemos la mejor información que descubrimos en todo internet. Esperamos que te sea útil y si deseas compartir algún detalle que nos pueda ayudar a perfeccionar nuestra información hazlo con total libertad.
Solución:
Sin conocer el contenido de la página, es difícil elaborar una solución a su problema.
Cuando su código Selenium selecciona elementos del controlador web, lo hace en la página, ya que se carga cuando se ejecuta su código selector, lo que significa que la página no no necesita ser recargado para recuperar nuevos elementos. En cambio, parece que su problema es que los elementos aún no existen en la página, lo que significa que es posible que los resultados de la búsqueda no se hayan cargado cuando su selector intentó obtener una copia nueva de los elementos.
Una solución sencilla sería aumentar el tiempo de espera entre el inicio de la búsqueda y la selección de los resultados de la búsqueda, para dar tiempo a que la página cargue los resultados de la búsqueda.
from selenium import webdriver
import time
# Load page
driver = webdriver.Firefox()
driver.get('https://www.example.com')
# Begin search
driver.find_element_by_tag_name('a').click()
# Wait for search results to load
time.sleep(5)
# Retrieve search results
results = driver.find_elements_by_class_name('result')
Las desventajas de esto serían que realmente depende de la QoS de la red y del tiempo que tarda la consulta de búsqueda en ejecutarse en su página.
Una solución más compleja pero canónica sería esperar a que la página cargue los resultados de la búsqueda, tal vez verificando un ícono de carga de búsqueda de Ajax o viendo si los resultados cambiaron. Un buen lugar para comenzar sería mirar WebDriverWait’s en Selenium.
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
# Load page
driver = webdriver.Firefox()
driver.get('https://www.example.com')
# Begin search
driver.find_element_by_tag_name('a').click()
# Wait for search results to load
WebDriverWait(driver, 30).until(
expected_conditions.invisibility_of_element_located((By.ID, 'ajax_loader'))
)
# Retrieve search results
results = driver.find_elements_by_class_name('result')
La desventaja de este método es que puede llevar mucho tiempo descubrir cómo hacerlo funcionar, y debe personalizarse para cada página en la que desea esperar actualizaciones.
Usted mencionó que este método parece no funcionar para usted. Una sugerencia para eso sería (si no rompe la página) manipular la búsqueda previa de DOM para borrar cualquier resultado o elemento existente que coincida con su selector antes de esperar a que se carguen los nuevos resultados. Esto debería solucionar problemas con su Selenium WebDriverWait
al esperar la presencia de elementos que coincidan con el selector para los resultados de su búsqueda.
driver.execute_script("el = document.getElementById('#results');el.parentElement.removeChild(el)")
Además, dado que mencionó que la página no debería recargarse, es posible que su página esté usando Ajax para cargar los resultados de búsqueda y luego modifique el DOM con JavaScript. Puede ser útil inspeccionar el tráfico de la red (la mayoría de las DevTools de los navegadores deberían tener una pestaña “Red”) y tratar de aplicar ingeniería inversa sobre cómo el sitio web envía la consulta de búsqueda y analiza los datos.
import requests
# Search term (birds)
term = 'ja'
# Send request
request = requests.get('https://jqueryui.com/resources/demos/autocomplete/search.php?term=' + term)
# Print response
print(request.json())
Esto puede violar los TOS o las políticas de ciertos sitios (en realidad, cualquiera de estos métodos podría hacerlo), así que tenga cuidado con eso, ya que al principio puede ser difícil descubrir cómo enviar y analizar solicitudes en un nivel más bajo que lo que está cargado en el DOM. después de que la página cargue los resultados de búsqueda de manera más tradicional. En el lado positivo, esta es probablemente la mejor manera (rendimiento, confiabilidad) de obtener resultados de búsqueda, suponiendo que se haya utilizado una búsqueda similar a Ajax.
Simplemente necesita pedirle al controlador que tome el elemento una vez más, reutilizando el mismo fragmento:
var X = driver.findElement( By.xpath("myxpath") ); //suppose element A is returned
//...do things
// the dom is reloaded
//copy paste the same command again :
var Y = driver.findElement( By.xpath("myxpath") ); //element B shall be returned after the dom has been updated.
¡Entonces Y será el nuevo objeto cambiado por la recarga de dom mientras que su descripción es la misma!
valoraciones y reseñas
Si haces scroll puedes encontrar las explicaciones de otros creadores, tú asimismo puedes mostrar el tuyo si te gusta.