Quantcast
Channel: blog.testowka.pl » Kurs Selenium
Viewing all articles
Browse latest Browse all 8

Kurs Selenium część 7 – Asynchronicznie doładowywane elementy na stronach

$
0
0

Całość kursu dostępna tutaj.

Kilka razy zgłaszaliście się już do mnie z pytaniami odnośnie problemu z asynchronicznym doładowywaniem poszczególnych elementów na stronach internetowych, które testujecie.

Problem ten objawia się często niedeterministycznym zachowaniem testów, które raz na jakiś czas nie przechodzą. Oczywiście może to być objaw także wielu innych problemów, niemniej jednak najczęściej spowodowane jest to właśnie tym, że niektóre elementy na stronie są doładowywane asynchronicznie już po załadowaniu całej strony.

Jak wcześniej pisałem WebDriver opiera się na działaniu silnika przeglądarki. Przeglądarki internetowe po załadowaniu i wyświetleniu kodu strony (kodu html) otrzymują od serwera status „200 OK”. To właśnie na podstawie tej informacji Selenium uznaje, że strona się już załadowała więc pora na rozpoczęcie kolejnych akcji.

Coraz częściej jednak załadowanie samego kodu html z serwera to dopiero początek renderowania strony internetowej. Po potwierdzeniu statusu od serwera następuje jeszcze szereg asynchronicznych wywołań, które doładowują do strony poszczególne elementy. Często też różne efekty graficzne jak płynne wyłanianie się poszczególnych elementów, dzieje się już po załadowaniu strony, a elementy te nie są jeszcze przez chwile widoczne.

Podsumowując czasem Selenium zobaczy taki element (jeśli wyświetli się on dostateczni szybko) a czasem nie. Brak deterministycznego zachowania testów zasadniczo obniża ich jakość i wartość.

Oczywiście można próbować wstawiać różnego rodzaju pauzy w naszych testach – niestety takie podejście po pierwsze brzydko wygląda a po drugie zasadniczo spowalnia nasze testy.

Jest na to lepszy sposób. Selenium (od niedawna0 dostarcza wbudowanej funkcji, która oczekuje na pojawienie się elementu:

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("login")));

Powyższe sprawdza, czy element jest widoczny w strukturze html oraz widoczny na stronie (to nie zawsze to samo).

Możemy też sprawdzić, czy element jest na przykład klikalny:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));

Dzięki takiemu podejściu unikamy brzydkich opóźnień w naszych testach. Powyższe kawałki kodu oznaczają, że test będzie czekał maksymalnie 10 sekund na to aż element się pojawi, sprawdzając co kilka milisekund czy być może się już pojawił. Gdy tylko element stanie się widoczny skrypt oczekujący przerwie czekanie i nasze testy ruszą dalej.

Pozostaje pytanie czy zawsze stosować tego typu podejście? Możemy nawet ten kawałek kodu dodać bezpośrednio do metod typu „insertText” czy „click”, które sobie stworzymy. Należy jednak pamiętać, że tego typu podejście będzie o 10 sekund opóźniało wykonanie każdego testu zanim test nie przejdzie, jeśli jakiś element faktycznie się nie wyświetla.


Viewing all articles
Browse latest Browse all 8

Trending Articles


TRX Antek AVT - 2310 ver 2,0


Автовишка HAULOTTE HA 16 SPX


POTANIACZ


Zrób Sam - rocznik 1985 [PDF] [PL]


Maxgear opinie


BMW E61 2.5d błąd 43E2 - klapa gasząca a DPF


Eveline ➤ Matowe pomadki Velvet Matt Lipstick 500, 506, 5007


Auta / Cars (2006) PLDUB.BRRip.480p.XviD.AC3-LTN / DUBBING PL


Peugeot 508 problem z elektroniką


AŚ Jelenia Góra