Desplazarse hacia abajo en una página con Selenium Webdriver

Tengo una página dinámica que carga productos cuando el usuario se desplaza por una página. Quiero obtener el número total de productos representados en la página de visualización. Actualmente estoy usando el siguiente código para llegar al final hasta que se muestren todos los productos.

elems = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x"))) print len(elems) a = len(elems) self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(4) elem1 = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x"))) b = len(elem1) while b > a: self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(4) elem1 = WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x"))) a = b b = len(elem1) print b 

Esto está funcionando bien, pero quiero saber si hay una mejor opción para hacer esto.

Puedes realizar esta acción fácilmente usando esta línea de código

 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 

Y si desea desplazarse hacia abajo para siempre, debería intentar esto.

 from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("https://twitter.com/BarackObama") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) 

No estoy seguro acerca de time.sleep (x valor) porque la carga de datos puede tardar más … o menos … para obtener más información, consulte la página oficial del Doc.

que te diviertas 🙂

Creo que podrías condensar tu código a esto:

 prior = 0 while True: self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") current = len(WebDriverWait(self.driver, 30).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "x")))) if current == prior: return current prior = current 

Eliminé todas las líneas idénticas moviéndolas todas al bucle, lo que requería hacer el bucle un while True: y mover la verificación de la condición al bucle (porque, desafortunadamente, Python no do-while ).

También descarté las declaraciones de suspensión e impresión: no estoy seguro de cuál era su propósito, pero en mi propia página, he encontrado que la misma cantidad de elementos se carga tanto si duermo entre pergaminos como si no. Además, en mi propio caso, no necesito saber el recuento en ningún momento, solo necesito saber cuándo se ha agotado la lista (pero agregué una variable de retorno para que pueda obtener el recuento final si llega a Si realmente desea imprimir un recuento intermedio, puede imprimir el actual justo después de que se asigne en el bucle.

Si no tiene idea de cuántos elementos se pueden agregar a la página, pero solo desea obtenerlos todos, puede ser bueno hacer un bucle así:

  • desplácese hacia abajo como se describe arriba
  • espera unos segundos
  • guardar el tamaño de la fuente de la página (xxx.page_source)
  • Si el tamaño de la fuente de la página es mayor que el último tamaño de la fuente de la página guardada, retroceda y baje un poco más

Supongo que el tamaño de la captura de pantalla también podría funcionar bien, dependiendo de la página que esté cargando, pero esto está funcionando en mi progtwig actual.