Selenium driver.get (url)
attendre le chargement complet de la page. Mais une page de scrap essaye de charger un script JS mort. Donc, mon script Python l'attend et ne fonctionne pas quelques minutes. Ce problème peut être sur toutes les pages d'un site.
from Selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.cortinadecor.com/productos/17/estores-enrollables-screen/estores-screen-corti-3000')
# It try load: https://www.cetelem.es/eCommerceCalculadora/resources/js/eCalculadoraCetelemCombo.js
driver.find_element_by_name('ANCHO').send_keys("100")
Comment limiter le temps d'attente, bloquer AJAX le chargement d'un fichier, ou utiliser un autre moyen?
De plus, je teste mon script dans webdriver.Chrome()
, mais j'utiliserai PhantomJS () ou probablement Firefox (). Ainsi, si une méthode utilise une modification des paramètres du navigateur, elle doit être universelle.
Lorsque Selenium charge une page/url par défaut, il s'ensuit une configuration par défaut avec pageLoadStrategy
défini sur normal
. Pour que Selenium n'attende pas le chargement complet de la page, nous pouvons configurer la variable pageLoadStrategy
. pageLoadStrategy
supporte 3 valeurs différentes comme suit:
normal
(chargement complet de la page)eager
(interactif)none
Voici le bloc de code pour configurer la pageLoadStrategy
:
Firefox:
from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities().FIREFOX
caps["pageLoadStrategy"] = "normal" # complete
#caps["pageLoadStrategy"] = "eager" # interactive
#caps["pageLoadStrategy"] = "none"
driver = webdriver.Firefox(desired_capabilities=caps, executable_path=r'C:\path\to\geckodriver.exe')
driver.get("http://google.com")
Chrome:
from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "normal" # complete
#caps["pageLoadStrategy"] = "eager" # interactive
#caps["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(desired_capabilities=caps, executable_path=r'C:\path\to\chromedriver.exe')
driver.get("http://google.com")
Remarque:
pageLoadStrategy
valeursnormal
,eager
etnone
est une condition requise selon WebDriver Rédaction Draft maispageLoadStrategy
commeeager
est toujours une WIP (travail en cours) dans la mise en œuvre de ChromeDriver. Vous trouverez une discussion détaillée dans La solution de contournement de la stratégie de chargement de page «Désireux» de Chromedriver Selenium en Python
Selenium Webdriver fournit deux types d’attente: implicite et explicite. Une attente explicite fait que WebDriver attend qu'une certaine condition se produise avant de poursuivre l'exécution.
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 as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
Cela attend jusqu'à 10 secondes avant de lancer une
TimeoutException
à moins que l'élément ne soit renvoyé dans les 10 secondes.
Une solution pourrait donc consister à définir un délai d’attente et, si l’élément n’est pas intercepté dans cette période fixe, capturer l’exception et consigner l’événement ou rien, puis poursuivre. L'exemple de code provient de ici