Oczekiwanie na zakończenie wywołania HTTP w Selenium

Pisząc testy funkcjonalne dowolnej aplikacji w Selenium prędzej czy póżniej spotkamy się z problemem oczekiwania na zakończenie wywołania HTTP. Do prawidłowego działania testu musimy poczekać aż odwołanie do serwera zostanie zakończone, a treść odpowiedzi załadowana do przeglądarki. Dostępne w Internecie oraz dokumentacji Selenium rozwiązania są mało intuicyjne oraz niezbyt ładne.

Ze strzępków informacji na Stack Overflow oraz blogach udało się opracować, według mnie proste i dość przejrzyste rozwiązanie.

Poniżej fragment kodu wraz z jego wywołaniem dla Pythona:

def wait(self, task, *args):
    start_time = time.time()
    while True:
        try:
            task(*args)
            return
        except (WebDriverException, AssertionError) as exception:
            if time.time() - start_time > 5:
                raise exception
            time.sleep(1)

self.wait(
    lambda: self.assertIn(„/page", self.browser.current_url)
)

Funkcja wait jako parametr przyjmuje funkcję do wywołana, której to poprawne działanie zależy od zakończenia odwołania do serwera. Na początku – pobieramy aktualną godzinę, a następnie próbujemy wywoływać funkcję w pętli. Funkcję wykonujemy w bloku sprawdzającym wystąpienie wyjątków – staramy się przechwycić wszystkie możliwe wyjątki, które mogą się pojawić w sytuacji kiedy odwołanie do serwera nie zostanie jeszcze zakończone. Powtarzamy to jedynie przez określony czas – w przykładzie 5 sekund. Jeśli przez 5 sekund, przeglądarce nie uda się załadować treści, w sposób który pozwala na poprawne wykonanie funkcji – prawdopodobnie gdzieś tkwi błąd i należy zwrócić wyjątek poza funkcję oraz zakończyć test niepowodzeniem.