Jeśli chcesz dowiedzieć się nieco więcej na temat praktycznej strony automatyzacji testów, ale nie bardzo wiesz od czego zacząć – odpowiedzią może być Selenium IDE. Poniższy post utrzymany w konwencji mini-tutoriala ma na celu przedstawienie podstawowych funkcji Selenium IDE, jego możliwości oraz ograniczeń.

Instalacja

Do pracy z Selenium IDE niezbędna jest przeglądarka Mozilla Firefox. Po zainstalowaniu przeglądarki należy pobrać instalator Selenium IDE ze strony http://seleniumhq.org/download/. Po zainstalowaniu Selenium IDE staje się dostępne w postaci wtyczki Firefox’a.

Nagrywanie testów

Najprostszym sposobem na poznanie możliwości, jakie daje Selenium IDE jest użycie go do celu, w jakim zostało stworzone, a więc do nagrania testu.

Wykonamy i zarejestrujemy prosty test: przy pomocy wyszukiwarki Google wyszukamy stronę kainos.pl, a następnie przejdziemy na nią i upewnimy się, że akcja ta zakończyła się powodzeniem.

Po uruchomieniu Selenium IDE wciskamy czerwony okrągły przycisk , rozpoczynając tym samym nagrywanie testu. Następnie w nowym oknie przeglądarki Firefox przechodzimy na stronę wyszukiwarki google.pl i wpisujemy w pole wyszukiwania frazę, której będziemy szukać – kainos.pl, a następnie wciskamy przycisk wyszukiwania.

Po wykonaniu powyższych kroków powinniśmy uzyskać zbliżone do niżej zaprezentowanych wyniku wyszukiwania:

Wróćmy na chwilę do okna Selenium IDE. Zauważymy, że wykonane przez nas akcje zostały zapisane, a także “przetłumaczone” na zrozumiałe dla narzędzia komendy (język poleceń Selenium zwany Selenesse), automatycznie również zostało wypełnione pole Base URL.

Polecenie open powoduje otwarcie podanego w parametrze Target adresu URL. W naszym przypadku parametr / oznacza otwarcie bazowego adresu URL zdefiniowanego w polu Base URL. Komenda type służy natomiast do wpisywania określonego za pomocą parametru Value tekstu w pole formularza określone za pomocą parametru Target.

Więcej szczegółów na temat poszczególnych komend można znaleźć w zakładce Reference Selenium IDE.

Identyfikowanie elementów UI

O ile wartość parametru Value komendy type nie budzi raczej wątpliwości (określamy tu tekst, który chcemy wpisać w pole formularza wyszukiwarki), o tyle wartość parametru Target jest mniej oczywista.

W przypadku metod operujących na elementach strony (takich jak type czy click) wartość parametru Target identyfikuje element strony, na którym wykonana ma być dana operacja.

W naszym przykładzie do identyfikacji elementów strony użyty został identyfikator id. Nasuwa się oczywiście pytanie, skąd taka, a nie inna wartość identyfikatora? – aby odpowiedzieć na to pytanie, trzeba będzie zajrzeć do kodu źródłowego strony. Niezwykle pomocna okaże się tu opcja Inspect Element dostępna w nowszych wersjach przeglądarki Firefox.

Po kliknięciu prawym przyciskiem myszy na polu wyszukiwania wyszukiwarki Google, wybieramy opcję Inspect Element (Q). W rezultacie wyświetlona zostanie informacja na temat wskazanego elementu, będzie również możliwe podejrzenie kodu strony, zawierającego wskazany element.Oznaczony kolorem zielonym tekst na powyższym obrazku jest poszukiwanym przez nas atrybutem id pola input formularza wyszukiwania (kolorem niebieskim oznaczony jest atrybut class). Wspomniane atrybuty można odczytać również bezpośrednio z kodu źródłowego.

Identyfikowanie elementów przy pomocy atrybutu id nie jest jedyną dostępną i zrozumiałą dla Selenium IDE metodą. Ponadto w przypadku stron, gdzie id jest generowane automatycznie i inne za każdym razem, gdy przeładujemy stronę, taki sposób identyfikacji może okazać się niewystarczający.

Inne popularne sposoby lokalizowania elemenów UI:

  • name=wartośćAtrybutuName – wyszukuje pierwszy element z podanym atrybutem name (w przypadku naszego formularza parametr Target przyjąłby wartość name=q)
  • xpath=wyrażenieXPath pozwala na lokalizowanie elementów za pomocą wyrażeń XPath (w przypadku używanego w naszym teście pola input parametr Target mógłby przyjąć wartość xpath=//tbody/tr/td/div/input[@name=’q’])
  • link=wzorzecTekstowy pozwala na zlokalizowania linka zawierającego podany tekst

Rozbudowywanie testu

Selenium IDE pozwala nie tylko zapisywać wykonane w czasie testu kroki, ale także w wygodny sposób rozbudowywać zapisany już test o dodatkowe kroki za pomocą wygodnego, kontekstowego menu.

Do tej pory nasz test realizuje następujące kroki:

  1. Otwarcie strony wyszukiwarki Google.pl,
  2. Wpisanie w formularz wyszukiwarki frazy kainos.pl,
  3. Wciśnięcie przycisku Search wyszukiwarki.

Upewnimy się, że wyniki wyszukiwania odpowiadają naszym oczekiwaniom, a więc że strona kainos.pl znalazła się wśród wyświetlonych wyników.

Po kliknięciu prawym przyciskiem myszki na linku do strony kainos.pl uzyskamy dostęp do menu kontekstowego Selenium IDE, dzięki któremu będziemy mogli dodawać najbardziej pasujące do wybranego elementu strony polecenia. Selenium IDE samo podpowie nam, które spośród dostępnych komend są najbardziej odpowiednie w danej chwili, cały czas jednak mamy pełen dostęp do pozostałych poleceń (po rozwinięciu listy Show All Available Commands), co daje nam całkowitą swobodę w tworzeniu naszego testu.

Z zasugerowanych przez Selenium IDE komend wybieramy verifyTextPresent(…) i dodajemy ją jako kolejny krok naszego testu. Następnie uruchamiamy go, używając przycisku Play Current Test Case ()

Test kończy się niepowodzeniem. Na pierwszy rzut oka może się to wydawać nieco dziwne – patrząc na stronę tuz po zakończeniu testu, widzimy, że interesujący nas link jest obecny. Przyczyną problemu jest szybkość następowania po sobie poszczególnych kroków testu.

W tej chwili sprawdzenie obecności interesującego nas linka odbywa się zanim zostaną załadowane wyniki wyszukiwania. W rezultacie test kończy się niepowodzeniem, ponieważ Selenium IDE nie jest w stanie odnaleźć poszukiwanego elementu. Spróbujmy zatem zmniejszyć szybkość wykonywania testu, aby przekonać się, czy wpłynie to na rezultat jego wykonania. W tym celu przestawiamy suwak szybkości wykonywania testu w pozycję Slow () i ponownie odpalamy test.

Jak widać, zmiana szybkości wykonania testu powoduje, że wszystkie kroki zakończyły się pomyślnie – wyniki wyszukiwania zdążyły się załadować przed krokiem weryfikującym obecność poszukiwanego linka.

Podstawową wadą takiego rozwiązania jest jednak fakt, że spowalnia ono wykonanie wszystkich kroków (a więc wydłuża znacząco czas wykonania całego testu), podczas gdy zależy nam jedynie na tym, żeby test zatrzymał się na chwilę przed sprawdzeniem obecności poszukiwanego elementu, pozwalając na pełne załadowanie się wyników wyszukiwania.

Użyjemy do tego celu polecenia pause. W okienku Selenium IDE klikamy prawym przyciskiem na poleceniu verifyTextPrexent(…), a następnie wybieramy opcję Insert New Command. Nowa komenda zostanie wstawiona tuż przed wybranym poleceniem.

Z rozwijalnej listy komend wybieramy polecenie pause. W pole Target wpisujemy wartość 1000 (jest to wartość opóźnienia podana w milisekundach). Przestawiamy suwak szybkości z powrotem w pozycje Fast, a następnie ponownie uruchamiamy test. Tym razem wszystkie kroki naszego testu zostaną wykonane pomyślnie.

Innym rozwiązaniem, pozwalającym na uzyskanie podobnego efektu, jest zastąpienie komendy click poleceniem clickAndWait lub rozszerzenie testu o komendę waitForPageToLoad tuż przed krokiem weryfikującym obecność poszukiwanego elementu.

Niestety w rozpatrywanym przypadku, gdzie przeładowywana jest jedynie część strony, te polecenia nie zadziałają, ponieważ nie wystąpi tu monitorowany przez Selenium IDE event  załadowania się nowej strony (polecenia clickAndWait oraz waitForPageToLoad zakończą się niepowodzeniem po przekroczeniu zdefiniowanego timeout’u).

Ostatnim etapem naszego testu będzie przejście na stronę kainos.pl i upewnienie się, że operacja ta zakończyła się powodzeniem. W tym celu dodamy do testu (tuż po poleceniu verifyTextPresent) komendę click. Jako parametr Target podajemy link=Kainos | EDRM, Document Management & Records Management. Jeśli teraz odpalimy test, zauważymy, że po przeprowadzeniu wyszukiwania następuje przejście na stronę Kainos.pl.

Dodamy jeszcze krok, który zweryfikuje, że nastąpiło przejście zgodne z naszymi oczekiwaniami. Po komendzie click dodajemy komendę verifyTitle. W pole target nowo dodanej komendy wpisujemy Kainos | EDRM, Document Management & Records Management (a więc tytuł strony określony za pomocą taga <Title> w kodzie HTML strony).

Po ponownym odpaleniu testu okaże się, że nowo dodany krok kończy się niepowodzeniem. Przyczyną tego stanu rzeczy, tak jak i poprzednim razem jest fakt, że strona nie zdążyła się w pełni załadować przed wykonaniem kroku weryfikującego.

W celu rozwiązania tego problemu, zastąpimy komendę click wspomnianą wcześniej komendą clikAndWait, która spowoduje, że Selenium IDE po kliknięciu linka poczeka aż strona w pełni się załaduje przed wykonaniem kolejnych kroków testu.

Tym razem test kończy się sukcesem. Wszystkie kroki zostały pomyślnie wykonane.

Zapisywanie testów

Oczywiście po stworzeniu testu dobrze jest go zapisać. Domyślnie testy zapisywane są w formacie HTML. Zapisane w takiej formie testy można potem ponownie otworzyć i uruchomić w Selenium IDE.

Utworzone wcześniej testy można również eksportować do postaci kodu źródłowego, co ułatwia ich integracje w ramach istniejących framework’ów testowych opartych o takie języki programowania, jak Ruby, Python, C# czy Java.

Podsumowanie

Jak widać, pierwsze kroki w automatyzacji testów wcale nie muszą być trudne. Za pomocą takich narędzi jak Selenium IDE, możemy rozpocząć automatyzować nasze testy nawet wtedy, gdy nie posiadamy specjalistycznej wiedzy w tym zakresie. Dzięki obszernej i przystępnie napisanej dokumentacji oraz stronom internetowym, grupom tematycznym i forom poświęconym tematyce automatyzacji testów stopniowo tę wiedzę poszerzać.