[selenio] resuelve el problema del tiempo de carga de página demasiado largo

1. Fenómeno problemático

En la prueba de selenio, se descubre que los elementos de la página se han cargado y se pueden operar, pero la barra de direcciones del navegador aún gira y el siguiente código no se puede ejecutar.

Dos, la causa del problema.

Los métodos como las operaciones con elementos de selenio deben esperar a que todos los elementos de la página estén completamente cargados antes de ejecutarse, por lo que antes de cargar la página, el código esperará a que se cargue y no continuará ejecutándose.

3. Solución

1. Establezca el tiempo de carga de la página de WebDriver ( set_page_load_timeout ).

El método set_page_load_timeout(time) puede establecer el tiempo de espera de carga de la página. Cuando la carga de la página excede el tiempo establecido, se informará un error, se agotó el tiempo de recepción del mensaje del renderizador: tiempo

Podemos usar try...excepto en combinación con el método window.stop() de Javascript para detener forzosamente la carga de la página después de un tiempo de espera y continuar realizando operaciones posteriores.

import time
from selenium import webdriver

start = time.time()

driver = webdriver.Chrome()
# 设置页面加载时间
driver.set_page_load_timeout(5)

try:
    driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
except:
    # 超时后执行Javascript停止页面加载
    driver.execute_script('window.stop()')

end = time.time()
# 计算页面加载时间
print(end - start)


>>>6.229357481002808

* El método para configurar el tiempo de carga de la página solo se aplica para abrir la página web utilizando el método get() y no se aplica si la página se redirige mediante la operación.

2. Modificar  la estrategia de carga de páginas de WebDriver (page_load_strategy)

Cuando WebDriver carga una página, de acuerdo con la estrategia de carga predeterminada, se descargan la página de la dirección de obtención y todos los recursos estáticos.

Además de la estrategia predeterminada, también puede elegir estrategias ansiosas y ninguna, y ajustar la estrategia de carga de la página de acuerdo con la situación real para acortar el tiempo de espera y mejorar la velocidad de ejecución.

  • normal (predeterminado): espere a que se cargue toda la página, incluidos archivos, css, js, etc.
  • ansioso: espere a que se cargue todo el árbol dom, es decir, que se complete el evento DOMContentLoaded, es decir, siempre que el html esté completamente cargado y analizado. Deje de esperar a que se carguen imágenes, estilos y subcuadros.
  • none: espere a que se complete la descarga del HTML, incluso si el análisis aún no ha comenzado.

1) La estrategia de carga de la página es normal.

import time
from selenium import webdriver

start = time.time()

# 默认加载策略为normal,可以不进行设置
driver = webdriver.Chrome()
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')

end = time.time()
# 计算页面加载时间
print(end - start)


>>>22.998253345489502

2) La estrategia de carga de la página es entusiasta.

import time
from selenium import webdriver

start = time.time()

options = webdriver.ChromeOptions()
# 设置加载策略为eager
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=options)
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')

end = time.time()
# 计算页面加载时间
print(end - start)


>>>1.859546184539795

3) La estrategia de carga de la página es ninguna.

import time
from selenium import webdriver

start = time.time()

options = webdriver.ChromeOptions()
# 设置加载策略为none
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')

end = time.time()
# 计算页面加载时间
print(end - start)


>>>1.1394140720367432

* Al modificar la estrategia de carga de la página, se puede cooperar con la visualización en espera, para evitar que cuando los elementos requeridos estén en un estado no interactivo, las operaciones posteriores se realicen prematuramente, lo que resultará en un error.

Supongo que te gusta

Origin blog.csdn.net/Yocczy/article/details/132339514
Recomendado
Clasificación