Poprzednim razem zajmowaliśmy się podstawami Selenium oraz narzędziem Selenium IDE. Niniejszy tekst jest jednak dedykowany nieco bardziej doświadczonym użytkownikom. W poniższym wpisie postaram się Wam przedstawić gotową receptę na typowy problem, przed którym często stają osoby tworzące skrypty w Selenium, a mianowicie obsługę upload’u plików.

Automatyzując scenariusze testowe wielokrotnie napotkamy na potrzebę upload’u różnego rodzaju plików (plików graficznych czy plików z określonymi danymi). Pół biedy jeżeli ścieżkę do takiego pliku można wpisać bezpośrednio do pola formularza, używając standardowych metod Selenium. Problem pojawia się natomiast wówczas, gdy wskazanie upload’owanego pliku możliwe jest jedynie za pomocą dedykowanego okna (file upload dialog). Omówimy tu właśnie taki przypadek.

Obsługa przycisku Browse

O ile głównym obiektem naszego zainteresowania jest okienko dedykowane do upload’u plików, o tyle problemy mogą pojawić się nieco wcześniej – już na etapie próby wywołania wspomnianego okienka.

Jeśli wszystko pójdzie po naszej myśli, komenda selenium.click() wywołana na przycisku Browse spowoduje otwarcie dialog’u do upload’u plików. Z doświadczenia wiem jednak, że nie zawsze będziemy mieć tyle szczęścia – ostatnio dwukrotnie napotkałem na sytuację, gdzie pomimo udanego kliknięcia w przycisk Browse okno do uload’u nie było wywoływane. Sytuacja miała miejsce dla aplikacji napisanych we Flex’ie oraz w HTML5.

Co zrobić w sytuacji, gdy Selenium nie radzi sobie z postawionym przed nim zadaniem? Naturalnym wydaje się wyszukanie alternatywnego narzędzia, które pozwoli to zadanie zrealizować. W omawianym przeze mnie przypadku wybór padł na AutoIT.

AutoIT jest narzędziem dedykowanym automatyzacji aplikacji okienkowych (więcej informacji na temat AutoIT znaleźć można na stronie: http://www.autoitscript.com), w tym przypadku użyte zostanie jednak do wsparcia automatyzacji aplikacji webowej.

Skrypt AutoIT, klikający w przycisk Browse:

Zmienne x oraz y służą do określenia współrzędnych punktu, gdzie ma nastąpić kliknięcie myszą. Do wyznaczenia współrzędnych użyta została funkcja _ImageSearch. Przyjrzyjmy się jej bliżej.

Pierwszy parametr („browseButton.bmp”) to obraz wzorcowy, którego będziemy szukać na stronie (musi być w formacie .bmp). W naszym przypadku będzie to przycisk Browse.

Kolejny parametr (1) to wartość zwracana przez funkcję w przypadku udanego odnalezienia wzorca. $x oraz $y to współrzędne odnalezionego wzorca (które posłużą potem do symulacji kliknięcia myszą w miejsce, gdzie znajduje się przycisk Browse). Ostatnia wartość (50) określa natomiast tolerancję w zakresie kolorów pomiędzy wzorcem a przeszukiwanym obrazem (dopuszczalny zakres wartości to 0-255).

W przypadku udanego odnalezienia podanego wzorca następuje kliknięcie myszą w punkt określony współrzędnymi x oraz y.

Powyższy prosty skrypy AutoIT pozwala zrealizować zadanie, którego nie udalo nam się zrealizować używając Selenium. Jego uruchomienie powoduje kliknięcie przycisku Browse, a w rezultacie wyświetleni okna file uload dialog, którego obsługą zajmiemy się w dalszej części niniejszego tekstu.

Obsługa okienka upload’u plików

Okno do upload’u plików jest standardową kontrolką Windows. Jego obsługa wykracza więc poza możliwości Selenium. Jest to kolejna sytuacja, gdzie z pomocą może przyjść AutoIT. Rozbudujemy poprzedni skrypt o obsługę wspomnianego okienka.

Metoda WinWaitActive spowoduje, że skrypt będzie oczekiwał na wyświetlenie okna o podanym w parametrze metody tytule. Po pojawieniu się okna wykonana zostanie dalsza cześć skryptu.

W omawianym przypadku tytuł okna zmienia się dynamicznie, dlatego też wartość parametru metody została rozszerzona o zmienną definiująca zmieniająca się część tytułu ($CmdLine[1]). Wartość zmiennej jest określana w momencie wywoływania skryptu (o czym będzie jeszcze mowa później).

Dwie kolejne linie skryptu powodują wpisanie do formularza ścieżki do pliku, który chcemy załadować na stronę oraz wciśnięcie przycisku Enter. Gdyby zaszła potrzeba wgrywania różnych plików, wartość parametru metody Send() można zastąpić zmienną, podobnie jak w przypadku metody WinWaitActive().

Kompilacja skryptu AutoIT

W celu skorzystania z napisanego wcześniej skryptu musimy go skompilować. Najlepszym do tego narzędziem (jak i do tworzenia samych skryptów) jest dedykowany AutoIT edytor SciTE (do pobrania ze strony http://www.scintilla.org).

Skrypt kompilujemy używając komendy Tools -> Compile (lub kombinacji klawiszy Ctrl + F7). W rezultacie otrzymamy plik .exe.

Działanie skryptu można również przetestować jeszcze przed kompilacją, używając z poziomu SciTE komendy Tools -> Go (lub przycisku F5).

Korzystanie ze skryptu z poziomu Javy

Mamy już skrypt AutoIT realizujący oba problematyczne zadania – kliknięcie w przycisk Browse oraz obsługę okna do upload’u plików. Pozostaje nam więc jedynie napisać metodę, która pozwoli na korzystanie ze stworzonego wcześniej skryptu.

Do uruchamiania pliku .exe ze skryptem użyty został obiekt klasy ProcessBuilder. W zaprezentowanym przypadku pierwszy parametr konstruktora to ścieżka do pliku .exe, drugi natomiast to parametr przypisywany w skrypcie AutoIT za zmienną $CmdLine[1]. Oczywiście, w razie potrzeby możliwe jest podanie większej liczby parametrów.