web-dev-qa-db-fra.com

N'attendez pas qu'une page se charge à l'aide de Selenium dans Python

Comment faire en sorte que Selenium clique sur les éléments et gratte les données avant que la page ne soit complètement chargée? Ma connexion Internet est assez terrible, donc il faut parfois une éternité pour charger entièrement la page, y a-t-il quand même quelque chose?

16
no nein

ChromeDriver 77. (qui prend en charge Chrome version 77) prend désormais en charge eager as pageLoadStrategy .

Problème 1902 résolu: prise en charge d'une stratégie de chargement de page dynamique [Pri-2]


Comme vous interrogez les mentions de click on elements and scrape data before the page has fully loaded dans ce cas, nous pouvons prendre l'aide d'un attribut pageLoadStrategy. Lorsque Selenium charge une page/url par défaut, il suit une configuration par défaut avec pageLoadStrategy défini sur normal. Selenium peut commencer à exécuter la ligne de code suivante à partir de différents Document readiness state. Actuellement, Selenium prend en charge 3 différents Document readiness state que nous pouvons configurer via pageLoadStrategy comme suit:

  1. none (non défini)
  2. eager (la page devient interactive)
  3. normal (chargement complet de la page)

Voici le bloc de code pour configurer le pageLoadStrategy:

from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities

binary = r'C:\Program Files\Mozilla Firefox\firefox.exe'
caps = DesiredCapabilities().FIREFOX
# caps["pageLoadStrategy"] = "normal"  #  complete
caps["pageLoadStrategy"] = "eager"  #  interactive
# caps["pageLoadStrategy"] = "none"   #  undefined
driver = webdriver.Firefox(capabilities=caps, firefox_binary=binary, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe")
driver.get("https://google.com")
14
DebanjanB

Pour Chromedriver, cela fonctionne de la même manière que dans la réponse de @ DebanjanB, mais la stratégie de chargement de page "désireuse" est pas encore prise en charge

Ainsi, pour chromedriver, vous obtenez:

from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities().CHROME
# caps["pageLoadStrategy"] = "normal"  #  Waits for full page load
caps["pageLoadStrategy"] = "none"   # Do not wait for full page load
driver = webdriver.Chrome(desired_capabilities=caps, executable_path="path/to/chromedriver.exe")

Notez que lorsque vous utilisez la stratégie "aucun", vous devrez probablement implémenter votre propre méthode d'attente pour vérifier si l'élément dont vous avez besoin est chargé.

from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as ec

WebDriverWait(driver, timeout=10).until(
    ec.visibility_of_element_located((By.ID, "your_element_id"))
)

Vous pouvez maintenant commencer à interagir avec votre élément avant que la page ne soit entièrement chargée!

2
Camiel Kerkhofs