Wpis z mikrobloga

Jakiś czas temu zaproponowałem na mirko #kursrobotframework (https://www.wykop.pl/wpis/43796003/hej-mirki-i-mirabelki-sorry-za-spam-tagami-ale-chc/). Minęło sporo czasu, ale jak coś mówię, to nie trzeba mi co roku przypominać.

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
  • 25
dodam jeszcze, że tym razem wykop nie skomasował mi spacji w jedną, nie ogarniam kiedy to robi, a kiedy nie
@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.
@Movet: no, problem. warto zatem dodać, że tak się zagalopowałem, że nie napisałem jak uruchomić test xD

otóż: będąc w katalogu, gdzie mamy plik subscribe.robot wpisujemy

robot subscribe.robot
ewentualnie z dowolnego katalogu:

robot path/to/subscribe.robot
@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 - @bb89: jakie korzyści niesie? to temat na oddzielny wpis. Przede wszystkim: au...

źródło: comment_1611565163o41lXvDuP3Edjt9WV1kOkc.jpg

Pobierz
@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
@bb89: Zacznę od końca ;)

- 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
@henk: dzieki za odpowiedz, czy korzystales moze z Zalenium lub cos na ten wzor? Chodzi mi o odpalanie rownolegle wielu testow z mozliwym podgladem?
@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
Pelen_watpliwosci - @henk: elo, probowałem dostac sie do katalogu z robotem (na pulpi...

źródło: comment_1611606286IzTdmwTZAppEgBlroCnZUH.jpg

Pobierz
via Wykop Mobilny (Android)
  • 0
@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