Zapraszam zatem do lektury osoby zainteresowane #testowanieoprogramowania, ale również tych, którzy po prostu chcą konstruktywnie spędzić zimowy wieczór podczas kwarantanny i nauczyć się podstaw automatyzacji. Przy okazji liźniemy tematy związane z #programowanie w #python, może kiedyś #javascript, zobaczymy jak się to potoczy. Kurs będzie od podstaw, więc nie zdziwcie się, jeśli spotkacie oczywiste dla was rzeczy, ale celem jest pokazanie, że ogarnięta Pani Krysia z HR też może pisać automaty, nie mając pojęcia ani nie potrzebując żadnych klas, metod, obiektów, interfejsów, isków ani dupiksów. (chociaż ja wie co to jest, to może korzystać z ich dobrodziejstw)
Zaczniemy od instalacji niezbędnego oprogramowania i napiszemy proste zadanie, które zautomatyzuje jakąś stronę, w naszym przypadku: zaobserwujemy tag na wykopie. Do dzieła zatem!
1. Instalacja:
Dziś będziemy automatyzować przeglądarkę, więc jakąś musimy mieć. Załozyłem sobie chrome, bo prawdopodobnie wielu z was ma to już w systemie. Jeśli nie – instalujemy sobie chrome, czy chromium jeśli ktoś woli, a potem:
- windows/macos: ściągamy pythona (jakiegoś z gałęzi 3) i instalujemy pythona: https://www.python.org/downloads/ ważne, by podczas instalacji zaznaczyć opcję instalacji pip oraz dodanie tego do PATH; linux – używamy naszego menedżera pakietów (zakładam, że jak ktoś ma linuxa, to umie z niego korzystać, więc instalacja nie powinna mu nastręczać problemów, ale tak dla przyzwoitości, dla debianopochodnych wpisujemy sudo apt-get install python3 python3-pip)
- odpalamy czarne okienko: w windows: naciskamy przyciski Win+R, wpisujemy cmd albo powershell i dajemy Enter, w linuxie i MacOS odpalamy jakiś Terminal.
- wpsiujemy:
python --version powinniśmy zobaczyć info o wersji, którą zainstalowaliśmy, analogicznie wpisujemy
pip --version jeśli pokaże się informacja, że nie mamy takich programów, polecam spróbować python3 zamiast python, oraz pip3 zamiast pip, bo różnie się zdarza, szczególnie na linuxach...
- teraz zainstalujemy sobie paczki pythona, które wydzielą nam wyizolowane środowisko dla naszego kursu. Krok ten nie jest niezbędny, ale jak da się coś odizolować, to lepiej to zrobić. Unikniemy przykrych niespodzianek, kiedy to zaktualizujemy jakąś paczkę i coś posypie się w innym miejscu, zatem:
- dla windows, wpisujemy w czarne okienko:
pip install virtualenvwrapper-win virtualenv dla linux
pip install virtualenvwrapper virtualenv dodatkowo dla linuxa (dla MacOS nie pamiętem, ale możliwe, że też) trzeba wyedytować plik ~/.bashprofile i dodać w nim następujące linijki:
VIRTUALENVWRAPPER_PYTHON=$(which /usr/bin/python3) source $(which virtualenvwrapper.sh) a następnie wpiasać:
source ~/.bash_profile Od tego momentu, wszystkie komendy będą wyglądać na każdym systemie operacyjnym tak samo, no chyba, że wyraźnie podkreślę, że jest inaczej.
-wpisujemy (kursrf w komendzie poniżej, to po prostu nazwa, jak macie życzenie, to swoje środowisko możecie nazwać na przykład pszemek):
mkvirtualenv -p3 kursrf coś tam może się wyświetlić, jakieś dodatkowe okienka mogą się pojawiać i znikać, grunt żeby na końcu otrzymać znak zachęty wyglądający z grubsza tak:
(kursrf) henk@HENK:~$ albo
(kursrf) C:\Users\henk> Ujęta w nawiasy nazwa kursrobotframework to nazwa virtualnego środowiska python, o którym wspominałem wcześniej i które to zapewnia nam izolację od reszty systemu.
Jeśli chcemy wyjść z tego środowiska, wpisujemy:
deactivate No, ale my chcemy być w tym środowisku, bo jakbyśmy nie chcieli, to bym się nie produkował tyle, żeby to opisać, więc wpisujemy:
workon kursrf Teraz mały trick – (większość pewnie zna, ale) to powyżej to sporo pisania, a my jesteśmy leniwi, więc wystarczy zacząć wpisywać: workon ku i nacisnąć tabulator – powłoka podpowie nam nazwy środowisk, które mamy, a po wpisaniu samego workon zobaczymy listę wszystkich środowisk, które stworzyliśmy.
No dobra, to skoro jesteśmy już wewnątrz środowiska, możemy zacząć instalować w nim upragnione przez nas paczki. Tak na dobrą sprawę, to jeśli ktoś wie co robi i nie chce się bawić ze środowiskami wirtualnymi, to może zacząć od tego momentu. Zaczynamy wpisywać komendy (webdrivermanager – nie mylić z webdriver-manager):
pip install robotframework robotframework-seleniumlibrary webdrivermanager Jak skończy się instalować, wpisujemy komendę, która zainstaluje nam tzw. Webdriver, czyli program, który umie sterować naszą przeglądarką. Ponieważ założylismy, że używamy chrome, wpisujemy:
webdrivermanager chrome I sprawdzamy, czy wszystko poszło gładko wpisując:
robot --version chromedriver --version Tutaj mała dygresja, programiści chromedrivera czy chrome mają gdzieś kompatybilność, więc pewne wersje chrome są kompatybilne tylko z pewnymi wersjami chromedrivera. Więc może się wcześniej, czy później zdarzyć, że podczas automatyzacji przywiata was komunikat, że ta wersja chromedrivera nie działa już z tą wersją chrome (coś takiego: This version of ChromeDriver only supports Chrome version 88) bo wielce prawdopodobne, że wersja chrome wam urośnie, a wasz chromedriver dalej będzie stary. Wtedy instalację webdrivera trzeba będzie powtórzyć. Opis kompatybilności znajdziecie tu: https://chromedriver.chromium.org/downloads
Tutaj kończy się wspaniały etap instalacji, jego wspaniałość polega zasadniczo na tym, że robi się to tylko raz. Teraz przystępujemy do pisania naszego pierwszego testu automatycznego. Wybieramy zatem jakiś katalog, tworzymy w nim plik o nazwie kończącej się rozszerzeniem robot. Na przykład subskrybuj.robot
Można to zrobić z linii komend, albo zwyczajnie otworzyć sobie ulubiony edytor i zapisać plik jako subskrybuj.robot właśnie.
Tu natrafiamy na mały problem organizacyjny. RobotFramewok używa kilku spacji, bądź tabulatora jako separatora, za to wykop ochoczo wycina nadmiarowe spacje, łącząc je w jedną. Dlatego skryptów automatyzujących nie będziecie mogli tak po prostu skopiować z treści tego wpisu, bo spacje w nich zastąpiłem spacjami nierozdzielającymi. RobotFramework z kolei nie za bardzo lubi spacje nierodzielające, więc na potrzeby „wizualizacji” kodu we wpisie będę używał tych spacji nierozdzielających, a wy będziecie musieli to przepisać, albo skorzystać z linków do pastebin, które bądą pod fragmentami kodu.
x x – pomiędzy x jest sześć spacji nierodzielających y y – pomiędzy y było sześć zwykłych spacji, ale wykop skomasował je w jedną zatem nasz plik subskrybuj.robot powinien wyglądać tak
*** Settings *** Library SeleniumLibrary Library Dialogs *** Variables *** ${username} TU_WPISZ_SWÓJ_LOGIN ${password} TU_WPISZ_SWOJE_HASŁO *** Test Cases *** Subscribe Tag Open Browser [https://www.wykop.pl/zaloguj/](https://www.wykop.pl/zaloguj/) chrome Input Text (//input[@name='user[username]'])[2] ${username} Input Password (//input[@name='user[password]'])[3] ${password} Click Element //button[text()='Zaloguj się'] Execute Manual Step Enter Two Factor authentication code, then click Weryfikuj kod on webpage. \nAfter all click PASS in this window. If you do not use 2FA, just click PASS. Go To [https://www.wykop.pl/tag/kursrobotframework/](https://www.wykop.pl/tag/kursrobotframework/) Run Keyword And Ignore Error Click Element //*[contains(text(), 'obserwuj') and not(contains(text(), 'nie'))] Go to [https://www.wykop.pl/mikroblog/](https://www.wykop.pl/mikroblog/) Element Should Contain (//*[@class='fix-tagline'])[2] kursrobotframework Taki oto potworek otwiera przeglądarkę, loguje się na wykop, prosi o podanie kodu 2FA, subskrybuje tag ignorując krok jeśli tag już subskrybujesz, a na koniec sprawdza, czy udało się dodać tag do subskrybowanych.
Nie przejmujcie się na razie jeśli nie rozumiecie wielu magicznych napisów, wyjaśnię je już w następnym odcinku, pokaże jak je ukryć, żeby nie szpeciły kodu oraz omówię jak działa automatyzacja przeglądarki w ogólnym przypadku
@henk Weź to wrzucaj dodatkowo na jakiś blog czy stronkę z odpowiednim formatowaniem. Niestety na wypoku słabo się czyta, a chetnie bym to przyjął w bardziej zjadliwej formie.
@henk: mając do zautomatyzowania serwis www, co będzie lepsze: robot framework czy po prostu pytest z selenium odpalanym na dockerze? Nie znam robota i nie wiem za bardzo jakie korzyści on niesie
@bb89: jakie korzyści niesie? to temat na oddzielny wpis. Przede wszystkim: automaty może pisać każdy ogarnięty człowiek, np. biznes analityk, czy tester manualny, który nie umie programować. Dodatkowo - twój test automatyczny to de facto user story, czytelne dla człowieka, ale i dla komputera. Co będzie lepsze? Siłą rzeczy będę się skłaniał ku robotowi, bo miałem do czynienia z wieloma językami i frameworkami i na razie nic prostszego niż robot nie
@henk: i tak i nie moim zdaniem ( ͡°͜ʖ͡°) zaczne od końca, ten screenshot to faktycznie zwykly skrypt ale uzywajac page objecta gdzie raz deklarujesz konkretne fieldy, funkcje daje duzo przejrzystosci i wyglada lepiej niz na obrazku. Po drugie rozumiem podejscie BDD czy keyword driven, ale co w sytuacji kiedy musimy nadpisac bazowa metode np findelement zeby na przyklad dolozyc robienie screenshotow przy errorze albo
- możesz tworzyć własne keywordy (w ogóle należy przyjąć, że keyword to odpowiednik metody) - i możesz to robić albo tworząc nowy keyword za pomocą istniejących keywordów, albo napisać kawałek kodu w pythonie, czy javascripcie (a nawet bashu, czy javie jak jesteś prawdziwym szaleńcem)
- możesz napisać metodę robiącą screenshota podczas błędu, ale po co? Biblioteka Selenium dla Robota ma
@henk: elo, probowałem dostac sie do katalogu z robotem (na pulpicie zrobiłem), dostałem się i po wpisaniu komendy, mam taką zwrotkę:
C:\Users\xyz>robot pisz.robot 'robot' is not recognized as an internal or external command, operable program or batch file. zaś po spróbowaniu innej komendy, troche inna zwrotka:
C:\Users\xyz\OneDrive\Pulpit\katalog>python -m robot pisz.robot C:\Users\xyz\AppData\Local\Programs\Python\Python39\python.exe: No module named robot
@bb89: nie spotkałem się z tym narzędziem, ale po pierwszym przejrzeniu widzę, że to ładniej opakowany grid, więc jak najbardziej to ożenienia z robotframeworkiem. Jeśli chodzi o uruchamiane wielu testów naraz, RF posiada swój własny egzekutor zwany pabot
Jak macie lekarzowi przynieść próbkę kału do badania laboratoryjnego to w czym się taką próbkę przynosi i ile tego gówna trzeba przynieść? I niby jak ja mam to wszystko ogarnąc, na rękę mam sobie nasrać i wsadzić to do pudełka?
Zapraszam zatem do lektury osoby zainteresowane #testowanieoprogramowania, ale również tych, którzy po prostu chcą konstruktywnie spędzić zimowy wieczór podczas kwarantanny i nauczyć się podstaw automatyzacji. Przy okazji liźniemy tematy związane z #programowanie w #python, może kiedyś #javascript, zobaczymy jak się to potoczy. Kurs będzie od podstaw, więc nie zdziwcie się, jeśli spotkacie oczywiste dla was rzeczy, ale celem jest pokazanie, że ogarnięta Pani Krysia z HR też może pisać automaty, nie mając pojęcia ani nie potrzebując żadnych klas, metod, obiektów, interfejsów, isków ani dupiksów. (chociaż ja wie co to jest, to może korzystać z ich dobrodziejstw)
Zaczniemy od instalacji niezbędnego oprogramowania i napiszemy proste zadanie, które zautomatyzuje jakąś stronę, w naszym przypadku: zaobserwujemy tag na wykopie. Do dzieła zatem!
1. Instalacja:
Dziś będziemy automatyzować przeglądarkę, więc jakąś musimy mieć. Załozyłem sobie chrome, bo prawdopodobnie wielu z was ma to już w systemie. Jeśli nie – instalujemy sobie chrome, czy chromium jeśli ktoś woli, a potem:
- windows/macos: ściągamy pythona (jakiegoś z gałęzi 3) i instalujemy pythona: https://www.python.org/downloads/
ważne, by podczas instalacji zaznaczyć opcję instalacji pip oraz dodanie tego do PATH; linux – używamy naszego menedżera pakietów (zakładam, że jak ktoś ma linuxa, to umie z niego korzystać, więc instalacja nie powinna mu nastręczać problemów, ale tak dla przyzwoitości, dla debianopochodnych wpisujemy sudo apt-get install python3 python3-pip)
- odpalamy czarne okienko: w windows: naciskamy przyciski Win+R, wpisujemy cmd albo powershell i dajemy Enter, w linuxie i MacOS odpalamy jakiś Terminal.
- wpsiujemy:
python --version
powinniśmy zobaczyć info o wersji, którą zainstalowaliśmy, analogicznie wpisujemy
pip --version
jeśli pokaże się informacja, że nie mamy takich programów, polecam spróbować python3 zamiast python, oraz pip3 zamiast pip, bo różnie się zdarza, szczególnie na linuxach...
- teraz zainstalujemy sobie paczki pythona, które wydzielą nam wyizolowane środowisko dla naszego kursu. Krok ten nie jest niezbędny, ale jak da się coś odizolować, to lepiej to zrobić. Unikniemy przykrych niespodzianek, kiedy to zaktualizujemy jakąś paczkę i coś posypie się w innym miejscu, zatem:
- dla windows, wpisujemy w czarne okienko:
pip install virtualenvwrapper-win virtualenv
dla linux
pip install virtualenvwrapper virtualenv
dodatkowo dla linuxa (dla MacOS nie pamiętem, ale możliwe, że też) trzeba wyedytować plik ~/.bashprofile i dodać w nim następujące linijki:
VIRTUALENVWRAPPER_PYTHON=$(which /usr/bin/python3)
source $(which virtualenvwrapper.sh)
a następnie wpiasać:
source ~/.bash_profile
Od tego momentu, wszystkie komendy będą wyglądać na każdym systemie operacyjnym tak samo, no chyba, że wyraźnie podkreślę, że jest inaczej.
-wpisujemy (kursrf w komendzie poniżej, to po prostu nazwa, jak macie życzenie, to swoje środowisko możecie nazwać na przykład pszemek):
mkvirtualenv -p3 kursrf
coś tam może się wyświetlić, jakieś dodatkowe okienka mogą się pojawiać i znikać, grunt żeby na końcu otrzymać znak zachęty wyglądający z grubsza tak:
(kursrf) henk@HENK:~$
albo
(kursrf) C:\Users\henk>
Ujęta w nawiasy nazwa kursrobotframework to nazwa virtualnego środowiska python, o którym wspominałem wcześniej i które to zapewnia nam izolację od reszty systemu.
Jeśli chcemy wyjść z tego środowiska, wpisujemy:
deactivate
No, ale my chcemy być w tym środowisku, bo jakbyśmy nie chcieli, to bym się nie produkował tyle, żeby to opisać, więc wpisujemy:
workon kursrf
Teraz mały trick – (większość pewnie zna, ale) to powyżej to sporo pisania, a my jesteśmy leniwi, więc wystarczy zacząć wpisywać: workon ku i nacisnąć tabulator – powłoka podpowie nam nazwy środowisk, które mamy, a po wpisaniu samego workon zobaczymy listę wszystkich środowisk, które stworzyliśmy.
No dobra, to skoro jesteśmy już wewnątrz środowiska, możemy zacząć instalować w nim upragnione przez nas paczki. Tak na dobrą sprawę, to jeśli ktoś wie co robi i nie chce się bawić ze środowiskami wirtualnymi, to może zacząć od tego momentu. Zaczynamy wpisywać komendy (webdrivermanager – nie mylić z webdriver-manager):
pip install robotframework robotframework-seleniumlibrary webdrivermanager
Jak skończy się instalować, wpisujemy komendę, która zainstaluje nam tzw. Webdriver, czyli program, który umie sterować naszą przeglądarką. Ponieważ założylismy, że używamy chrome, wpisujemy:
webdrivermanager chrome
I sprawdzamy, czy wszystko poszło gładko wpisując:
robot --version
chromedriver --version
Tutaj mała dygresja, programiści chromedrivera czy chrome mają gdzieś kompatybilność, więc pewne wersje chrome są kompatybilne tylko z pewnymi wersjami chromedrivera. Więc może się wcześniej, czy później zdarzyć, że podczas automatyzacji przywiata was komunikat, że ta wersja chromedrivera nie działa już z tą wersją chrome (coś takiego: This version of ChromeDriver only supports Chrome version 88) bo wielce prawdopodobne, że wersja chrome wam urośnie, a wasz chromedriver dalej będzie stary. Wtedy instalację webdrivera trzeba będzie powtórzyć. Opis kompatybilności znajdziecie tu: https://chromedriver.chromium.org/downloads
Tutaj kończy się wspaniały etap instalacji, jego wspaniałość polega zasadniczo na tym, że robi się to tylko raz. Teraz przystępujemy do pisania naszego pierwszego testu automatycznego. Wybieramy zatem jakiś katalog, tworzymy w nim plik o nazwie kończącej się rozszerzeniem robot. Na przykład subskrybuj.robot
Można to zrobić z linii komend, albo zwyczajnie otworzyć sobie ulubiony edytor i zapisać plik jako subskrybuj.robot właśnie.
Tu natrafiamy na mały problem organizacyjny. RobotFramewok używa kilku spacji, bądź tabulatora jako separatora, za to wykop ochoczo wycina nadmiarowe spacje, łącząc je w jedną. Dlatego skryptów automatyzujących nie będziecie mogli tak po prostu skopiować z treści tego wpisu, bo spacje w nich zastąpiłem spacjami nierozdzielającymi. RobotFramework z kolei nie za bardzo lubi spacje nierodzielające, więc na potrzeby „wizualizacji” kodu we wpisie będę używał tych spacji nierozdzielających, a wy będziecie musieli to przepisać, albo skorzystać z linków do pastebin, które bądą pod fragmentami kodu.
x x – pomiędzy x jest sześć spacji nierodzielających
y y – pomiędzy y było sześć zwykłych spacji, ale wykop skomasował je w jedną
zatem nasz plik subskrybuj.robot powinien wyglądać tak
https://0bin.net/paste/CYnMgsxI#GZ2EvDCV3-OcNFgo2qOsfpSHrhBbQQQb0s1fMbkFNv5
*** Settings ***
Library SeleniumLibrary
Library Dialogs
*** Variables ***
${username} TU_WPISZ_SWÓJ_LOGIN
${password} TU_WPISZ_SWOJE_HASŁO
*** Test Cases ***
Subscribe Tag
Open Browser [https://www.wykop.pl/zaloguj/](https://www.wykop.pl/zaloguj/) chrome
Input Text (//input[@name='user[username]'])[2] ${username}
Input Password (//input[@name='user[password]'])[3] ${password}
Click Element //button[text()='Zaloguj się']
Execute Manual Step Enter Two Factor authentication code, then click Weryfikuj kod on webpage. \nAfter all click PASS in this window. If you do not use 2FA, just click PASS.
Go To [https://www.wykop.pl/tag/kursrobotframework/](https://www.wykop.pl/tag/kursrobotframework/)
Run Keyword And Ignore Error Click Element //*[contains(text(), 'obserwuj') and not(contains(text(), 'nie'))]
Go to [https://www.wykop.pl/mikroblog/](https://www.wykop.pl/mikroblog/)
Element Should Contain (//*[@class='fix-tagline'])[2] kursrobotframework
Taki oto potworek otwiera przeglądarkę, loguje się na wykop, prosi o podanie kodu 2FA, subskrybuje tag ignorując krok jeśli tag już subskrybujesz, a na koniec sprawdza, czy udało się dodać tag do subskrybowanych.
Nie przejmujcie się na razie jeśli nie rozumiecie wielu magicznych napisów, wyjaśnię je już w następnym odcinku, pokaże jak je ukryć, żeby nie szpeciły kodu oraz omówię jak działa automatyzacja przeglądarki w ogólnym przypadku
Komentarz usunięty przez autora
otóż: będąc w katalogu, gdzie mamy plik subscribe.robot wpisujemy
robot subscribe.robot
ewentualnie z dowolnego katalogu:
robot path/to/subscribe.robot
Komentarz usunięty przez autora
Co będzie lepsze? Siłą rzeczy będę się skłaniał ku robotowi, bo miałem do czynienia z wieloma językami i frameworkami i na razie nic prostszego niż robot nie
źródło: comment_1611565163o41lXvDuP3Edjt9WV1kOkc.jpg
PobierzPo drugie rozumiem podejscie BDD czy keyword driven, ale co w sytuacji kiedy musimy nadpisac bazowa metode np findelement zeby na przyklad dolozyc robienie screenshotow przy errorze albo
- możesz nadpisać domyślne implementacje keywordów
- możesz tworzyć własne keywordy (w ogóle należy przyjąć, że keyword to odpowiednik metody) - i możesz to robić albo tworząc nowy keyword za pomocą istniejących keywordów, albo napisać kawałek kodu w pythonie, czy javascripcie (a nawet bashu, czy javie jak jesteś prawdziwym szaleńcem)
- możesz napisać metodę robiącą screenshota podczas błędu, ale po co? Biblioteka Selenium dla Robota ma
C:\Users\xyz>robot pisz.robot
'robot' is not recognized as an internal or external command,
operable program or batch file.
zaś po spróbowaniu innej komendy, troche inna zwrotka:
C:\Users\xyz\OneDrive\Pulpit\katalog>python -m robot pisz.robot
C:\Users\xyz\AppData\Local\Programs\Python\Python39\python.exe: No module named robot
źródło: comment_1611606286IzTdmwTZAppEgBlroCnZUH.jpg
Pobierzpip freeze
(kursrf) C:\Users\damian\OneDrive\Pulpit\katalog>robot pisz.robot
[ ERROR ] Suite 'Pisz' contains no tests or tasks.
Jak wygląda twój plik? Minimaln właściwy plik wygląda tak
*** Test Cases ***
Hello
_____Log To Console_____Hello World
Wykop zjada spacje, więc musisz sobie zastąpić spacjami