web-dev-qa-db-fra.com

Comment faire pour que Selenium n'attende pas le chargement complet de la page, qui a un script lent?

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.

7
bl79

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:

  1. normal (chargement complet de la page)
  2. eager (interactif)
  3. 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 valeurs normal, eager et none est une condition requise selon WebDriver Rédaction Draft mais pageLoadStrategy comme eager 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

13
DebanjanB

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

1
arif