webentwicklung-frage-antwort-db.com.de

Warten auf Seitenumleitung Selenium WebDriver (Python)

Ich habe eine Seite, die dynamischen Inhalt mit Ajax lädt und dann nach einer bestimmten Zeit umleitet (nicht behoben). Wie kann ich Selenium Webdriver zwingen, darauf zu warten, dass die Seite umgeleitet wird, und anschließend sofort zu einem anderen Link wechseln?

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

Sie können eine benutzerdefinierte Erwartete Bedingung zum Warten erstellen, bis sich die URL ändert:

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")

Die erwartete Bedingung ist im Grunde genommen eine aufrufbare - Sie können sie in eine Klasse einbinden die __call__() magic-Methode überschreiben, wenn die eingebauten Bedingungen implementiert werden.

7
alecxe

Es ist eine gute Praxis, auf das Erscheinen eines eindeutigen (für eine neue Seite) Elements zu "warten".

Sie können das Modul expected_conditions verwenden.

Beispielsweise können Sie bei der Anmeldung auf das Benutzerlogo warten:

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

Es gibt mehrere ExpectedConditions , die zusammen mit ExplicitWait für die Seitenumleitung verwendet werden können:

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. Warten auf neuen Seitentitel mit title_is(title_name) :

    wait.until(EC.title_is('New page Title'))
    
  2. Warten Sie, bis die aktuelle URL mit url_changes(exact_url) in eine andere URL geändert wurde.

    wait.until(EC.url_changes('https://current_page.com'))
    
  3. Warten Sie, bis Sie mit url_to_be(exact_url) zur genauen URL navigiert sind.

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

Ebenfalls

url_contains(partial_url) kann verwendet werden, um auf eine URL zu warten, die eine bestimmte Teilzeichenfolge enthält, oder url_matches(pattern) - um auf eine URL zu warten, die einem übergebenen Regex-Muster entspricht, oder title_contains(substring) - um auf einen neuen Titel zu warten, der eine bestimmte Teilzeichenfolge enthält

2
Andersson