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")
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.
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"
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)
Attendez le nouveau titre de page avec title_is(title_name)
:
wait.until(EC.title_is('New page Title'))
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'))
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