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?
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:
none
(non défini)eager
(la page devient interactive)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")
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!