web-dev-qa-db-fra.com

Attendre la redirection de page Selenium WebDriver (Python)

J'ai une page qui charge le contenu dynamique avec ajax et redirige ensuite après un certain laps de temps (non fixé). Comment puis-je forcer Selenium Webdriver à attendre que la page soit redirigée avant de passer à un lien différent immédiatement après?

import time
from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys
from Selenium.webdriver.chrome.options import Options
from Selenium.webdriver.support import expected_conditions as EC
from Selenium.common.exceptions import TimeoutException
from Selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome();
driver.get("http://www.website.com/wait.php") 
5
7O07Y7

Vous pouvez créer une condition attendue attendue personnalisée pour que l'URL change:

from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import WebDriverWait

wait = WebDriverWait(driver, 10)
wait.until(lambda driver: driver.current_url != "http://www.website.com/wait.php")

La condition attendue est fondamentalement un callable - vous pouvez l'envelopper dans une classe _ écraser la méthode magique __call__() lorsque les conditions intégrées sont implémentées.

7
alecxe

Il est recommandé d’attendre l’apparition d’un élément unique (pour la nouvelle page).

Vous pouvez utiliser le module attendu_conditions .

Par exemple, vous pouvez attendre le logo de l'utilisateur lors de la connexion:

from Selenium import webdriver
from Selenium.common.exceptions import TimeoutException
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC
from Selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get('http://yourapp.url')

timeout = 5

    try:
        logo_present = EC.presence_of_element_located((By.ID, 'logo_id'))
        WebDriverWait(driver, timeout).until(logo_present)
    except TimeoutException:
        print "Timed out waiting for page to load"
4
Max V

Il existe plusieurs ExpectedConditions qui peuvent être utilisés avec ExplicitWait pour gérer la redirection de page:

from Selenium.webdriver.support import expected_conditions as EC
from Selenium import webdriver
from Selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
  1. Attendez le nouveau titre de page avec title_is(title_name) :

    wait.until(EC.title_is('New page Title'))
    
  2. Attendez que l'URL actuelle soit remplacée par une autre URL avec url_changes(exact_url) :

    wait.until(EC.url_changes('https://current_page.com'))
    
  3. Attendez de naviguer jusqu’à l’URL exacte avec url_to_be(exact_url) :

    wait.until(EC.url_to_be('https://new_page.com'))
    

Également

url_contains(partial_url) peut être utilisé pour attendre l'URL contenant la sous-chaîne spécifiée ou url_matches(pattern) - pour attendre l'URL correspondant au modèle regex transmis ou title_contains(substring) - pour attendre le nouveau titre contenant la sous-chaîne spécifiée

2
Andersson