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.