Powrót do: Podstawy Testów Automatycznych w Selenium i Python cz. 1 – Twój pierwszy test automatyczny
Cel lekcji
Zrobimy eksperyment i zepsujemy nasz test. Jednak będzie to coś więcej niż tylko kontrolowany błąd który łatwo naprawić. Poznamy pierwszą technikę jak reagować i usuwać błędy w naszym kodzie.
Wideo wersja lekcji
W związku z odświeżeniem tekstu całej serii kursów – lekcje wideo mogą okazać się odrobinę nieaktualne. Pracujemy nad tym – mimo to pozostawiamy wersję wideo gdyż pokazane tam kroki są generalnie poprawne.
Nieprzechodząca asercja – jak sobie z nią radzić.
Zróbmy eksperyment i zepsujmy nasz test.
Powielamy linę z metodą driver.get()
, Oryginalną linię komentujemy za pomocą znaku #
(dzięki czemu nie będzie wykonywana). W niezakomentowanej kopii zmieniamy adres na https://demobank.jaktestowac.pl/logowanie_prod.html czyli:
#driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html') driver.get('https://demobank.jaktestowac.pl/logowanie_prod.html')
Uruchamiamy test i na konsoli widzimy:
C:\Users\jaktestowac\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/jaktestowac/PycharmProjects/demo_test/auto_test_1.py Demobank - Strong główna - Logowanie Traceback (most recent call last): File "C:/Users/jaktestowac/PycharmProjects/demo_tests/auto_test_1.py", line 8, inassert 'Demobank - Bankowość Internetowa - Logowanie' == title AssertionError Process finished with exit code 1
Przeanalizujmy tekst błędu z konsoli
- W pierwszej linii otrzymujemy informację o uruchomieniu: z jakiego Pythona skorzystaliśmy oraz jaki skrypt został uruchomiony.
- Druga to wypisany przez nas aktualny tytuł.
- Kolejna linia to jakby legenda, mamy słowo
Traceback
czyli opis stanu aplikacji w momencie wystąpienia błędu. Mianem traceback możemy nazwać cały opis błędu wypisanego na konsole w razie niepowodzenia uruchomienia skryptu. - Czwarta linia to dokładna nazwę pliku oraz linię w której wystąpił błąd. Gdybyśmy zmienili nasz skrypt w moduł to dla wartości
<module>
otrzymalibyśmy jego nazwę. - W linii piątej wskazane jest wyrażenie generujące błąd
- W szóstej linii zaprezentowana jest nazwa błędu
- Finalnie zaprezentowany jest
exit code
, który zazwyczaj będzie miał wartość0
lub1
co odpowiednio oznacza powodzenie lub niepowodzenie wykonania programu czy skryptu.
Z traceback widać, że nasza asercja spowodowała przerwanie wykonywania kodu ze względu na bliżej nieokreślony błąd 😉 .
TIP: Gdy coś nie działa w twoim kodzie należy spokojnie i analitycznie podejść do problemu gdyż większość wynika z błahych powodów jak literówka czy brak wcięcia.
Najpierw należy dokładnie zapoznać się z tekstem błędu z konsoli uruchomieniowej i odnaleźć linię w naszym kodzie która generuje błąd. Nie zawsze to jest oczywiste i proste, dlatego nie zrażaj się gdy natrafisz na problemy. Potraktuj to jako świetne ćwiczenie rozwijające umiejętności programowania. Gdy nie znajdziesz odpowiedzi zawsze napisz na naszym forum lub zostaw komentarz 🙂
Z pewnością nurtuje Ciebie pytanie czemu nie ma dokładnej informacji dlaczego asercja nie przeszła? Niestety ten rodzaj asercji sprawdza tylko wartość poprawną bądź błędną jednak istnieją pakiety, które wypiszą na konsolę o wiele więcej informacji (użyjemy ich w kolejnym kursie).
Na obecną chwilę możemy stwierdzić, że warunek równości 'Demobank - Bankowość Internetowa - Logowanie' == title
nie jest spełniony. Pasowało by się dowiedzieć co ma w sobie title
. Wcześniej w kodzie użyliśmy funkcji print()
do wypisania wartości dla title
na konsolę i właśnie z tego pomysłu skorzystamy. Porównując spodziewaną wartość z aktualną wartością zmiennej title
można wywnioskować, że któraś z nich jest niepoprawna.
TIP: Czasem nie jest oczywiste gdzie leży problem. Może się tak zdarzyć, że to nasze testy są nieaktualne i nowe wartości na stronie są poprawne. Automaty jedynie wykrywają zmiany, a zidentyfikowanie problemu i jego usunięcie to już osobne działania związane z rozmową z osobami tworzącymi daną stronę i analizą wdrażanych wymagań.
TIP: Jako wartości do porównania zmiennej title
użyliśmy tekstu rozpoczynającego się i zakończonego apostrofem '
. Taką konstrukcję nazywamy łańcuchem znakowym, albo krótko string). Stosując w string na końcu i na początku apostrofy '
sprawiamy, że Python rozumie, że nie jest to jakaś specjalna nazwa tylko zwykły tekst, Tekst jest wczytywany od pierwszego apostrofu do kolejnego.
A co się stanie jak w tekście wystąpi apostrof? Nasz program prawdopodobnie nie zadziała. Dlatego możemy użyć na szybko alternatywę w postaci znaku cudzysłowu "
do otoczenia naszego łańcucha znakowego np: "Rozmawiałem ze Steve'em"
. Analogicznie można zrobić z cudzysłowem czyli 'Powiedział "Hi"'
.
A co jeśli będziemy chcieli w naszym tekście zarówno z apostrofów i cudzysłowów? Stosujemy wtedy tak zwany escaping czyli dodanie w tekście przed każdym apostrofem bądź cudzysłowem znaku \
(backslash) np: 'Rozmawiałem ze Steve\'em. Powiedział "Hi"'
lub "Rozmawiałem ze Steve'em. Powiedział \"Hi\""
. Gdy będziemy wyświetlać ten string na konsole backslash-e zostaną usunięte.
No i oczywiście możemy na wszystkich '
i "
zrobić escaping i nie ma znaczenia co zastosujemy do otoczenia naszego tekstu: 'Rozmawiałem ze Steve\'em. Powiedział \"Hi\"'
i "Rozmawiałem ze Steve\'em. Powiedział \"Hi\""
Pamiętaj aby zawsze używać innych bądź “eskejpowanych” apostrofów lub cudzysłowów niż te którymi rozpoczyna i kończy się string.
Wracamy do poprawnej wersji driver.get()
czyli:
driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
Usuń lub zakomentuj (pamiętasz? Znak #
na początku linii) niepotrzebną linię z pobraniem strony powodującej błąd w asercji.
Sprzątamy i podsumowujemy
Aby ułatwić sobie sprawę dodaję automatyczne zamykanie przeglądarki poprzez użycie metody drivera quit()
czyli wpisuję na końcu linię:
driver.quit()
quit()
występuje również metoda close()
, która także bywa używana do zamykania przeglądarki po testach. Aczkolwiek występują pewne różnice w ich zachowaniach, o których warto pamiętać i mieć je na uwadze. Więcej o nich dowiesz się w naszym słowniku – driver.close() vs. driver.quit(). Ogólnie zalecamy stosować quit()
, która zamyka całą przeglądarkę w poprawny sposób 😉
No i test zakończony – zobacz exit code
na konsoli. Poznaliśmy traceback
gdy wystąpi błąd i jak wstępnie dokonać jego analizy oraz użyliśmy nowej metod dla driver
. Następna lekcja to prezentacja całego rozwiązania z tego kursu i zadania indywidualne dla Ciebie.
Mój błąd, test zrobiłem w nowym pliku a przy metodzie RUN program z automatu odpalał mi auto_test_1 – trzeba uważać!
To prawda – konfiguracje w PyCharmie czasem lubią utrudniać życie 😀 Dlatego w drugiej części poświęcamy im trochę czasu 😉
Błędu nie będzie ponieważ strona: ‘https://demobank.jaktestowac.pl/logowanie_prod.html’ ma podobny czyli taki sam tytuł jak poprzednia!