Powrót do: Podstawy Testów Automatycznych w Selenium i Python cz. 1 – Twój pierwszy test automatyczny
Cel lekcji
Zaprzęgniemy WebDriver do pracy i uruchomimy przeglądarkę za pomocą kodu. Będzie wiele nowych pojęć, nie przejmuj się jeśli nie zapamiętasz ich wszystkich – będziemy je wałkować przez kolejne lekcje więc 🙂
Video
Wersja video poniższej 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.
Użycie modułu
Skorzystajmy z zaimportowanego modułu webdriver
.
Pod naszą linią z importem:
from selenium import webdriver
wpisujemy linię
driver = webdriver.Chrome(executable_path=r'C:\TestFiles\chromedriver.exe')
Przypisujemy tu do zmiennej driver
obiekt, który pozwala sterować przeglądarką Chrome. Warto również zauważyć, że:
- Korzystamy z metody (dopisana po kropce fraza:
Chrome()
) czyli w skrócie akcji która może być wykonana przez moduł webdriver. - W metodzie
Chrome()
podajemy nazwę parametru i jego wartość. W naszym przypadku wartością jest ścieżka do pliku chromedriver.exe dla parametruexecutable_path
) - W wyniku wykonania metody
Chrome()
z parametremexecutable_path
dostajemy obiekt który zostanie przypisany do zmiennejdriver
. Dzięki temu mogę sterować konkretnie otwartą przeglądarką przez odnoszenie się do zmiennejdriver
.
Czyli tak na luzie możemy powiedzieć: Hej webdriver otwórz Chrome() i temu Chrome() dodaj informację, że drivera na moim kompie znajdzie tu C:\TestFiles\chromedriver.exe ( a Chrome przechowuje sobie tę ścieżkę pod nazwą executable_path
więc tam też ją dorzucę).
Jeśli korzystasz z Selenium 4.11+ oraz Chrome 114+, to nie musisz używać chromedriver.exe. Wystarczy teraz, że użyjesz:
driver = webdriver.Chrome()
W najnowszej wersji biblioteka Selenium wykrywa wersję Chrome i sama pobiera odpowiednie informacje 😉
Dla zainteresowanych:
- ChromeDriver requires a Chrome for Testing binary by default
- chromedriver.chromium.org/downloads – If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading.
- Chrome for Testing availability
Wraz z pojawianiem się Selenium 4 uległo zmianie użycie ścieżki do pliku chromiedriver.exe.
Kod który zaprezentowaliśmy wciąż działa:
driver = webdriver.Chrome(executable_path=r'C:\TestFiles\chromedriver.exe')
jednak przy jego wykonaniu pokazują się ostrzeżenia o nowym podejściu Selenium 4.
Wystarczy zmienić kod na taki:
from selenium.webdriver.chrome.service import Service driver = webdriver.Chrome(service=Service(r'C:\TestFiles\chromedriver.exe'))
I już będzie on dostosowany do standardu Selenium 4. Jak widzisz wystarczy zaimportować Service
i jako parametr podać ścieżkę. Wygląda bardzo podobnie do poprzedniego rozwiązania a unikamy ostrzeżeń w konsoli.
webdriver
) wykonujemy poprzez użycie kropki .
. Po wpisaniu nazwy akcji (np. Chrome
) zakańczamy ją nawiasem ()
. Czasem w nawiasach mogą być wymagane parametry – jednak nie jest to regułą.
r
w executable_path=r'C:\TestFiles\chromedriver.exe'
, która znajduje się przed całą ścieżką do pliku exe. Oznacza ona, że napis zostanie potraktowany tak jak wygląda, a wszystkie specjalne znaki (takie jak np \t
co standardowo odczytywane jest jako tabulacja) zostaną zignorowane. Możesz poczytać o niej więcej w naszym słowniku.
Wynik można zobrazować tak webdriver.Chrome()
zwraca webdrivera sterującego przeglądarką i nadajemy mu nazwę driver.
TIP: Zrób jednolinijkową przerwę pomiędzy deklaracjami importów a właściwym kodem – są to zalecenia formatowania języka Python
UWAGA: Formatowanie kodu jest bardzo ważne w języku Python, dlatego stosowanie się do sugerowanych wytycznych jest niezbędne. O ile brak odstępu pomiędzy linijkami nie spowoduje błędu kodu, o tyle niepoprawne wcięcie może zaburzyć całkowicie działanie skryptu. Jeśli coś u Ciebie nie działa – sprawdź czy twój kod jest identyczny jak zaprezentowany w naszych przykładach. Niepoprawne działanie skryptu w Python często jest spowodowane przez błędy w formatowaniu.
Uruchamianie kodu
Czas sprawdzić napisany kod i uruchomić go z poziomu naszego IDE. Z górnego menu wybieramy Run->Run..->auto_test_1
Może pojawić się potrzeba akceptacji zezwolenia skryptom pythonowym na dostęp do sieci:
Na dole pojawi się okno z informacjami na temat uruchomionego pliku (to okno nazywamy konsolą uruchomieniową)
i powinna zostać automatycznie uruchomiona instancja przeglądarki Chrome (instancja czyli w tym przypadku osobne okno czystej przeglądarki).
Zamykam okno Chrome co kończy test.
Nieźle – udało się automatycznie uruchomić przeglądarkę – to oznacza, że nasz kod działa 😀
Kiedyś przeglądarka nie była zamykana i po kilkukrotnym uruchomieniu naszych skryptów mieliśmy otwartych kilka wersji przeglądarki Chrome. Dzięki tej zmianie nie musimy już się tym przejmować 🙂
Jeśli z jakiegoś powodu chcielibyśmy, aby nie została zamknięta, to możemy użyć jednej z 2 opcji:
Pierwsza to dodanie czekania, po którym przeglądarka zostanie zamknięta:
from selenium import webdriver import time driver = webdriver.Chrome(executable_path=r'C:\TestFiles\chromedriver.exe') driver.get("http://www.google.com/") time.sleep(5) # Sleep for 5 seconds
Druga to eksperymentalna opcja detach, która spowoduje, że po wykonaniu skryptu przeglądarka będzie otwarta, aż jej nie zamkniemy:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_experimental_option("detach", True) driver = webdriver.Chrome(executable_path=r'C:\TestFiles\chromedriver.exe', options=chrome_options) driver.get("http://www.google.com/")
DeprecationWarning: executable_path has been deprecated, please pass in a Service object:
Najprawdopodobniej związany jest on z używaniem najnowszej wersji paczki Selenium. W wersji 4.0 pojawiły się pewne zmiany, które wymuszają na nas inne przekazanie do Drivera informacji gdzie znajduje się chromedriver.exe. Samo pojawienie się ostrzeżenia DeprecationWarning nie wpłynie negatywnie na nasze skrypty, ale warto pomyśleć o jego rozwiązaniu w przyszłości. Dodatkowo, w dniu kiedy piszę te słowa (18.09.2019), Selenium 4 jest jeszcze w wersji alpha i zaleca się używać wcześniejszej, stabilnej wersji 3.14.0. Aczkolwiek, jeśli używasz już wersji 4 i chcesz zlikwidować ostrzeżenia DeprecationWarning, to musisz zastosować następującą konstrukcję:
from selenium import webdriver from selenium.webdriver.chrome.service import Service service = Service('C:\TestFiles\chromedriver.exe') service.start() driver = webdriver.Remote(service.service_url) driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
Jednakże na chwilę obecną nie jest to wymagane 😉 Tematy tutaj poruszone (sprawdzanie i instalowanie konkretnej wersji selenium) zostaną poruszone w kolejnych lekcjach. Wtedy też zyskasz pełną władzę nad instalowanymi pakietami 🤓
Sterowanie przeglądarką
Zmienna driver
jest reprezentacją webdrivera sterującego przeglądarką więc można wywołać na niej różne metody. Na przykład przejście do danego adresu (czyli naszej testowej strony).
Wywołamy więc na naszej zmiennej metodę get()
która jako parametr przyjmuje adres strony do której ma przejść przeglądarka (tym razem nie podajemy nazwy parametru tylko od razu jego wartość ze względu na domyślną obsługę w tym przypadku). Pamiętasz – driver przechowuje w sobie reprezentację webdrivera a ona z kolei ma swoje metody dlatego możemy je wywoływać używając driver
.
driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
TIP: Ostatnia konfiguracja uruchomieniowa została zapamiętana więc test można ponownie uruchomić z kombinacji SHIFT + F10 lub kliknąć zieloną strzałkę w prawym górnym rogu.
Po poprawnym uruchomieniu przeglądarka powinna wyświetlić testowaną stronę.
W następnym kroku zapiszemy tytuł strony – czyli wartość którą zazwyczaj widzisz w karcie przeglądarki. Pobieramy ze zmiennej driver
atrybut title
który zwraca tytuł bieżącej strony. W sumie atrybut niewiele się różni od metody – jak widzimy wywołujemy go bez () i możemy traktować go bardziej jako wartość a nie akcję (jak np. metoda get()
). Zapisujemy zwróconą wartość do nowej zmiennej zmiennej title
, dzięki czemu wynik który uzyskuję za pomocą wywołania driver.title
jest łatwo dostępny.
title = driver.title
Kolejny wiersz to wypisanie zawartości zmiennej na konsolę uruchomieniową czyli miejsce gdzie są logowane akcje jakie wykonuje nasz kod.
Korzystamy tu z wbudowanej funkcji Pythona print
TIP: Funkcja wbudowana to taki kod, który możemy uruchomić bez potrzeby importowania czy instalowania dodatkowych rzeczy. Kod dla funkcji jest dostarczany wraz z językiem programowania. W przypadku Pythona wystarczy, że wpiszemy nazwę takiej funkcji i jest ona gotowa do użytku – niezłe prawda? 🙂
Funkcja print
przyjmuje jako parametr wszystko co byśmy chcieli zobaczyć w konsoli i może być przedstawione w formie tekstu. Przypomnę tu jeszcze raz, że funkcja to taka metoda ale wywoływana bezpośrednio. Sam zobacz:
print(title)
Po uruchomieniu testu powinniśmy zobaczyć wypisany tytuł na konsolę
Podsumowanie i cały kod
Udało nam się nie tylko uruchomić przeglądarkę ale i nawigować do strony i pobrać oraz wyświetlić tytuł strony na konsoli. Dodatkowo zadeklarowaliśmy zmienne i skorzystaliśmy z wbudowanego print
. Poznaliśmy podstawową różnicę pomiędzy funkcją, metodą a atrybutem. W kolejnej lekcji rozwiniemy te działania.
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)
Hej, w przypadku kodu przeglądarka uruchamia sie i odrazu zamyka. Co może być tego przyczyną?
Web driver mam w wersji 110.0.5481.77 a przeglądarka ma 110.0.5481.178 – jedyny pasujący.
Hej 🙂
Co się wyświetla w konsoli po uruchomieniu tego skryptu?
Wynikiem powinno być:
Informacja Demobank – Bankowość Internetowa – Logowanie sugeruje, że weszliśmy na dana strone i pobraliśmy jej tytuł 🙂
PS. Aby zlikwidować ostrzeżenie DeprecationWarning rzuć okiem na sekcje Uwaga w tej lekcji 🙂
nie mogę zaimportować z modułu “Selenium”. Wyskakuje błąd:
Exception has occurred: ModuleNotFoundError
No module named ‘selenium’
File “C:\Users\NazwaUżytkownika\Desktop\1.py”, line 1, in
from selenium import webdriver
Hej,
Sprawdź proszę, czy masz poprawnie zainstalowany moduł Selenium – aby to zrobić przejdź do File – Settings, a następnie Project – Python Interpreter:
SCREEN
Kroki do instalacji (i analogiczne do sprawdzenia zainstalowanych modułów) opisaliśmy dokładniej w lekcji:
Pierwszy kod – pojawia się Selenium.
Daj mi proszę znać, czy Selenium jest na liście zainstalowanych pakietów 🙂
cześć
czym jest ten `chromedriver.exe`? to jest jakis sterownik przeglądarki który trzeba ściągnąć, doinstalować? czy to jest już sama przeglądarka chrome?
dobra już w komentażach mam odpowiedź 🙂
Doskonale! 😀
Reasumując – Chromedriver.exe to narzędzie (biblioteka) pozwalające na sterowanie przeglądarką z poziomu kodu i Selenium. Do przeglądarki jest Chromedriver, dla Firefoxa jest geckodriver itd. Czyli każdą przeglądarka ma swój zestaw narzędzi, który pozwala nią sterować z poziomu kodu i przy pomocy Selenium 🙂
Podobnie jest przypadku innych narzędzi jak Cypress albo Playwright – tam też do sterowania przeglądarką pobierane są odpowiednie, dodatkowe zestawy narzędzi, które umożliwiają interakcje z daną przeglądarką.
W przypadku Selenium, w tym kursie pokazujemy jak to zrobić ręcznie, dzięki czemu możesz zobaczyć jak to działa (bez automatycznej magii, dzięki której wszystko samo się pobierze etc.) 🙂
Mam problem z kodem… jest napisany według instrukcji i pomimo tego strona, która powinna się otworzyć tego nie robi. Gdzie może być błąd??
PyCharm 2022.2.1 (Community Edition) na Win10
Hej,
Podrzuć mi proszę cały swój kod oraz wynik, jaki otrzymałeś w konsoli po uruchomieniu skryptu 🙂
Pozdrawiam,
K
Tak wygląda kod, natomiast w konsoli przeglądarki nic się nie wyświetla. Jedynie w Pycharmie dostaję informację na koniec “Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C)”
W przypadku obiektu Service w linii:
zamiast ścieżki do chrome.exe musisz podać ścieżkę do webDrivera, którego musisz pobrać z
https://chromedriver.chromium.org/downloads
a następnie rozpakować i umieścić w katalogu np. C:\TestFiles\. Tutaj zwróć proszę uwagę, aby pobierana wersja ChromeDrivera zgadzała się z wersją Chrome zainstalowanego w systemie.
Aby użyć webdrivera możesz skorzystać z poniższej konstrukcji:
Również aby przejść na wskazany adres, zamiast:
użyj metody:
W całości kod przyjmie następującą postać:
Daj proszę znać czy powyższe rozwiązanie zadziałało poprawnie 🙂
Rozwiązanie faktycznie zadziałało. Bardzo dziękuję. Jednak pozostaje pytanie, co w momencie kiedy przeglądarka się zaktualizuje i nie będzie możliwości uruchomienia jej z chromedrivera, bo nie będzie już wsparcia??
Doskonale 😀
Zawsze istnieje pewne prawdopodobieństwo, że może się zakończyć, ale takie decyzje są ogłaszane z dużym wyprzedzeniem (ostatni taka sytuacja była przy Protraktorze, frameworku do testów UI w JavaScripcie – tam koniec wsparcia ogłoszono 2 lata wcześniej i zasugerowano alternatywy). Myślę, że chromedrivera będzie miał jeszcze wsparcie przez wiele lat. Dodatkowo przemawia za tym fakt, że to narzędzie jest używane tak samo powszechnie jak Selenium, a to stanowi podstawę w wielu projektach.
Witam, mam problem z tym kodem:
I się psuje, dostaję informację:
Pracuję na systemie Linux Mint, próbuję uruchomić Chromium, wszystko aktualne.
Jak sobie z tym poradzić?
A przy kodzie dokładnie jak w lekcji:
dostaję:
(ale na 100% chromedriver jest w tym folderze, bo używam terminalowego ‘which’, żeby dostać ścieżkę), po czym jako drugi bład mam:
Jakieś pomysły, co z tym zrobić?
Hej,
W przypadku z
ChromeDriverManager().install()
i Chromium to nie wiem czy jest jakieś obejście. ChromeDriverManager zdaje się bazować tylko i wyłącznie na google chrome, i z tego powodu występuje błąd/bin/sh: google-chrome: nie znaleziono polecenia
. Najprostszym rozwiązaniem jest instalacja Google Chrome.W drugim przypadku z katalogiem
/usr/local/bin/
– skopiowałem w tam plik chromedriver i bez problemu skrypt go wykrył.Czy ten plik chromeriver został pobrany z oficjalnej strony (czyli https://chromedriver.chromium.org/downloads ) ? Spróbuj umieścić plik chromedriver w katalogu ze skryptem Pythona, zmień
webdriver.Chrome(executable_path = r'./chromedriver')
i uruchom skrypt – jaki będzie rezultat?Pozdrawiam,
Cześć,
co do Chrome/Chromium, dokładnie te same problemy mam z Firefoxem i geckodriverem :p
A w drugim wypadku, tak, z oficjalnej strony, zgodnie z instrukcjami. Umieściłam go w folderze ze skryptem Pythona, i niestety kolejny (ale inny, więc jest progress) wyjątek:
Może to faktycznie problem z Chromium, ale wydaje mi się, że za Chrome maintenance jest odpowiedzialny zespół Chromium, i czytałam, że ta różnica nie powinna mieć znaczenia.
Moje próby z Firefoxem:
I wyjątek (też nowy, ale jest mało konkretny, więc googlowanie po stackoverflow sobie trochę z nim nie radzi):
Może tu da się coś zaradzić?
Hej,
Na moim Ubuntu 20.4 taki skrypt zadziałał:
(dla firefox 75 x64 oraz geckodriver 0.26)
Błąd:
może sugerować brak kompatybilności pomiędzy wersją geckodriver a Firefoxem. Czy korzystasz z najnowszych wersji obu tych narzędzi?
A jakie są powody braku zainstalowanego Chroma? 😀
Pozdrawiam,
U mnie pojawiał się komunikat
‘chromedriver.exe’ executable needs to be in PATH
więc znalazłem to:
Więc cały kod dla tej lekcji:
Hej,
Tak, to jest 3 sposób na poradzenie sobie z WebDriverem (po podaniu pełnej ścieżki jak w tej lekcji, i po dodaniu ścieżki do PATH) 😀
Celowo pominęliśmy ten sposób tutaj na początku, gdyż chcieliśmy rozpocząć od najprostszego i najbardziej explicite sposobu podpięcia Drivera – czyli przez
executable_path
). Planujemy poruszy ten temat w części 6 (albo w bonusie), wraz z potencjalnymi zagrożeniami jakie ze sobą niesie 😉Pozdrawiam!
Cześć!
Dostaję taki warning (zaktualizowałam sobie chromedrivera i chrome’a oraz wersję pythona do najnowszych wersji):
Ponadto, na starcie uruchamia mi się strona:
chrome://settings/triggeredResetProfileSettings
Finalnie wchodzi na stronę, którą mu podaję, ale nie w zakładce :data tylko właśnie w tej z ustawieniami chrome’a.
Z pierwszym problemem poradziłam sobie tak:
Ale nie wiem, jakie są wady i zalety tego rozwiązania? Czy może lepiej zostawić ten warning w spokoju?
Z drugim poradziłam sobie stosując to rozwiązanie:
https://support.leapwork.com/hc/en-us/articles/115001642052-Chrome-browser-is-opening-Settings-as-default-tab-and-asking-to-reset-chrome-settings
I myślę, że to OK 😉
Czekam na Wasz komentarz!
Hej,
Przy jakich konkretnie wersjach chrome, chromedrivera, pakietów (głównie selenium) oraz Pythona wystąpiły te ostrzeżenia?
Ciekawe problemy i podejście do rozwiązania. Wygląda dla mnie, że korzystasz z najnowszego – jeszcze standardowo nieudostępnionego Selenium dla pythona (https://github.com/SeleniumHQ/selenium/commit/19887a4bf810b500518125bde7f36e4eaa884626#diff-3cc362239fab45745a57b849489ef37a) Chociaż, w sumie takie ostrzeżenie zostanie wprowadzone wraz z wypuszczeniem
Selenium 4
i zalecane będzie używaniechromedriver
poprzez systemowy path.Co do tego, że wykorzystałaś uruchomienie poprzez
service.Service()
to jest to poprawne podejście i wiąże się ono z bardziej kontrolowanym uruchamianiemdrivera
– jest to opisane http://chromedriver.chromium.org/getting-started. Czyli tak naprawdę zrobiłaś kroki, które standardowa komendawebdriver.Chrome(executable_path=r'C:\TestFiles\chromedriver.exe')
wykonuje w swoich wnętrznościach 😀I jeszcze problem z dziwnym tabem w Chrome – jest to spowodowane ustawieniami w twojej przeglądarce które mogły być nadpisane przez antywirusa czy inne oprogramowanie. Poradziłaś sobie świetnie z tym problemem właśnie poprzez reset klucza w Windows. Czasami też pomaga uaktualnienie przeglądarki wraz z driverem.
Oczywiście odpowiedź na pytanie Krzycha o wersje przybliży nam naturę problemu z którym się spotkałaś 😀
Pozdrawiam
Przy Selenium 4 i problemie z:
“DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Chrome(executable_path=r’C:\TestFiles\chromedriver.exe’)”
wystarczy zmienić komende z:
driver = webdriver.Chrome(executable_path=r’C:\TestFiles\chromedriver.exe’)
na :
driver = webdriver.Chrome()
Wcześniej dodając webdrivera do path:)
Nie wiem dlaczego tak długą formę dopięliście jeśli chodzi o rozwiązanie tego problemu
Hej,
To prawda, w przypadku gdy posiada się
chromedriver.exe
dodanego do Path, to wystarczy zastosować konstrukcjęwebdriver.Chrome()
🙂 Jest to również sposób jaki zalecają Twórcy w Selenium4 (tu warto pamiętać, że Selenium4 nie miało jeszcze stabilnego wydania, dlatego też wiele może się jeszcze zmienić).Jeśli chodzi o zastosowane rozwiązanie na obecnym etapie lekcji – postanowiliśmy pójść w stronę bardziej explicite, aby pokazać jak to można zrobić w najprostszy sposób, bez bawienia się ustawieniami systemu etc., i minimalizując wynikające z tego problemy. Pamiętajmy tez, że oba podejścia, z PATH oraz
executable_path
, mają swoje mocne i słabe strony.PATH miał pojawić się odrobinę później, ale z racji nieubłaganie nadciągającego Selenium4, prawdopodobnie przyszykujemy mocne odświeżenie początkowych lekcji 😉
Pozdrawiam,
Zapytam jako przyszły tester a raczej adept 😀 czy ta literka”r” executable_path= r jest do czegoś potrzebna? Czy jest to po prostu literówka która jedyne co robi to wisi? Sprawdzałem w kodzie i działa z i bez niej oznacza to że nie pełni ona żadnej funkcji?
Hej,
Odpowiem tak – to zależy 😉
Faktycznie, w naszym przypadku
executable_path=r'C:\TestFiles\chromedriver.exe'
jest możliwość jej pominięcia, ale polecam przeprowadzić szybki test 😉Zmień nazwę katalogu TestFiles na testFiles i popraw także ścieżkę w testach na
executable_path='C:\testFiles\chromedriver.exe'
.Czy po uruchomieniu testów wszystko jest ok? 😉
W przypadku z
t
pojawia się znak specjalny –\t
, który oznacza Tab przez co cała ścieżka jest błędnie interpretowana przez Pythona. Prefixr
pozwala to naprawić i\t
jest traktowane jako\t
a nie Tab 🙂(w drugim Tip o tym wspominamy 😉 )