Mamy automatyczny TEST 🙂

W wideo, w części “Zadania”, umieściliśmy przykładowe rozwiązania zadań, których opis znajdziesz na końcu tej lekcji. Proponujemy najpierw podjąć samodzielną próbę rozwiązania zadań a następnie zweryfikowania ich z materiałem video.

AKTUALIZACJA lekcji wideo:
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.

W wyniku ciężkiej pracy otrzymaliśmy bardzo podstawowy test (Smoke test) sprawdzający czy pod danym adresem znajduje się strona o określonym tytule. Bonusowo przygotowaliśmy przy tym całe środowisko skonfigurowane do pisania i uruchamiania testów oraz masę nowej wiedzy :).
Były pakiety, moduły, metody, funkcje, zmienne i instrukcje oraz traceback, print, konsola, IDE, assert i wiele innych. Naprawdę sporo wiedzy – kolejne kursy utrwalą te pojęcia więc nie martw się, jeśli jeszcze swobodnie nie posługujesz się terminami wspomnianymi w poprzednich lekcjach. Zobaczmy jak powinien wyglądać cały kod w IDE:

from selenium import webdriver

driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe")
driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
title = driver.title
print(title)
assert 'Demobank - Bankowość Internetowa - Logowanie' == title
driver.quit()

Teraz Ty

Doszliśmy do końca pierwszej części ale to nie koniec wyzwań dla Ciebie na dziś. Jako automatyk dostajesz dwa zlecenia:

  • Rekruter chce sprawdzić, że nie tylko potrafisz przepisać kod z tutoriala, więc prosi Ciebie, abyś przetestował stronę wylosowaną przez https://www.discuvver.com/ (kliknij Take me to a useful website!).
    Aktualizacja: 2021: Powyższa strona zdaje się nie działać, dlatego możemy również polecić https://theuselessweb.com/, która również zwraca podobną losową stronę 🙂
  • Znany polityk musi szybko “zniknąć” prywatną stronę z internetów i prosi Ciebie o zakodzenie automatu sprawdzającego czy strona xxxstwory.pln na pewno się nie wyświetla. Czy za pomocą asercji i pobranego tytułu jesteśmy w stanie to sprawdzić? Jeśli masz problemy z tym zadaniem zobacz końcówkę wideo na początku tej lekcji.

10 komentarzy

  1. Cześć, mam pytanie do zadania 2:

    W przypadku gdy robię to 1:1 jak w proponowanym rozwiązaniu to w moim przypadku pojawia się exception

    selenium.common.exceptions.WebDriverException: Message: unknown error: net::ERR_NAME_NOT_RESOLVED
    (Session info: chrome=86.0.4240.183).

    Aczkolwiek poradziłem sobie dodając obsługę wyjątku oraz zmieniając assercję związaną z title na asercje z wyszukiwaniem konkretnego tekstu

    
    from selenium import webdriver
    from selenium.common.exceptions import *
    
    driver = webdriver.Chrome(executable_path=r'D:\TestFiles\chromedriver.exe')
    try:
        driver.get('https://xxxstwory.pln')
    except WebDriverException:
    
        error_message = driver.find_element_by_xpath('/ html / body / div[1] / div[1] / div[2] / h1 / span').text
        long_error_message = driver.find_element_by_id('main-message').text
        print(error_message)
        print(long_error_message)
    
        assert error_message == 'Ta witryna jest nieosiągalna'
        assert long_error_message == 'Ta witryna jest nieosiągalna\n' \
                                     'Nie udało się znaleźć adresu IP serwera ze stroną xxxstwory.pln.\n' \
                                     'Uruchom Diagnostykę sieci systemu Windows.\n' \
                                     'DNS_PROBE_FINISHED_NXDOMAIN'
    
    

    Moje pytanie jest następujące czy takie rozwiązanie jest ok czy coś byście zmienili. Zastanawiam się czy lepiej wyszukiwać obiekt po id czy xpath.. Wiem że zakres użytych funkcji trochę wykracza poza zakres tej lekcji ale będę wdzięczny za odpowiedz 🙂

    Avatar Mateusz Dąbrowski
    1. Hej,
      Łapanie wyjątku w tym przypadku to dobry pomysł i kierunek 😉
      Ja jednakże poszedłbym w coś prostszego 😉

      from selenium import webdriver
      from selenium.common.exceptions import WebDriverException
      
      
      driver = webdriver.Chrome(executable_path=r'C:\TestFiles\chromedriver.exe')
      try:
          driver.get('https://xxxstwory.pln')
      except WebDriverException as ex:
          assert 'ERR_NAME_NOT_RESOLVED' in str(ex)
      except Exception as ex:
          raise ex
      
      

      Pominąłbym sprawdzanie wartości error_message wyświetlane w przeglądarce – wiadomość jest zależna od języka i w przypadku np. angielskiego test nie przejdzie. U mnie był ten przypadek, gdyż mam system i wszystkie aplikacje ustawione po angielsku 😀 Dodatkowo strona, która się wyświetla, jest stroną przeglądarki i myślę, że można pominąć zbieranie z niej elementów. Jeśli już mielibyśmy zczytywać elementy – to wybrałbym po ID (jeśli takowe jest dostępne). ID są odporne na zmiany w strukturze strony… chociaż czasem XPath też się przydaje – jak nie ma ID 😉
      Skupiłbym się na np. typie wyjątku i nazwie błędu jaki się spodziewamy – w tym przypadku WebDriverException oraz treści ERR_NAME_NOT_RESOLVED. W przypadku innych typów błędów – tutaj można go rzucić dalej raise ex.

      W dalszych lekcjach pakujemy takie skrypty w klasy testowe i metody testy – tam moglibyśmy skorzystać z modułu unitetst i metody assertRaises. Służy ona do testowania funkcji, które zwracają wyjątki.

      Pozdrawiam,
      K

      Krzysiek Kijas Krzysiek Kijas
  2. Cześć, właśnie skończyłam drugie zadanie, u mnie również test wyszedł pozytywny. Ale mimo że tytuł się nie wyświetlał, to assert porównałam do ciągu pustego ==” i przeszło. Proszę o podpowiedź czy tak to powinno wyglądać ?

    Avatar Monika Brzezińska
    1. Hej Monika🖐
      Drugie zadanie polegało na wejściu na nieistniejącą stronę. W takim przypadku w tytule (zakładce) wyświetla się adres strony. Czyli porównanie otrzymanego adresu strony z pustym ciągiem znaków powinno dać zdecydowanie negatywny rezultat np:

      
      from selenium import webdriver
      driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe")
      driver.get('https://xxxstwory.pln')
      title = driver.title
      print(title)
      assert '' == title
      driver.quit()
      

      Taki test daje negatywny wynik. No bo title zawiera zdecydowanie wartość xxxstwory.pln.

      Sprawdź jeszcze dokładnie czy nie przypisujesz do zmiennej title np pustego stringa etc i czy w asercji na pewno porównujesz title == ""

      Daj znaka jak poszło 😁

      Przemek Barański Przemek Barański

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *