{"id":29808,"date":"2023-07-12T07:33:00","date_gmt":"2023-07-12T05:33:00","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/selenium-python-vs-selenium-java\/"},"modified":"2024-11-07T12:52:20","modified_gmt":"2024-11-07T11:52:20","slug":"selenium-python-vs-selenium-java","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/selenium-python-vs-selenium-java\/","title":{"rendered":"Testy automatyczne: Selenium + Python vs Selenium + Java"},"content":{"rendered":"\n<p>Jako (przysz\u0142y) in\u017cynier automatyzacji test\u00f3w celuj\u0105cy w prac\u0119 z Selenium w pewnym momencie dotrzesz do punktu, w kt\u00f3rym trzeba b\u0119dzie podj\u0105\u0107 decyzj\u0119, w kt\u00f3r\u0105 stron\u0119 i\u015b\u0107 oraz czego u\u017cywa\u0107 do testowania. \u015awiat IT i QA szybko si\u0119 zmienia, a niekt\u00f3re z narz\u0119dzi i j\u0119zyk\u00f3w, kt\u00f3re by\u0142y kiedy\u015b popularne, dzi\u015b ju\u017c takie nie s\u0105. Jak w ka\u017cdym przypadku, istnieje wiele czynnik\u00f3w, kt\u00f3re mog\u0105 odegra\u0107 rol\u0119 w podj\u0119ciu decyzji. W tym artykule postaram si\u0119 u\u0142atwi\u0107 ci to zadanie, przedstawiaj\u0105c zalety i wady \u0142\u0105czenia Selenium z dwoma obecnie najpopularniejszymi j\u0119zykami programowania: Jav\u0105 i Pythonem.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"table-of-contents\">\n    <p class=\"title\">Przejd\u017a do: <\/p>\n    <ol>\n                    <li><a href=\"#Automatyzacja-test\u00f3w:-jakie-mamy-opcje?-Java-i-Python\">1.  Automatyzacja test\u00f3w: jakie mamy opcje? Java i Python  <\/a><\/li>\n                    <li><a href=\"#J\u0119zyk-programowania-czy-j\u0119zyk-skryptowy?\">2.  J\u0119zyk programowania czy j\u0119zyk skryptowy? <\/a><\/li>\n                    <li><a href=\"#Czego-\u0142atwiej-si\u0119-nauczy\u0107:-Javy-czy-Pythona?--\">3.  Czego \u0142atwiej si\u0119 nauczy\u0107: Javy czy Pythona?  <\/a><\/li>\n                    <li><a href=\"#Automatyzacja-test\u00f3w-\u2013-jakie-s\u0105-opcje?-\">4.  Automatyzacja test\u00f3w \u2013 jakie s\u0105 opcje? <\/a><\/li>\n                    <li><a href=\"#Czym-jest-Selenium-WebDriver?-\">5.  Czym jest Selenium WebDriver? <\/a><\/li>\n                    <li><a href=\"#Selenium-i-Python-\">6.  Selenium i Python <\/a><\/li>\n                    <li><a href=\"#Selenium-i-Java-\">7.  Selenium i Java <\/a><\/li>\n                    <li><a href=\"#Kt\u00f3ra-opcja-jest-lepsza-dla-test\u00f3w-automatycznych-(Selenium-z-Pythonem-czy-Selenium-z-Jav\u0105)?--\">8.  Kt\u00f3ra opcja jest lepsza dla test\u00f3w automatycznych (Selenium z Pythonem czy Selenium z Jav\u0105)?  <\/a><\/li>\n                    <li><a href=\"#Jak-wykona\u0107-skrypt-Selenium-w-Pythonie?-\">9.  Jak wykona\u0107 skrypt Selenium w Pythonie? <\/a><\/li>\n                    <li><a href=\"#Jak-zainstalowa\u0107-Selenium-z-PIP?-\">10.  Jak zainstalowa\u0107 Selenium z PIP? <\/a><\/li>\n                    <li><a href=\"#Automatyzacja-test\u00f3w-\u2013-podsumowanie--\">11.  Automatyzacja test\u00f3w \u2013 podsumowanie  <\/a><\/li>\n                    <li><a href=\"#FAQ-Starting-points-for-Selenium-with-Java-or-Python-\">12.  FAQ<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Automatyzacja-test\u00f3w:-jakie-mamy-opcje?-Java-i-Python\">Automatyzacja test\u00f3w: jakie mamy opcje? Java i Python<\/h2>\n\n\n\n<p>Ka\u017cdy z tych j\u0119zyk\u00f3w ma ugruntowan\u0105 pozycj\u0119, jest niezale\u017cny od platformy, zorientowany obiektowo i posiada du\u017c\u0105, wspieraj\u0105c\u0105 spo\u0142eczno\u015b\u0107 u\u017cytkownik\u00f3w. Je\u015bli chodzi o wyb\u00f3r powi\u0105za\u0144 (ang. bindings) j\u0119zyka Selenium dla Javy i Pythona, powiniene\u015b najpierw zrozumie\u0107 kilka kluczowych r\u00f3\u017cnic pomi\u0119dzy nimi.<\/p>\n\n\n\n<p>Selenium obs\u0142uguje szerok\u0105 gam\u0119 j\u0119zyk\u00f3w programowania do automatyzacji test\u00f3w. W tym kontek\u015bcie Java i Python s\u0105 najlepszymi kandydatami (i konkurentami) do po\u0142\u0105czenia z Selenium.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"J\u0119zyk-programowania-czy-j\u0119zyk-skryptowy?\">J\u0119zyk programowania czy j\u0119zyk skryptowy?<\/h2>\n\n\n\n<p>Jednym z g\u0142\u00f3wnych pyta\u0144, kt\u00f3re mog\u0105 przyj\u015b\u0107 ci do g\u0142owy, por\u00f3wnuj\u0105c Jav\u0119 i Pythona, mo\u017ce by\u0107: \u201eCzy Python i Java to j\u0119zyki programowania, czy j\u0119zyki skryptowe?\u201d.<\/p>\n\n\n\n<p>Zasadniczo wszystkie j\u0119zyki skryptowe s\u0105 uwa\u017cane za j\u0119zyki programowania. G\u0142\u00f3wn\u0105 r\u00f3\u017cnic\u0105 mi\u0119dzy nimi jest to, \u017ce j\u0119zyki programowania s\u0105 <strong>kompilowane<\/strong>, podczas gdy j\u0119zyki skryptowe s\u0105 interpretowane. J\u0119zyki skryptowe s\u0105 wolniejsze ni\u017c j\u0119zyki programowania i pozostaj\u0105 zazwyczaj za nimi w tyle.<\/p>\n\n\n\n<p><strong>Szybkie por\u00f3wnanie znajdziesz tutaj: <a href=\"https:\/\/itvoyagers.in\/interpreter-vs-compiler\/\" data-type=\"URL\" data-id=\"https:\/\/itvoyagers.in\/interpreter-vs-compiler\/\" target=\"_blank\" rel=\"noreferrer noopener\">Interpreter vs compiler<\/a><\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Python<\/h4>\n\n\n\n<p>Python mo\u017cna nazwa\u0107 zar\u00f3wno j\u0119zykiem skryptowym, jak i j\u0119zykiem programowania, poniewa\u017c <strong>dzia\u0142a zar\u00f3wno jako kompilator, jak i interpreter.<\/strong> Standardowy Python mo\u017ce skompilowa\u0107 kod Pythona do kod\u00f3w bajtowych, a nast\u0119pnie zinterpretowa\u0107 go tak jak Java i C.<\/p>\n\n\n\n<p>\u201eJednak bior\u0105c pod uwag\u0119 historyczny zwi\u0105zek mi\u0119dzy j\u0119zykiem programowania og\u00f3lnego przeznaczenia a j\u0119zykiem skryptowym, bardziej w\u0142a\u015bciwe by\u0142oby stwierdzenie, \u017ce Python jest j\u0119zykiem programowania, kt\u00f3ry dobrze dzia\u0142a r\u00f3wnie\u017c jako j\u0119zyk skryptowy\u201d.<\/p>\n\n\n\n<p><strong>Interpreter <\/strong>to warstwa oprogramowania, kt\u00f3ra dzia\u0142a jako pomost mi\u0119dzy programem a sprz\u0119tem systemowym, aby utrzyma\u0107 dzia\u0142anie kodu. Interpreter Pythona to aplikacja odpowiedzialna za uruchamianie skrypt\u00f3w Pythona.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.07.12_graphic_1.png\" alt=\"Selenium Python\" class=\"wp-image-10920\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Java&nbsp;<\/h4>\n\n\n\n<p>Java jest na og\u00f3\u0142 szybsza i bardziej wydajna ni\u017c Python, poniewa\u017c jest j\u0119zykiem <strong>skompilowanym<\/strong>. Jako j\u0119zyk interpretowany, Python z kolei ma prostsz\u0105, bardziej zwi\u0119z\u0142\u0105 sk\u0142adni\u0119. Mo\u017ce pe\u0142ni\u0107 t\u0119 sam\u0105 funkcj\u0119 co Java, przy u\u017cyciu mniejszej liczby linijek kodu. W Javie typy danych zmiennych powinny by\u0107 zadeklarowane przed ich u\u017cyciem, w przeciwie\u0144stwie do Pythona. Zdecyduj, co bardziej ci odpowiada.&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/blog_2023.07.12_graphic_2.png\" alt=\"Java Python\" class=\"wp-image-10922\" style=\"width:766px;height:402px\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czego-\u0142atwiej-si\u0119-nauczy\u0107:-Javy-czy-Pythona?--\">Czego \u0142atwiej si\u0119 nauczy\u0107: Javy czy Pythona?&nbsp;&nbsp;<\/h2>\n\n\n\n<p>Kolejne pytanie, kt\u00f3re mo\u017ce si\u0119 zrodzi\u0107 (zw\u0142aszcza gdy dopiero zaczynasz przygod\u0119 z programowaniem) brzmi: jak szybko mog\u0119 nauczy\u0107 si\u0119 Javy vs. Pythona?&nbsp;<\/p>\n\n\n\n<p>Tu nie ma w\u0105tpliwo\u015bci: Python jest zwyci\u0119zc\u0105. Jak wspomnia\u0142em, jego sk\u0142adnia jest kr\u00f3tsza i prostsza. Prototypowanie w Javie jest bardziej z\u0142o\u017cone \u2013 przyk\u0142adowo, obci\u0105\u017ca kod dodatkowymi deklaracjami i ograniczeniami. Wybierz Pythona, je\u015bli nie masz wiele czasu na nauk\u0119.&nbsp;<\/p>\n\n\n\n<p>Oto lista kluczowych czynnik\u00f3w, kt\u00f3re trzeba wzi\u0105\u0107 pod uwag\u0119 przed podj\u0119ciem decyzji:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Oferty pracy: <\/strong>wci\u0105\u017c wi\u0119cej ofert pracy jest w Javie&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zmiana pracy \/ migracja: <\/strong>dzi\u0119ki skryptowaniu, \u0142atwiej jest w przypadku Pythona, je\u015bli np. my\u015blisz o kulturze DevOps&nbsp;&nbsp;<\/li>\n\n\n\n<li><strong>Programowanie zorientowane obiektowo:<\/strong> zar\u00f3wno Python, jak i Java polegaj\u0105 na programowaniu obiektowym, wi\u0119c znajomo\u015b\u0107 jednego z tych j\u0119zyk\u00f3w stanowi dobry punkt wyj\u015bcia do nauki drugiego&nbsp;<\/li>\n\n\n\n<li><strong>Niezale\u017cne od platformy:<\/strong> zar\u00f3wno binaria Pythona, jak i Javy (kody bajtowe) po wygenerowaniu mog\u0105 by\u0107 wykonywane na dowolnych obs\u0142ugiwanych platformach dzi\u0119ki w\u0142asnym maszynom wirtualnym (odpowiednio PVM i JVM)&nbsp;<\/li>\n\n\n\n<li><strong>Prostota:<\/strong> Python jest \u0142atwiejszy w u\u017cyciu dzi\u0119ki prostszej sk\u0142adni&nbsp;&nbsp;<\/li>\n\n\n\n<li><strong>Wykonanie: <\/strong>jako reprezentacja j\u0119zyka skryptowego Python ma mo\u017cliwo\u015b\u0107 bezpo\u015bredniego uruchamiania kodu skryptu za pomoc\u0105 <a href=\"https:\/\/docs.python.org\/3\/tutorial\/interpreter.html\" target=\"_blank\" rel=\"noreferrer noopener\">interpretera<\/a> zamiast bezpo\u015bredniego uruchamiania kompilatora (np. Javac dla Java)&nbsp;<\/li>\n\n\n\n<li><strong>Wydajno\u015b\u0107 \/ szybko\u015b\u0107 wykonania: <\/strong>Java ma tu przewag\u0119, poniewa\u017c jest szybsza (mo\u017cna skompilowa\u0107 j\u0105 JIT, aby by\u0142a bardziej wydajna)&nbsp;<\/li>\n\n\n\n<li><strong>Popularno\u015b\u0107 \/ wsparcie: <\/strong>Java wygrywa w tym zestawieniu jako popularne rozwi\u0105zanie, kt\u00f3re ma bardzo du\u017c\u0105 i wspieraj\u0105c\u0105 spo\u0142eczno\u015b\u0107 programist\u00f3w&nbsp;<\/li>\n\n\n\n<li><strong>Python jest j\u0119zykiem statycznie typowanym<\/strong> (sprawdza typ w czasie wykonywania, co oznacza, \u017ce tw\u00f3j kod mo\u017ce w ostatniej chwili zawie\u015b\u0107)&nbsp;<\/li>\n\n\n\n<li><strong>Java jest j\u0119zykiem dynamicznie typowanym<\/strong> (sprawdza typ w czasie kompilacji, co oznacza, \u017ce wychwytujesz problemy w swoim kodzie wcze\u015bniej w procesie tworzenia oprogramowania)&nbsp;<\/li>\n\n\n\n<li><strong>Rozszerzalno\u015b\u0107<\/strong>: poniewa\u017c Java jest bardziej popularna, na rynku jest dost\u0119pne wi\u0119cej wtyczek, interfejs\u00f3w API, framework\u00f3w i bibliotek ni\u017c w przypadku Pythona&nbsp;<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Automatyzacja-test\u00f3w-\u2013-jakie-s\u0105-opcje?-\">Automatyzacja test\u00f3w \u2013 jakie s\u0105 opcje?&nbsp;<\/h2>\n\n\n\n<p>Selenium zaspokaja okre\u015blon\u0105 potrzeb\u0119 w \u015bwiecie automatyzacji test\u00f3w. Jest tylko dla przegl\u0105darek. Je\u015bli chcesz szybko rozpocz\u0105\u0107 automatyzacj\u0119 swoich przypadk\u00f3w testowych, zaprzyja\u017anij si\u0119 z <a href=\"https:\/\/www.selenium.dev\/selenium-ide\" target=\"_blank\" rel=\"noreferrer noopener\">Selenium IDE<\/a>. Pozwala ono szybko i \u0142atwo rozpocz\u0105\u0107 automatyzacj\u0119 test\u00f3w dzi\u0119ki opcji nagrywania.&nbsp;<\/p>\n\n\n\n<p>Kroki testowe wykonywane w przegl\u0105darce s\u0105 bezpo\u015brednio przekszta\u0142cane w zestaw polece\u0144 dzi\u0119ki <a href=\"https:\/\/www.tutorialspoint.com\/what-is-selenese\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/www.tutorialspoint.com\/what-is-selenese\" rel=\"noreferrer noopener\">Selenese <\/a>(to wbudowany j\u0119zyk Selenium IDE). To bardzo u\u0142atwia zadanie. Ponadto, po zapisaniu test\u00f3w w zestawie <a href=\"https:\/\/www.javatpoint.com\/selenium-ide-commands\" target=\"_blank\" rel=\"noreferrer noopener\">polece\u0144 Selenese<\/a>, mo\u017cna je agregowa\u0107 w pakiety testowe i ostatecznie eksportowa\u0107 do preferowanych powi\u0105za\u0144 Selenium (np.: Java, Python itp.).&nbsp;<\/p>\n\n\n\n<p><strong>Selenese i Selenium IDE<\/strong> to dobry pocz\u0105tek, ale im bardziej b\u0119dziesz si\u0119 zag\u0142\u0119bia\u0107 w temat automatyzacji aplikacji internetowych, tym wyra\u017aniej dostrze\u017cesz ich ograniczenia.&nbsp;<\/p>\n\n\n\n<p>Aby solidnie przetestowa\u0107 nowoczesn\u0105 aplikacj\u0119 internetow\u0105 z jej dynamicznie zmieniaj\u0105c\u0105 si\u0119 tre\u015bci\u0105 (np. przy u\u017cyciu technologii <strong>AJAX czy JS<\/strong>), zaczniesz szuka\u0107 bardziej zaawansowanych opcji. Tutaj z pomoc\u0105 przychodzi&nbsp; <strong>Selenium WebDriver<\/strong> wraz z powi\u0105zaniami j\u0119zykowymi Selenium. Selenium WebDriver jest cz\u0119sto u\u017cywany jako baza do testowania aplikacji internetowych.&nbsp;&nbsp;<\/p>\n\n\n\n<p><strong>Zgodnie z sylabusem A4Q Selenium 4 Tester:&nbsp;<\/strong><\/p>\n\n\n\n<p>\u201eSelenium, gdy jest u\u017cywane do testowania aplikacji internetowych, potrzebuje pewnych framework\u00f3w testowych. Silnik Selenium, jako samodzielne narz\u0119dzie, wystawia TAE tylko swoje natywne API jako metody lub funkcje. In\u017cynier automatyzacji test\u00f3w musi nast\u0119pnie zaprogramowa\u0107 \u015brodowisko testowe, aby u\u017cy\u0107 tych interfejs\u00f3w API do przeprowadzenia wymaganych test\u00f3w. Framework testowy mo\u017cna opracowa\u0107 od podstaw lub&nbsp; wykorzysta\u0107 ju\u017c istniej\u0105ce. <strong>Selenium obs\u0142uguje wiele framework\u00f3w testowych w r\u00f3\u017cnych j\u0119zykach, np.:&nbsp;<\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dla Javy: <a href=\"https:\/\/selenide.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Selenide<\/a>&nbsp;&nbsp;<\/li>\n\n\n\n<li>dla Pythona: <a href=\"https:\/\/pypi.org\/project\/selene\/\" target=\"_blank\" rel=\"noreferrer noopener\">Selene<\/a>&nbsp;&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Niezale\u017cnie od tego, czy korzystasz z w\u0142asnych framework\u00f3w, czy nie, musisz w jaki\u015b spos\u00f3b sterowa\u0107 wykonywaniem test\u00f3w. Wielu in\u017cynier\u00f3w korzysta z bibliotek test\u00f3w jednostkowych do prowadzenia swoich test\u00f3w (test runner\u00f3w).&nbsp;<\/p>\n\n\n\n<p>Niekt\u00f3re z nich, takie jak <a href=\"https:\/\/testng.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">TestNG<\/a> lub <a href=\"https:\/\/docs.pytest.org\/\" target=\"_blank\" rel=\"noopener\">Pytest<\/a>, opr\u00f3cz podstawowego zastosowania w testach jednostkowych pozwalaj\u0105 tworzy\u0107 testy funkcjonalne wy\u017cszego poziomu&nbsp; (funkcjonalne, komponentowe, integracyjne, end-to-end itp.).&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Dla Pythona&nbsp;<\/h4>\n\n\n\n<p>Najprostszym przypadkiem jest u\u017cycie standardowej biblioteki test\u00f3w jednostkowych Pythona. Alternatywnie mo\u017cesz u\u017cy\u0107 bardzo popularnego <a href=\"https:\/\/docs.pytest.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Pytest.<\/a>&nbsp;&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Dla Javy&nbsp;<\/h4>\n\n\n\n<p>Mo\u017cesz u\u017cy\u0107 bibliotek xUnit (np. JUnit 4\/5) lub <a href=\"https:\/\/www.bugraptors.com\/blog\/junit-vs-testng\" target=\"_blank\" rel=\"noreferrer noopener\">TestNG<\/a>.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Po zaznajomieniu si\u0119 z uruchamianiem test\u00f3w lokalnie za pomoc\u0105 wybranej przegl\u0105darki mo\u017cesz zrobi\u0107 krok naprz\u00f3d i skonfigurowa\u0107 <a href=\"https:\/\/www.selenium.dev\/documentation\/grid\/\" target=\"_blank\" rel=\"noreferrer noopener\">siatk\u0119<\/a> przegl\u0105darek do zdalnego uruchamiania test\u00f3w.&nbsp;&nbsp;<\/p>\n\n\n\n<p>W ten spos\u00f3b testy mo\u017cna uruchamia\u0107 na r\u00f3\u017cnych przegl\u0105darkach i kilku systemach operacyjnych na wielu komputerach w trybie r\u00f3wnoleg\u0142ym. Je\u015bli masz spor\u0105 konfiguracj\u0119, mo\u017cesz przeprowadzi\u0107 testy regresji w kr\u00f3tkim czasie (w por\u00f3wnaniu z czasem bez <a href=\"https:\/\/www.selenium.dev\/documentation\/overview\/components\/\" target=\"_blank\" rel=\"noreferrer noopener\">Selenium<\/a> Grid).&nbsp;<\/p>\n\n\n\n<p>Nast\u0119pnie mo\u017cesz i\u015b\u0107 o jeszcze jeden krok dalej i zintegrowa\u0107 swoje testy z CI\/CD pipeline (np.: uruchomi\u0107 <a href=\"https:\/\/qaautomation.expert\/2022\/04\/12\/run-selenium-tests-in-gitlab-ci-cd\/\" target=\"_blank\" rel=\"noreferrer noopener\">Selenium Tests w GitLab CI\/CD<\/a> lub Jenkins).&nbsp;<\/p>\n\n\n\n<p>Pami\u0119taj, \u017ce masz mo\u017cliwo\u015b\u0107 skorzystania z dobrodziejstw konteneryzacji, np. Dockera, aby utworzy\u0107 r\u00f3\u017cne obrazy do automatycznych test\u00f3w interfejsu u\u017cytkownika.&nbsp;<\/p>\n\n\n\n<p>W ten spos\u00f3b mo\u017cesz przygotowa\u0107 oddzieln\u0105 maszyn\u0119 wirtualn\u0105 dla dowolnej kombinacji \u015brodowiska systemu operacyjnego \/ przegl\u0105darki dla <a href=\"https:\/\/en.wikipedia.org\/wiki\/System_under_test\" target=\"_blank\" rel=\"noreferrer noopener\">SUT<\/a> (System Under Test) \/ AUT (Application Under Test).&nbsp;<\/p>\n\n\n\n<p>CI\/CD odgrywa kluczow\u0105 rol\u0119 w tworzeniu cykli \u017cycia oprogramowania, w kt\u00f3rych nowe funkcje s\u0105 ci\u0105gle aktualizowane maksymalnie szybko i wydajnie. Dzi\u0119ki temu u\u017cytkownicy ko\u0144cowi maj\u0105 dost\u0119p do nowych funkcji bez konieczno\u015bci pobierania aktualizacji oprogramowania, co zapewnia im bezproblemow\u0105 obs\u0142ug\u0119.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Bior\u0105c pod uwag\u0119 kr\u00f3tki czas trwania cyklu wydawania oprogramowania, testy musz\u0105 by\u0107 skalowane, aby dostarczane oprogramowanie by\u0142o wolne od b\u0142\u0119d\u00f3w we wspomnianym przedziale czasowym. W tym miejscu Selenium odgrywa kluczow\u0105 rol\u0119, umo\u017cliwiaj\u0105c automatyzacj\u0119 test\u00f3w w CI\/CD pipeline.&nbsp;<\/p>\n\n\n\n<p>Dzi\u0119ki automatyzacji z Selenium mo\u017cna wykonywa\u0107 testy r\u00f3wnoleg\u0142e w wymaganej skali, a <a href=\"https:\/\/github.com\/SeleniumHQ\/docker-selenium\" target=\"_blank\" rel=\"noreferrer noopener\">Dockerem<\/a>, z pomoc\u0105 kontener\u00f3w, pomaga to utrzyma\u0107 \u015brodowisko testowe w dobrym stanie.&nbsp;&nbsp;<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce<\/strong>: <strong><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/uat-user-acceptance-testing\/\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/inetum.pl\/uat-user-acceptance-testing\/\" rel=\"noreferrer noopener\">Testy akceptacyjne u\u017cytkownika (UAT) \u2013 dlaczego s\u0105&nbsp;wa\u017cne?&nbsp;<\/a><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czym-jest-Selenium-WebDriver?-\">Czym jest Selenium WebDriver?&nbsp;<\/h2>\n\n\n\n<p>Najbardziej wyczerpuj\u0105cym \u017ar\u00f3d\u0142em wiedzy w tym temacie jest <a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/\" target=\"_blank\" rel=\"noreferrer noopener\">strona Selenium WebDriver<\/a>:&nbsp;&nbsp;<\/p>\n\n\n\n<p>\u201eSelenium WebDriver odnosi si\u0119 zar\u00f3wno do powi\u0105za\u0144 j\u0119zykowych, jak i implementacji kodu steruj\u0105cego danej przegl\u0105darki. Powszechnie u\u017cywa si\u0119 po prostu okre\u015blenia <strong>WebDriver<\/strong>\u201d.&nbsp;<\/p>\n\n\n\n<p>lub cytuj\u0105c sylabus A4Q:&nbsp;&nbsp;<\/p>\n\n\n\n<p>\u201eSelenium WebDriver, jak sama nazwa wskazuje, wsp\u00f3\u0142dzia\u0142a z przegl\u0105dark\u0105 w taki sam spos\u00f3b, jak zrobi\u0142by to prawdziwy u\u017cytkownik. WebDriver to kompleksowe narz\u0119dzie do kompilacji test\u00f3w dla aplikacji internetowych, kt\u00f3re jest r\u00f3wnie\u017c cz\u0119sto okre\u015blane jako<strong> Selenium WebDriver<\/strong>\u201d.&nbsp;<\/p>\n\n\n\n<p>Z architektonicznego punktu widzenia Selenium wszystkie komponenty s\u0105 odpowiednio zwizualizowane na oficjalnej <a href=\"https:\/\/www.selenium.dev\/documentation\/overview\/components\/\" target=\"_blank\" rel=\"noreferrer noopener\">stronie dokumentacji.<\/a>&nbsp;<\/p>\n\n\n\n<p>Mo\u017cna powiedzie\u0107, \u017ce WebDriver pomaga nam na\u015bladowa\u0107 interakcje u\u017cytkownika \/ przegl\u0105darki i dlatego jest tak pomocne w automatyzacji test\u00f3w. WebDriver kontroluje przegl\u0105dark\u0119 za pomoc\u0105 w\u0142a\u015bciwych dla niej sterownik\u00f3w, kt\u00f3re s\u0105 zwykle tworzone przez dostawc\u00f3w przegl\u0105darek (np. Google dla Chrome lub Mozilla dla Firefox).&nbsp;<\/p>\n\n\n\n<p>Ca\u0142a komunikacja jest dwukierunkowa i zgodna z nast\u0119puj\u0105cymi protoko\u0142ami:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>dla Selenium 3: <\/strong><a href=\"https:\/\/www.selenium.dev\/documentation\/legacy\/json_wire_protocol\/\" target=\"_blank\" rel=\"noreferrer noopener\">JSON Wire Protocol<\/a> prez HTTP (komunikacja t\u0142umaczona)&nbsp;<\/li>\n\n\n\n<li><strong>dla Selenium 4:<\/strong> <a href=\"https:\/\/w3c.github.io\/webdriver\/webdriver-spec.html\" target=\"_blank\" rel=\"noreferrer noopener\">W3C WebDriver Protocol<\/a> (komunikacja natywna). Zobacz wi\u0119cej na stronie <a href=\"https:\/\/www.w3.org\/TR\/webdriver\/\" target=\"_blank\" rel=\"noreferrer noopener\">W3C<\/a>&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Dzi\u0119ki protoko\u0142owi W3C wprowadzonemu w Selenium 4 mamy bezpo\u015bredni transfer informacji mi\u0119dzy klientem a serwerem. Tak wi\u0119c, je\u015bli nadal u\u017cywasz Selenium 3 (WebDriver) i wahasz si\u0119, czy zacz\u0105\u0107 korzysta\u0107 z wy\u017cszej wersji, koniecznie sprawd\u017a informacje na stronie: <a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/getting_started\/upgrade_to_selenium_4\/\" target=\"_blank\" rel=\"noreferrer noopener\">Upgrade to Selenium 4.<\/a>&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p>Minimalne wymagane wersje to<strong> Java w wersji 8 i Python w wersji 3.7<\/strong>&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Selenium-i-Python-\">Selenium i Python&nbsp;<\/h2>\n\n\n\n<p>Je\u015bli wybra\u0142e\u015b t\u0119 drog\u0119 i jeste\u015b pocz\u0105tkuj\u0105cy, wypr\u00f3buj Selenium IDE i wygeneruj sw\u00f3j kod Pythona za pomoc\u0105 funkcji eksportu.&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p>Gdy b\u0119dziesz ju\u017c bardziej obeznany z Selenium IDE, przygotuj pe\u0142ne \u015brodowisko programistyczne do automatyzacji test\u00f3w Selenium \/ Python.&nbsp;<\/p>\n\n\n\n<p>Przygotuj:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IDE (<a href=\"https:\/\/www.jetbrains.com\/pycharm\/\" target=\"_blank\" rel=\"noreferrer noopener\">PyCharm<\/a>, <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Visual Studio Code<\/a> lub <a href=\"https:\/\/www.jetbrains.com\/aqua\/\" target=\"_blank\" rel=\"noreferrer noopener\">Aqua<\/a>)&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/pypi.org\/project\/pip\/\" target=\"_blank\" rel=\"noreferrer noopener\">PIP<\/a> (Package Installer for Python)&nbsp;<\/li>\n\n\n\n<li>Narz\u0119dzie do budowania <a href=\"https:\/\/pipenv.pypa.io\/en\/latest\/\" target=\"_blank\" rel=\"noreferrer noopener\">Pipenv<\/a> ( PIP + <a href=\"https:\/\/docs.python.org\/3\/library\/venv.html\" target=\"_blank\" rel=\"noreferrer noopener\">Venv<\/a>\/<a href=\"https:\/\/virtualenv.pypa.io\/en\/stable\/\" target=\"_blank\" rel=\"noreferrer noopener\">Virtualenv<\/a>, <a href=\"https:\/\/python-poetry.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Poetry<\/a> lub <a href=\"https:\/\/bazel.build\/\" target=\"_blank\" rel=\"noreferrer noopener\">Bazel<\/a>)&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/pypi.org\/project\/selenium\/\" target=\"_blank\" rel=\"noreferrer noopener\">Powi\u0105zania Selenium z Pythonem<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/browsers\/\" target=\"_blank\" rel=\"noreferrer noopener\">Sterowniki przegl\u0105darek dla Selenium<\/a> (<a href=\"https:\/\/chromedriver.chromium.org\/downloads\" target=\"_blank\" rel=\"noreferrer noopener\">Chrome<\/a>, <a href=\"https:\/\/github.com\/mozilla\/geckodriver\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">Firefox<\/a>, <a href=\"https:\/\/developer.apple.com\/documentation\/webkit\/about_webdriver_for_safari\" target=\"_blank\" rel=\"noreferrer noopener\">Safari<\/a>, <a href=\"https:\/\/github.com\/operasoftware\/operachromiumdriver\" target=\"_blank\" rel=\"noreferrer noopener\">Opera<\/a>, <a href=\"https:\/\/developer.microsoft.com\/en-us\/microsoft-edge\/tools\/webdriver\/\" target=\"_blank\" rel=\"noreferrer noopener\">Edge<\/a> or <a href=\"https:\/\/pypi.org\/project\/webdriver-manager\/\" target=\"_blank\" rel=\"noreferrer noopener\">webdriver-manager<\/a>\/<a href=\"https:\/\/www.selenium.dev\/blog\/2022\/introducing-selenium-manager\/\" target=\"_blank\" rel=\"noreferrer noopener\">SeleniumManager*<\/a>)<\/li>\n\n\n\n<li>Test Runner (<a href=\"https:\/\/docs.python.org\/3\/library\/unittest.html\" target=\"_blank\" rel=\"noreferrer noopener\">Unittest<\/a> lub <a href=\"https:\/\/docs.pytest.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Pytest<\/a>)&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><br>*Selenium Manager jest dost\u0119pny od wersji 4.6 (Beta)<\/p>\n\n\n\n<p><strong>Przeczytaj artyku\u0142: <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/numpy-wstep-do-biblioteki-python\/\">NumPy \u2013 wst\u0119p do\u00a0biblioteki w\u00a0j\u0119zyku Python<\/a><\/strong><\/p>\n\n\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Selenium-i-Java-\">Selenium i Java&nbsp;<\/h2>\n\n\n\n<p>Je\u015bli wybra\u0142e\u015b t\u0119 opcj\u0119 i jeste\u015b pocz\u0105tkuj\u0105cy, wypr\u00f3buj wtyczk\u0119 <a href=\"https:\/\/www.selenium.dev\/selenium-ide\/\" target=\"_blank\" rel=\"noreferrer noopener\">Selenium IDE<\/a> dla Chrome lub Firefox i wygeneruj kod Java za pomoc\u0105 funkcji eksportu:&nbsp;<\/p>\n\n\n\n<p>Gdy ju\u017c nab\u0119dziesz do\u015bwiadczenia, przygotuj pe\u0142ne \u015brodowisko programistyczne do automatyzacji test\u00f3w Selenium \/ Java.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Przygotuj:&nbsp;<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IDE (<a href=\"https:\/\/www.jetbrains.com\/idea\/\" target=\"_blank\" rel=\"noreferrer noopener\">IDEA<\/a>, <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Visual Studio Code<\/a> lub <a href=\"https:\/\/www.jetbrains.com\/aqua\/\" target=\"_blank\" rel=\"noreferrer noopener\">Aqua<\/a>)&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.oracle.com\/java\/technologies\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">Java (JDK)<\/a>&nbsp;<\/li>\n\n\n\n<li>Narz\u0119dzie do budowania (<a href=\"https:\/\/maven.apache.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Maven<\/a> lub <a href=\"https:\/\/gradle.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Gradle<\/a>)&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/releases\/\" target=\"_blank\" rel=\"noreferrer noopener\">Powi\u0105zania z Selenium w Javie<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/browsers\/\" target=\"_blank\" rel=\"noreferrer noopener\">Sterowniki przegl\u0105darek dla Selenium<\/a> (<a href=\"https:\/\/chromedriver.chromium.org\/downloads\" target=\"_blank\" rel=\"noreferrer noopener\">Chrome<\/a>, <a href=\"https:\/\/github.com\/mozilla\/geckodriver\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">Firefox<\/a>, <a href=\"https:\/\/developer.apple.com\/documentation\/webkit\/about_webdriver_for_safari\" target=\"_blank\" rel=\"noreferrer noopener\">Safari<\/a>, <a href=\"https:\/\/github.com\/operasoftware\/operachromiumdriver\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">Opera<\/a>, <a href=\"https:\/\/developer.microsoft.com\/en-us\/microsoft-edge\/tools\/webdriver\/\" target=\"_blank\" rel=\"noreferrer noopener\">Edge<\/a> or <a href=\"https:\/\/bonigarcia.dev\/webdrivermanager\/\" target=\"_blank\" rel=\"noreferrer noopener\">WebDriverManager<\/a>\/<a href=\"https:\/\/www.selenium.dev\/documentation\/selenium_manager\/\" target=\"_blank\" rel=\"noreferrer noopener\">SeleniumManager*<\/a>)<\/li>\n\n\n\n<li>Test Runner (<a href=\"https:\/\/junit.org\/junit4\" target=\"_blank\" rel=\"noopener\">JUNIT4<\/a> \/ <a href=\"https:\/\/junit.org\/junit5\/\" target=\"_blank\" rel=\"noopener\">JUNIT5<\/a> lub <a href=\"https:\/\/testng.org\/doc\/\" target=\"_blank\" rel=\"noreferrer noopener\">TestNG<\/a>)&nbsp;&nbsp;&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><br>*Selenium Manager jest dost\u0119pny od wersji 4.6 (Beta)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Kt\u00f3ra-opcja-jest-lepsza-dla-test\u00f3w-automatycznych-(Selenium-z-Pythonem-czy-Selenium-z-Jav\u0105)?--\">Kt\u00f3ra opcja jest lepsza dla test\u00f3w automatycznych (Selenium z Pythonem czy Selenium z Jav\u0105)?&nbsp;&nbsp;<\/h2>\n\n\n\n<p>Je\u015bli jeste\u015b ca\u0142kowicie \u201ezielony\u201d i chcesz sprawdzi\u0107 mo\u017cliwo\u015bci programowania czy automatyzacji za pomoc\u0105 Selenium z Jav\u0105 lub Pythonem, proponuj\u0119, aby\u015b zacz\u0105\u0142 od skorzystania z <a href=\"https:\/\/www.selenium.dev\/selenium-ide\/\" target=\"_blank\" rel=\"noreferrer noopener\">Selenium IDE.<\/a>&nbsp;<\/p>\n\n\n\n<p>Selenium IDE jest dostarczany w formie dodatku do Chrome, Firefox i Edge (wersja 3.x). Umo\u017cliwia wygenerowanie kodu Javy \/ Pythona za pomoc\u0105 funkcji eksportu. To bardzo proste \u2013 zwyczajnie rejestrujesz swoje dzia\u0142ania w przegl\u0105darce. Kod jest nast\u0119pnie generowany za pomoc\u0105 funkcji eksportu do ulubionego j\u0119zyka. W momencie pisania tego artyku\u0142u (czerwiec 2023) mo\u017cliwe by\u0142o nawet pobranie samodzielnej wersji (<strong>4 alpha)<\/strong> Selenium IDE na kilka platform (np.: <strong>Windows<\/strong>, <strong>MacOS<\/strong>).&nbsp;<\/p>\n\n\n\n<p>Dowiedz si\u0119 wi\u0119cej o <a href=\"https:\/\/github.com\/SeleniumHQ\/selenium-ide\/releases\/\" target=\"_blank\" rel=\"noreferrer noopener\">najnowszych wersjach Selenium.<\/a>&nbsp;<\/p>\n\n\n\n<p>Z punktu widzenia automatyzacji, a zw\u0142aszcza integracji CI\/CD, wygl\u0105da na to, \u017ce lepiej sprawdzi si\u0119 tu duet Selenium i Java. Dobrze wpisuje si\u0119 w powy\u017cszy proces \u2013 zazwyczaj natywnie i \u0142atwo dzi\u0119ki bardzo dobrej integracji z narz\u0119dziami takimi jak<strong> Jenkins \/ Maven \/ Gradle.<\/strong>&nbsp;<\/p>\n\n\n\n<p>Nie oznacza to jednak, \u017ce nie mo\u017cna tego osi\u0105gn\u0105\u0107 za pomoc\u0105 Pythona. B\u0119dzie to co prawda bardziej m\u0119cz\u0105ce i wymaga u\u017cycia niekt\u00f3rych wtyczek. Ale przypomnijmy: <strong>Python oznacza \u0142atwe programowanie i wi\u0119ksz\u0105 czytelno\u015b\u0107. <\/strong>Je\u015bli wi\u0119c nie masz \u017cadnego zaplecza programistycznego w obszarze Javy i Pythona, mo\u017ce kusi\u0107 ci\u0119 wykorzystanie drugiego z tych j\u0119zyk\u00f3w.&nbsp;<\/p>\n\n\n\n<p>Jednym z wa\u017cnych punkt\u00f3w w procesie rozwoju automatyzacji test\u00f3w w Selenium jest debugowanie test\u00f3w. Wiele przegl\u0105darek udost\u0119pnia \u201e<strong>DevTools<\/strong>\u201d \u2013 zestaw narz\u0119dzi zintegrowanych z przegl\u0105dark\u0105, kt\u00f3rych programi\u015bci mog\u0105 u\u017cywa\u0107 do debugowania aplikacji internetowych i sprawdzania wydajno\u015bci swoich stron.&nbsp;<\/p>\n\n\n\n<p>Pierwszym narz\u0119dziem tego typu, kt\u00f3re przychodzi mi do g\u0142owy, jest <strong>Chrome DevTools <\/strong>oparty na protokole <strong>Chrome DevTools Protocol (CDP):<\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.chrome.com\/docs\/devtools\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/developer.chrome.com\/docs\/devtools\/<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/bidirectional\/chrome_devtools\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/documentation\/webdriver\/bidirectional\/chrome_devtools\/<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.selenium.dev\/selenium\/docs\/api\/Java\/org\/openqa\/selenium\/devtools\/package-summary.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/selenium\/docs\/api\/Java\/org\/openqa\/selenium\/devtools\/package-summary.html<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/chromedevtools.github.io\/devtools-protocol\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/chromedevtools.github.io\/devtools-protocol\/<\/a>&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Jest on prawdopodobnie najcz\u0119\u015bciej u\u017cywany i zintegrowany z samym Selenium 4. Pomaga sprawdza\u0107, testowa\u0107 i weryfikowa\u0107 selektory. Poniewa\u017c selektory s\u0105 og\u00f3lne i niezale\u017cne od j\u0119zyka, maj\u0105 uniwersalne zastosowanie. Przydatne w debugowaniu kodu testowego Selenium b\u0119d\u0105 r\u00f3wnie\u017c punkty przerwania (breakpoints) w twoim ulubionym IDE. Ustaw je w dowolnym miejscu, kt\u00f3re wydaje ci si\u0119 problematyczne, a test w przegl\u0105darce zatrzyma si\u0119 w wybranym momencie. Teraz mo\u017cesz kontynuowa\u0107 debugowanie za pomoc\u0105 <strong>DevTools <\/strong>przegl\u0105darki, takich jak <strong>Chrome DevTools.<\/strong>&nbsp;<\/p>\n\n\n\n<p>Dzia\u0142a to zar\u00f3wno dla Javy (np.: IDEA), jak i Pythona (np.: PyCharm). Ale je\u015bli chodzi o Pythona, jest jedna kwestia interesuj\u0105ca r\u00f3wnie\u017c w kontek\u015bcie debugowania. Mam na my\u015bli <strong>PDB (The Python Debugger)<\/strong>, jedn\u0105 z najlepszych technik debugowania dla Selenium.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.python.org\/3\/library\/pdb.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.python.org\/3\/library\/pdb.html<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/realpython.com\/python-debugging-pdb\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/realpython.com\/pl\/python-debugging-pdb\/<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/visualmodo.com\/6-simple-tips-for-debugging-selenium-python-code\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/visualmodo.com\/6-simple-tips-for-debugging-selenium-python-code\/<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/seleniumbase.com\/the-ultimate-pytest-debugging-guide-2021\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/seleniumbase.com\/the-ultimate-pytest-debugging-guide-2021\/<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.codementor.io\/@stevek\/advanced-python-debugging-with-pdb-g56gvmpfa\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.codementor.io\/@stevek\/advanced-python-debugging-with-pdb-g56gvmpfa<\/a>&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Ten modu\u0142 Pythona zapewnia interaktywn\u0105 opcj\u0119 debugowania kodu \u017ar\u00f3d\u0142owego. Aby samemu przekona\u0107 si\u0119 o tym, jak bardzo mo\u017ce by\u0107 przydatna, sp\u00f3jrz na poni\u017cszy przyk\u0142ad:&nbsp;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">C:\\Users\\user> py \n\nPython 3.11.4 (tagi\/v3.11.4:d2340ef, 7 czerwca 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] na win32 \n\nWpisz \u201epomoc\u201d, \u201eprawa autorskie\u201d, \u201ekredyty\u201d lub \u201elicencja\u201d, aby uzyska\u0107 wi\u0119cej informacji. \n\n>>> from selenium import webdriver \n\n>>> from selenium.webdriver.common.by import By \n\n>>> import pdb \n\n>>> if __name__ == '__main__': \n\n...     print('Hello World!') \n\n...     browser = webdriver.Chrome() \n\n...     browser.  Get('http:\/\/selenium.dev\/') \n\n...     web_driver_selector = \"div.selenium-button-container a.selenium-webdriver\" \n\n...     web_Driver_link = browser.find_element(By.CSS_SELECTOR, web_Driver_Selector) \n\n...     pdb.set_trace  () \n\n...     browser.  Quit() \n\n... \n\nHello World! \n\n <\/pre>\n\n\n\n<p>a teraz, gdy twoja przegl\u0105darka zostanie zatrzymana w wybranym punkcie ustawionym na <a href=\"http:\/\/selenium.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">stronie<\/a>, mo\u017cesz sprawdzi\u0107 <strong>web_driver_link:<\/strong>&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(Pdb) dir \n\n&lt;built-in function dir> \n\n(Pdb) dir(web_driver_link) \n\n['__abstractmethods__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_abc_impl', '_execute', '_id', '_parent', '_upload', 'accessible_name', 'aria_role', 'clear', 'click', 'find_element', 'find_elements', 'get_attribute', 'get_dom_attribute', 'get_property', 'id', 'is_displayed', 'is_enabled', 'is_selected', 'location', 'location_once_scrolled_into_view', 'parent', 'rect', 'screenshot', 'screenshot_as_base64', 'screenshot_as_png', 'send_keys', 'shadow_root', 'size', 'submit', 'tag_name', 'text', 'value_of_css_property'] <\/pre>\n\n\n\n<p>Jak wida\u0107, PDB daje mo\u017cliwo\u015b\u0107 sprawdzenia obiektu i tego, co mo\u017cna z nim zrobi\u0107, za pomoc\u0105 polecenia <strong>dir<\/strong>, na przyk\u0142ad:&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(Pdb) web_driver_link.is_displayed() \n\nTrue \n\n(Pdb) web_driver_link.is_enabled() \n\nTrue \n\n(Pdb) web_driver_link.is_selected() \n\nFalse \n\n(Pdb) web_driver_link.text \n\n'READ MORE' \n\n(Pdb) web_driver_link.get_property('href') \n\n\u201ehttps:\/\/www.selenium.dev\/documentation\/webdriver\/\u201d \n\n(Pdb) web_driver_link.get_dom_attribute('class') \n\n'selenium-button selenium-webdriver text-uppercase font-weight-bold' \n\n(Pdb) web_driver_link.get_attribute('class') \n\n'selenium-button selenium-webdriver text-uppercase font-weight-bold' \n\n(Pdb) web_driver_link.get_dom_attribute('class') \n\n&lt;bound method WebElement.get_dom_attribute of &lt;selenium.webdriver.remote.webelement.WebElement (session=\"b51ad53a899388ec9293d83fd0750a98\", element=\"E97FE72B561D59DFF64B6C8846C4CC17_element_31\")>> \n\n(Pdb) web_driver_link.id \n\n'E97FE72B561D59DFF64B6C8846C4CC17_element_31' \n\n(Pdb) web_driver_link.__class__ \n\n&lt;class 'selenium.webdriver.remote.webelement.WebElement'> \n\n(Pdb) web_driver_link.value_of_css_property \n\n&lt;bound method WebElement.value_of_css_property of &lt;selenium.webdriver.remote.webelement.WebElement (session=\"b51ad53a899388ec9293d83fd0750a98\", element=\"E97FE72B561D59DFF64B6C8846C4CC17_element_31\")>> \n\n(Pdb) web_driver_link.value_of_css_property('color') \n\n'rgba(200, 16, 46, 1)' \n\n(Pdb) <\/pre>\n\n\n\n<p>Mo\u017ce to by\u0107 r\u00f3wnie\u017c jeden z argument\u00f3w przemawiaj\u0105cych na korzy\u015b\u0107 Pythona. Mo\u017cesz go rozszerzy\u0107 nawet za pomoc\u0105 dodatku <strong>ipdb<\/strong>, kt\u00f3ry poprawia obs\u0142ug\u0119 debuggera pdb.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Tryb debugowania ipdb dodaje kolorowe pod\u015bwietlanie sk\u0142adni, uzupe\u0142nianie tabulator\u00f3w i rozszerzony widok kodu z numerami wierszy. Przed u\u017cyciem PDB musi by\u0107 zainstalowany niezale\u017cnie od Pytest:&nbsp;&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install ipdb <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Do czego s\u0142u\u017cy Selenium z Pythonem?&nbsp;<\/h3>\n\n\n\n<p>Wspomniany duet technologiczny s\u0142u\u017cy do testowania frontu aplikacji webowych. Pomaga wspiera\u0107 \u017cmudne i powtarzalne dzia\u0142ania lub testy GUI, zast\u0119puj\u0105c je automatycznymi skryptami. W ten spos\u00f3b mo\u017cna je zintegrowa\u0107 z narz\u0119dziami CI\/CD i wykorzysta\u0107 na przyk\u0142ad do <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/testy-regresji\/\" data-type=\"post\" data-id=\"3116\">test\u00f3w regresji<\/a> przeprowadzanych w nocy. Gdybym mia\u0142 odpowiedzie\u0107 na powy\u017cej zadane pytanie jednym zdaniem, powiedzia\u0142bym:&nbsp;<\/p>\n\n\n\n<p><strong>\u201eSelenium + Python s\u0142u\u017cy zasadniczo do automatyzacji test\u00f3w aplikacji internetowych\u201d.<\/strong>&nbsp;<\/p>\n\n\n\n<p>Selenium (WebDriver) odpowiada za dwukierunkow\u0105 komunikacj\u0119 klient \u2013 serwer mi\u0119dzy tob\u0105 a przegl\u0105dark\u0105. Python i jego powi\u0105zania z Selenium \u201eopakowuj\u0105\u201d to wszystko w wykonywalny kod, dostarczany przez niekt\u00f3re frameworki testowe, takie jak xUnit \/ TestNG.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Czy Selenium z Pythonem to dobry wyb\u00f3r?&nbsp;<\/h3>\n\n\n\n<p>Odpowied\u017a na to pytanie zale\u017cy od wielu czynnik\u00f3w. Ka\u017cdy z nas jest inny, r\u00f3\u017cni\u0105 nas do\u015bwiadczenie, kompetencje i umiej\u0119tno\u015b\u0107 uczenia si\u0119. Ostateczna odpowied\u017a na to pytanie b\u0119dzie wi\u0119c mia\u0142a dla ciebie wymiar indywidualny. Celem tego artyku\u0142u jest to, aby pom\u00f3c ci j\u0105 odnale\u017a\u0107. Przeczytaj go, przeanalizuj, bior\u0105c pod uwag\u0119 w\u0142asne cele zawodowe, do\u015bwiadczenie, aktualne projekty i swoje plany, tak by dokona\u0107 mo\u017cliwie jak najlepszego wyboru.&nbsp;&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Jak-wykona\u0107-skrypt-Selenium-w-Pythonie?-\">Jak wykona\u0107 skrypt Selenium w Pythonie?&nbsp;<\/h2>\n\n\n\n<p>W Pythonie mo\u017cemy wyr\u00f3\u017cni\u0107 2 g\u0142\u00f3wne typy plik\u00f3w:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pliki <strong>.py<\/strong> to pliki tekstowe mo\u017cliwe do odczytania przez cz\u0142owieka, zawieraj\u0105ce wewn\u0105trz kod Pythona, zwane skryptami Pythona (w systemach Windows rozszerzeniem mo\u017ce by\u0107 r\u00f3wnie\u017c <strong>.pyw<\/strong>)&nbsp;<\/li>\n\n\n\n<li>Pliki <strong>.pyc<\/strong> to skompilowane pliki kodu bajtowego, kt\u00f3re s\u0105 generowane przez interpreter j\u0119zyka Python podczas importowania lub wykonywania skryptu Pythona.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Pliki Pythona s\u0105 zapisywane na komputerze u\u017cytkownika z rozszerzeniem <strong>.py<\/strong>, podobnie jak pliki Java s\u0105 zapisywane z rozszerzeniami <strong>.java.<\/strong> Kody Pythona, po ich zinterpretowaniu, s\u0105 nast\u0119pnie konwertowane na kody bajtowe. Te kody bajtowe s\u0105 zapisywane w pliku z rozszerzeniem <strong>.pyc<\/strong>.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Katalog \u201e<a href=\"https:\/\/www.w3docs.com\/snippets\/python\/what-is-pycache.html\" target=\"_blank\" rel=\"noreferrer noopener\">__pycache__<\/a>\u201d to folder utworzony w celu przechowywania plik\u00f3w<strong> .pyc<\/strong>.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/prepinsta.com\/python\/difference-between-py-pyc-and-pycache-files\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/prepinsta.com\/pl\/python\/difference-between-py-pyc-and-pycache-files\/<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/stackabuse.com\/differences-between-pyc-pyd-and-pyo-python-files\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/stackabuse.com\/differences-between-pyc-pyd-and-pyo-python-files\/<\/a>&nbsp;<\/li>\n\n\n\n<li><a href=\"https:\/\/net-informations.com\/python\/iq\/pyc.htm\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/net-informations.com\/python\/iq\/pyc.htm<\/a>&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Pomy\u015bl o pliku <strong>.pyc<\/strong> jako skompilowanym kodzie bajtowym podobnym do pliku .<strong>class<\/strong> w \u015bwiecie Javy.&nbsp;<\/p>\n\n\n\n<p>Gdy tylko <a href=\"https:\/\/docs.python.org\/dev\/whatsnew\/3.2.html#pep-3147-pyc-repository-directories\" target=\"_blank\" rel=\"noreferrer noopener\">go wygenerujesz<\/a>, mo\u017ce by\u0107 bezpo\u015brednio wykonany przez interpreter bez rekompilacji pliku skryptu <strong>.py<\/strong> za ka\u017cdym razem, gdy go u\u017cywasz \u2013 zatem przyspieszasz wykonanie.&nbsp;<\/p>\n\n\n\n<p>To wa\u017cne, gdy masz spore skrypty i\/lub modu\u0142y Pythona.&nbsp;<\/p>\n\n\n\n<p>Podsumowuj\u0105c:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pliki <strong>.pyc<\/strong> s\u0105 generowane automatycznie przez interpreter j\u0119zyka Python podczas importowania lub wykonywania skryptu Python&nbsp;<\/li>\n\n\n\n<li>Pliki <strong>.pyc<\/strong> s\u0105 przechowywane w tym samym katalogu co odpowiadaj\u0105ce im pliki <strong>.py <\/strong>i maj\u0105 tak\u0105 sam\u0105 nazw\u0119 jak pliki <strong>.py<\/strong>, z wyj\u0105tkiem rozszerzenia <strong>.pyc <\/strong>zamiast <strong>.py<\/strong>&nbsp;<\/li>\n\n\n\n<li>Pliki <strong>.pyc<\/strong> s\u0105 w\u0142a\u015bciwe dla danej wersji Pythona, u\u017cytej do ich wygenerowania. Je\u015bli spr\u00f3bujesz uruchomi\u0107 plik <strong>.pyc<\/strong> z inn\u0105 wersj\u0105 j\u0119zyka Python, mo\u017cesz napotka\u0107 b\u0142\u0119dy lub mo\u017ce si\u0119 pojawi\u0107 nieoczekiwane zachowanie&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>e\u015bli chcesz uruchomi\u0107 skrypt Pythona, masz 2 opcje:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>uruchamianie Python Scriptu przez Interpretera Pythona w trybie interaktywnym (w postaci fragmentu kodu napisanego w sesji interaktywnej \u2013 przydatnego do debugowania)&nbsp;<\/li>\n<\/ol>\n\n\n\n<p><strong>python<\/strong>&nbsp;<\/p>\n\n\n\n<p>e.g.:&nbsp;<\/p>\n\n\n\n<p>wpisywanie kodu linijka po linijce&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">C:\\Users\\user> py \n\nPython 3.11.4 (tagi\/v3.11.4:d2340ef, 7 czerwca 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] na win32 \n\nWpisz \u201epomoc\u201d, \u201eprawa autorskie\u201d, \u201ekredyty\u201d lub \u201elicencja\u201d, aby uzyska\u0107 wi\u0119cej informacji. \n\n>>> from selenium import webdriver \n\n>>> if __name__ == '__main__': \n\n...     print('Hello World!') \n\n...     browser = webdriver.Chrome() \n\n...     browser.get('http:\/\/selenium.dev\/') \n\n...     browser.quit() \n\n... \n\nHello World! \n\n  \n\nDevTools listening on ws:\/\/127.0.0.1:56302\/devtools\/browser\/fdca3cc9-4266-49af-a146-41d60ed464eb \n\n>>> exit() \n\n  \n\nC:\\Users\\user> <\/pre>\n\n\n\n<p>lub za pomoc\u0105<strong> exec() <\/strong>, kt\u00f3ry zapewnia alternatywny spos\u00f3b uruchamiania skrypt\u00f3w:&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">C:\\Users\\user> py \n\nPython 3.11.4 (tagi\/v3.11.4:d2340ef, 7 czerwca 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] na win32 \n\nWpisz \u201epomoc\u201d, \u201eprawa autorskie\u201d, \u201ekredyty\u201d lub \u201elicencja\u201d, aby uzyska\u0107 wi\u0119cej informacji. \n\n>>> exec(open('your_script.py').read()) \n\nHello World! \n\n>>> \n\n>>> quit() \n\n  \n\nC:\\Users\\user> <\/pre>\n\n\n\n<p>Interaktywna sesja Pythona pozwala napisa\u0107 wiele linijek kodu, jednak po jej zamkni\u0119ciu tracisz wszystko, co napisa\u0142e\u015b.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Dlatego cz\u0119sto do pisania program\u00f3w w Pythonie u\u017cywa si\u0119 zwyk\u0142ych plik\u00f3w tekstowych. Plik z kodem Pythona musi znajdowa\u0107 si\u0119 w bie\u017c\u0105cym katalogu roboczym. Plik musi znajdowa\u0107 si\u0119 w \u015bcie\u017cce wyszukiwania modu\u0142\u00f3w Pythona (<strong>PMSP<\/strong>), w kt\u00f3rej Python wyszukuje importowane modu\u0142y i pakiety.&nbsp;<\/p>\n\n\n\n<p>2) uruchom Python Script za pomoc\u0105 Command-Line (w formie skryptu lub modu\u0142u \u2013 przydatne do automatyzacji)&nbsp;<\/p>\n\n\n\n<p><strong>python your_script.py<\/strong>&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">C:\\Users\\user> py your_script.py \n\nHello World! <\/pre>\n\n\n\n<p>lub jeszcze \u0142atwiej: u\u017cywaj\u0105c skojarze\u0144 plik\u00f3w systemu Windows i podaj\u0105c tylko nazw\u0119 skryptu:&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">C:\\Users\\user> your_script.py \n\nHello World! <\/pre>\n\n\n\n<p>w systemach GNU\/Linux mo\u017cesz osi\u0105gn\u0105\u0107 co\u015b podobnego, dodaj\u0105c tak zwany hashbang lub shebang do swojego skryptu. Jest on kombinacj\u0105 znak\u00f3w #! po kt\u00f3rym nast\u0119puje \u015bcie\u017cka interpretera.&nbsp;<\/p>\n\n\n\n<p>Istniej\u0105 dwa sposoby okre\u015blenia \u015bcie\u017cki do interpretera:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>#!\/usr\/bin\/python<\/strong>: pisz\u0105c \u015bcie\u017ck\u0119 absolutn\u0105&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>#!\/usr\/bin\/env python<\/strong>:<strong> <\/strong>za pomoc\u0105 polecenia systemu operacyjnego <strong>env<\/strong>, kt\u00f3re lokalizuje i wykonuje kod Pythona, przeszukuj\u0105c zmienn\u0105 \u015brodowiskow\u0105 PATH&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Poniewa\u017c nie wszystkie systemy uniksopodobne lokalizuj\u0105 interpreter Pythona w tym samym miejscu, drugi charakter \u015bcie\u017cki podany powy\u017cej wygl\u0105da bardziej uniwersalnie.&nbsp;<\/p>\n\n\n\n<p>musisz r\u00f3wnie\u017c doda\u0107 uprawnienia do wykonywania:&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#assign the execution permissions \n\nchmod +x your_script.py \n\n#run script using its filename \n\n.\/your_script.py \n\nHello World! <\/pre>\n\n\n\n<p>mo\u017cesz uruchomi\u0107 wygenerowany bezpo\u015brednio kod bajtowy skryptu:&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">C:\\Users\\user> dir your_script.py \n\nVolume in drive C is Windows \n\nVolume Serial Number is 94D2-9546 \n\n  \n\nDirectory of C:\\Users\\user \n\n  \n\n15-Jun-23  14:02               544 your_script.py \n\n               1 File(s)            544 bytes \n\n               0 Dir(s)  194,664,701,952 bytes free \n\n  \n\nC:\\Users\\user> cd __pycache__ \n\n  \n\nC:\\Users\\user\\__pycache__> dir your_script.cpython-311.pyc \n\nVolume in drive C is Windows \n\nVolume Serial Number is 94D2-9546 \n\n  \n\nDirectory of C:\\Users\\user\\__pycache__ \n\n  \n\n15-Jun-23  14:06               401 your_script.cpython-311.pyc \n\n               1 File(s)            401 bytes \n\n               0 Dir(s)  194,664,546,304 bytes free \n\n  \n\nC:\\Users\\user\\__pycache__> your_script.cpython-311.pyc \n\nHello World! \n\n  \n\nC:\\Users\\user\\__pycache__> <\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Jak-zainstalowa\u0107-Selenium-z-PIP?-\">Jak zainstalowa\u0107 Selenium z PIP?&nbsp;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>zainstaluj Pythona (r\u0119cznie lub za pomoc\u0105 IDE)&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Wejd\u017a na <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python.org<\/a> i pobierz odpowiedni\u0105 <a href=\"https:\/\/www.python.org\/ftp\/python\/\" target=\"_blank\" rel=\"noreferrer noopener\">wersj\u0119<\/a>.&nbsp;<\/p>\n\n\n\n<p>py &#8211;version<\/p>\n\n\n\n<p>Python 3.N.N<\/p>\n\n\n\n<p>e.g. for WIN (CMD):<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> \n\nC:\\Users\\user> py --version \n\nPython 3.11.4 \n\n  \n\nC:\\Users\\user> <\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/pip.pypa.io\/en\/stable\/\" target=\"_blank\" rel=\"noreferrer noopener\">install or upgrade PIP<\/a> (manually or using IDE)&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Czym jest PIP?&nbsp;<\/h3>\n\n\n\n<p><strong>PIP jest instalatorem pakiet\u00f3w dla Pythona.<\/strong> Mo\u017cesz go u\u017cy\u0107 do zainstalowania pakiet\u00f3w z indeksu pakiet\u00f3w Pythona i innych. Najpopularniejsze narz\u0119dzie do instalowania pakiet\u00f3w Pythona do\u0142\u0105czone do najnowszych wersji tego j\u0119zyka.&nbsp;Dostarcza podstawowych funkcji wyszukiwania, pobierania i instalowania pakiet\u00f3w z innych indeks\u00f3w pakiet\u00f3w Pythona i mo\u017ce by\u0107 w\u0142\u0105czony do szerokiego zakresu przep\u0142yw\u00f3w pracy programistycznej (workflow) za po\u015brednictwem interfejsu wiersza polece\u0144 (<strong>CLI<\/strong>).&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>py -m pip &#8211;version<\/p>\n\n\n\n<p>pip X.Y.Z from \u2026 (python 3.N.N)<\/p>\n\n\n\n<p>e.g., for WIN (CMD):<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> \n\nC:\\Users\\user> py -m pip --version \n\npip 23.1.2 from C:\\Program Files\\Python311\\Lib\\site-packages\\pip (python 3.11) \n\n  \n\nC:\\Users\\user> \n\n  \n\ne.g., for WIN (IDE): \n\n  \n\n  \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> py -m pip list \n\n \n\n \n\nsetuptools 65.5.1 \n\nwheel      0.38.4 \n\n  \n\n[notice] A new release of pip available: 22.3.1 -> 23.1.2 \n\n[notice] To update, run: python.exe -m pip install --upgrade pip \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> py -m pip --version \n\npip 22.3.1 from C:\\Users\\user\\PycharmProjects\\pythonSelenium\\venv\\Lib\\site-packages\\pip (python 3.11) \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> python.exe -m pip install --upgrade pip \n\nRequirement already satisfied: pip in c:\\users\\user\\pycharmprojects\\pythonselenium\\venv\\lib\\site-packages (22.3.1) \n\nCollecting pip \n\n  Downloading pip-23.1.2-py3-none-any.whl (2.1 MB) \n\n     \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 2.1\/2.1 MB 2.7 MB\/s eta 0:00:00 \n\nInstalling collected packages: pip \n\n  Attempting uninstall: pip \n\n    Found existing installation: pip 22.3.1 \n\n    Uninstalling pip-22.3.1: \n\n      Successfully uninstalled pip-22.3.1 \n\nSuccessfully installed pip-23.1.2 \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium>  \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> py -m pip --version \n\npip 23.1.2 from C:\\Users\\user\\PycharmProjects\\pythonSelenium\\venv\\Lib\\site-packages\\pip (python 3.11) \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium>  \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> py -m pip list \n\nPackage    Version \n\n---------- ------- \n\npip        23.1.2 \n\nsetuptools 65.5.1 \n\nwheel      0.38.4 \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium>   <\/pre>\n\n\n\n<p>Je\u015bli to zadzia\u0142a\u0142o, gratulacje! Masz w swoim \u015brodowisku dzia\u0142aj\u0105cy PIP.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>instalacja <a href=\"https:\/\/pypi.org\/project\/selenium\/#files\" target=\"_blank\" rel=\"noreferrer noopener\">powi\u0105za\u0144 Selenium Python<\/a>&nbsp;<br>&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Zweryfikuj obs\u0142ugiwan\u0105 wersj\u0119 Pythona (dla wersji Selenium 4.10.0):&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  Python 3.7+ \n  \n\nInstalacja <\/pre>\n\n\n\n<p>Je\u015bli masz PIP w swoim systemie, mo\u017cesz po prostu zainstalowa\u0107 lub zaktualizowa\u0107 powi\u0105zania Pythona:&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install selenium \n\npip install -U selenium <\/pre>\n\n\n\n<p>Je\u015bli potrzebujesz okre\u015blonej wersji powi\u0105za\u0144 Selenium z Pythonem:&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install selenium==&lt;version_number> <\/pre>\n\n\n\n<p>Alternatywnie mo\u017cesz pobra\u0107 dystrybucj\u0119 \u017ar\u00f3d\u0142ow\u0105 z PyPI (np. selen-4.10.0.tar.gz), odarchiwizowa\u0107 j\u0105 i uruchomi\u0107:&nbsp;<\/p>\n\n\n\n<p>py setup.py install<\/p>\n\n\n\n<p>e.g. for WIN (CMD):<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  \n\nC:\\Users\\user> py -m pip list \n\nPackage    Version \n\n---------- ------- \n\npip        23.1.2 \n\nsetuptools 65.5.0 \n\n  \n\nC:\\Users\\user> \n\nC:\\Users\\user> py -m pip install selenium \n\nDefaulting to user installation because normal site-packages is not writeable \n\nCollecting selenium \n\n  Downloading selenium-4.10.0-py3-none-any.whl (6.7 MB) \n\n     ---------------------------------------- 6.7\/6.7 MB 23.7 MB\/s eta 0:00:00 \n\nCollecting urllib3[socks]&lt;3,>=1.26 (from selenium) \n\n  Downloading urllib3-2.0.3-py3-none-any.whl (123 kB) \n\n     ---------------------------------------- 123.6\/123.6 kB ? eta 0:00:00 \n\nCollecting trio~=0.17 (from selenium) \n\n  Downloading trio-0.22.0-py3-none-any.whl (384 kB) \n\n     ---------------------------------------- 384.9\/384.9 kB 25.0 MB\/s eta 0:00:00 \n\nCollecting trio-websocket~=0.9 (from selenium) \n\n  Downloading trio_websocket-0.10.3-py3-none-any.whl (17 kB) \n\nCollecting certifi>=2021.10.8 (from selenium) \n\n  Downloading certifi-2023.5.7-py3-none-any.whl (156 kB) \n\n     ---------------------------------------- 157.0\/157.0 kB 9.2 MB\/s eta 0:00:00 \n\nCollecting attrs>=19.2.0 (from trio~=0.17->selenium) \n\n  Downloading attrs-23.1.0-py3-none-any.whl (61 kB) \n\n     ---------------------------------------- 61.2\/61.2 kB 3.2 MB\/s eta 0:00:00 \n\nCollecting sortedcontainers (from trio~=0.17->selenium) \n\n  Downloading sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB) \n\nCollecting async-generator>=1.9 (from trio~=0.17->selenium) \n\n  Downloading async_generator-1.10-py3-none-any.whl (18 kB) \n\nCollecting idna (from trio~=0.17->selenium) \n\n  Downloading idna-3.4-py3-none-any.whl (61 kB) \n\n     ---------------------------------------- 61.5\/61.5 kB 3.2 MB\/s eta 0:00:00 \n\nCollecting outcome (from trio~=0.17->selenium) \n\n  Downloading outcome-1.2.0-py2.py3-none-any.whl (9.7 kB) \n\nCollecting sniffio (from trio~=0.17->selenium) \n\n  Downloading sniffio-1.3.0-py3-none-any.whl (10 kB) \n\nCollecting cffi>=1.14 (from trio~=0.17->selenium) \n\n  Downloading cffi-1.15.1-cp311-cp311-win_amd64.whl (179 kB) \n\n     ---------------------------------------- 179.0\/179.0 kB ? eta 0:00:00 \n\nCollecting exceptiongroup (from trio-websocket~=0.9->selenium) \n\n  Downloading exceptiongroup-1.1.1-py3-none-any.whl (14 kB) \n\nCollecting wsproto>=0.14 (from trio-websocket~=0.9->selenium) \n\n  Downloading wsproto-1.2.0-py3-none-any.whl (24 kB) \n\nCollecting pysocks!=1.5.7,&lt;2.0,>=1.5.6 (from urllib3[socks]&lt;3,>=1.26->selenium) \n\n  Downloading PySocks-1.7.1-py3-none-any.whl (16 kB) \n\nCollecting pycparser (from cffi>=1.14->trio~=0.17->selenium) \n\n  Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB) \n\n     ---------------------------------------- 118.7\/118.7 kB ? eta 0:00:00 \n\nCollecting h11&lt;1,>=0.9.0 (from wsproto>=0.14->trio-websocket~=0.9->selenium) \n\n  Downloading h11-0.14.0-py3-none-any.whl (58 kB) \n\n     ---------------------------------------- 58.3\/58.3 kB ? eta 0:00:00 \n\nInstalling collected packages: sortedcontainers, urllib3, sniffio, pysocks, pycparser, idna, h11, exceptiongroup, certifi, attrs, async-generator, wsproto, outcome, cffi, trio, trio-websocket, selenium \n\nSuccessfully installed async-generator-1.10 attrs-23.1.0 certifi-2023.5.7 cffi-1.15.1 exceptiongroup-1.1.1 h11-0.14.0 idna-3.4 outcome-1.2.0 pycparser-2.21 pysocks-1.7.1 selenium-4.10.0 sniffio-1.3.0 sortedcontainers-2.4.0 trio-0.22.0 trio-websocket-0.10.3 urllib3-2.0.3 wsproto-1.2.0 \n\n  \n\nC:\\Users\\user> \n\nC:\\Users\\user> py -m pip freeze \n\nasync-generator==1.10 \n\nattrs==23.1.0 \n\ncertifi==2023.5.7 \n\ncffi==1.15.1 \n\nexceptiongroup==1.1.1 \n\nh11==0.14.0 \n\nidna==3.4 \n\noutcome==1.2.0 \n\npycparser==2.21 \n\nPySocks==1.7.1 \n\nselenium==4.10.0 \n\nsniffio==1.3.0 \n\nsortedcontainers==2.4.0 \n\ntrio==0.22.0 \n\ntrio-websocket==0.10.3 \n\nurllib3==2.0.3 \n\nwsproto==1.2.0 \n\n  \n\nC:\\Users\\user> \n\nC:\\Users\\user> py -m pip show selenium \n\nName: selenium \n\nVersion: 4.10.0 \n\nPodsumowanie: \n\nHome-page: https:\/\/www.selenium.dev \n\nAuthor: \n\nAuthor-email: \n\nLicense: Apache 2.0 \n\nLocation: C:\\Users\\user\\AppData\\Roaming\\Python\\Python311\\site-packages \n\nRequires: certifi, trio, trio-websocket, urllib3 \n\nRequired-by: \n\n  \n\nC:\\Users\\user> \n\n  \n\n  \n\nor for WIN (IDE): \n\n  \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> py -m pip install selenium \n\nCollecting selenium \n\n  Using cached selenium-4.10.0-py3-none-any.whl (6.7 MB) \n\nCollecting urllib3[socks]&lt;3,>=1.26 (from selenium) \n\n  Using cached urllib3-2.0.3-py3-none-any.whl (123 kB) \n\nCollecting trio~=0.17 (from selenium) \n\n  Using cached trio-0.22.0-py3-none-any.whl (384 kB) \n\nCollecting trio-websocket~=0.9 (from selenium) \n\n  Using cached trio_websocket-0.10.3-py3-none-any.whl (17 kB) \n\nCollecting certifi>=2021.10.8 (from selenium) \n\n  Using cached certifi-2023.5.7-py3-none-any.whl (156 kB) \n\nCollecting attrs>=19.2.0 (from trio~=0.17->selenium) \n\n  Using cached attrs-23.1.0-py3-none-any.whl (61 kB) \n\nCollecting sortedcontainers (from trio~=0.17->selenium) \n\n  Using cached sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB) \n\nCollecting async-generator>=1.9 (from trio~=0.17->selenium) \n\n  Using cached async_generator-1.10-py3-none-any.whl (18 kB) \n\nCollecting idna (from trio~=0.17->selenium) \n\n  Using cached idna-3.4-py3-none-any.whl (61 kB) \n\nCollecting outcome (from trio~=0.17->selenium) \n\n  Using cached outcome-1.2.0-py2.py3-none-any.whl (9.7 kB) \n\nCollecting sniffio (from trio~=0.17->selenium) \n\n  Using cached sniffio-1.3.0-py3-none-any.whl (10 kB) \n\nCollecting cffi>=1.14 (from trio~=0.17->selenium) \n\n  Using cached cffi-1.15.1-cp311-cp311-win_amd64.whl (179 kB) \n\nCollecting exceptiongroup (from trio-websocket~=0.9->selenium) \n\n  Using cached exceptiongroup-1.1.1-py3-none-any.whl (14 kB) \n\nCollecting wsproto>=0.14 (from trio-websocket~=0.9->selenium) \n\n  Using cached wsproto-1.2.0-py3-none-any.whl (24 kB) \n\nCollecting pysocks!=1.5.7,&lt;2.0,>=1.5.6 (from urllib3[socks]&lt;3,>=1.26->selenium) \n\n  Using cached PySocks-1.7.1-py3-none-any.whl (16 kB) \n\nCollecting pycparser (from cffi>=1.14->trio~=0.17->selenium) \n\n  Using cached pycparser-2.21-py2.py3-none-any.whl (118 kB) \n\nCollecting h11&lt;1,>=0.9.0 (from wsproto>=0.14->trio-websocket~=0.9->selenium) \n\n  Using cached h11-0.14.0-py3-none-any.whl (58 kB) \n\nInstalling collected packages: sortedcontainers, urllib3, sniffio, pysocks, pycparser, idna, h11, exceptiongroup, certifi, attrs, async-generator, wsproto, outco \n\nme, cffi, trio, trio-websocket, selenium \n\nSuccessfully installed async-generator-1.10 attrs-23.1.0 certifi-2023.5.7 cffi-1.15.1 exceptiongroup-1.1.1 h11-0.14.0 idna-3.4 outcome-1.2.0 pycparser-2.21 pysoc \n\nks-1.7.1 selenium-4.10.0 sniffio-1.3.0 sortedcontainers-2.4.0 trio-0.22.0 trio-websocket-0.10.3 urllib3-2.0.3 wsproto-1.2.0 \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium>  \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> py -m pip list             \n\nPackage          Version \n\n---------------- -------- \n\nasync-generator  1.10 \n\nattrs            23.1.0 \n\ncertifi          2023.5.7 \n\ncffi             1.15.1 \n\nexceptiongroup   1.1.1 \n\nh11              0.14.0 \n\nidna             3.4 \n\noutcome          1.2.0 \n\npip              23.1.2 \n\npycparser        2.21 \n\nPySocks          1.7.1 \n\nselenium         4.10.0 \n\nsniffio          1.3.0 \n\nsortedcontainers 2.4.0 \n\ntrio             0.22.0 \n\ntrio-websocket   0.10.3 \n\nurllib3          2.0.3 \n\nwheel            0.38.4 \n\nwsproto          1.2.0 \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium> py -m pip show selenium \n\nName: selenium \n\nVersion: 4.10.0 \n\nPodsumowanie: \n\nHome-page: https:\/\/www.selenium.dev \n\nAuthor: \n\nAuthor-email: \n\nLicense: Apache 2.0 \n\nLocation: C:\\Users\\user\\PycharmProjects\\pythonSelenium\\venv\\Lib\\site-packages \n\nRequires: certifi, trio, trio-websocket, urllib3 \n\nRequired-by: \n\n(venv) PS C:\\Users\\user\\PycharmProjects\\pythonSelenium>  <\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Automatyzacja-test\u00f3w-\u2013-podsumowanie--\">Automatyzacja test\u00f3w \u2013 podsumowanie&nbsp;&nbsp;<\/h2>\n\n\n\n<p>Selenium obs\u0142uguje wiele j\u0119zyk\u00f3w programowania do automatyzacji test\u00f3w. W\u015br\u00f3d programist\u00f3w zar\u00f3wno Java, jak i Python zyska\u0142y rekordow\u0105 popularno\u015b\u0107. Pythona \u0142atwo si\u0119 nauczy\u0107, jego sk\u0142adnia jest czytelna, wi\u0119c je\u015bli dopiero zaczynasz programowa\u0107, u\u017cycie Selenium z Pythonem mo\u017ce by\u0107 interesuj\u0105ce pod wzgl\u0119dem automatyzacji. Natomiast Java i Selenium, szczeg\u00f3lnie w kontek\u015bcie integracji CI\/CD, dzi\u0119ki zastosowaniu odpowiednich narz\u0119dzi do budowania, doskonale wpisuj\u0105 si\u0119 w ca\u0142y proces wytwarzania oprogramowania. Odpowied\u017a na pytanie, czy wybra\u0107 Jav\u0119 czy Pythona, nale\u017cy do ciebie i b\u0119dzie zale\u017ce\u0107 od twojego do\u015bwiadczenia zawodowego i cel\u00f3w, jakie sobie stawiasz.&nbsp;&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"FAQ-Starting-points-for-Selenium-with-Java-or-Python-\">FAQ Pakiet startowy Selenium + Java lub Python&nbsp;<\/h2>\n\n\n\n<p>Oto tw\u00f3j pakiet startowy do automatyzacji test\u00f3w z Selenium + Java lub Selenium + Python, bez wzgl\u0119du na to, kt\u00f3rego z nich zdecydujesz si\u0119 u\u017cy\u0107.&nbsp;<\/p>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1689152093137\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Selenium \/ WebDriver z powi\u0105zaniami j\u0119zykowymi\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p><a href=\"https:\/\/selenium.dev\/downloads\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/selenium.dev\/downloads<\/a>\u00a0<br \/><a href=\"https:\/\/www.selenium.dev\/downloads\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/downloads\/<\/a>\u00a0<br \/><a href=\"https:\/\/github.com\/SeleniumHQ\/Selenium\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/Selenium<\/a>\u00a0<br \/><a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/getting_started\/install_library\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/documentation\/webdriver\/getting_started\/install_library\/<\/a>\u00a0<br \/><a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/getting_started\/first_script\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/documentation\/webdriver\/getting_started\/first_script\/<\/a>\u00a0<br \/><a href=\"https:\/\/www.selenium.dev\/selenium-ide\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/selenium-ide\/<\/a>\u00a0<br \/><a href=\"https:\/\/www.tutorialspoint.com\/what-is-selenese\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.tutorialspoint.com\/what-is-selenese<\/a>\u00a0<br \/><a href=\"https:\/\/www.javatpoint.com\/selenium-ide-commands\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.javatpoint.com\/selenium-ide-commands<\/a>\u00a0<br \/><a href=\"https:\/\/github.com\/SeleniumHQ\/selenium-ide\/releases\/latest\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/selenium-ide\/releases\/latest<\/a>\u00a0<br \/><a href=\"https:\/\/github.com\/SeleniumHQ\/selenium-ide\/releases\/tag\/4.0.0-alpha.40\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/selenium-ide\/releases\/tag\/4.0.0-alpha.40<\/a>\u00a0<br \/><a href=\"https:\/\/github.com\/SeleniumHQ\/selenium-ide\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/selenium-ide\/releases<\/a>\u00a0<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1689152100342\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Selenium i Python\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Download: <a href=\"https:\/\/pypi.org\/project\/selenium\/#history\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/selenium\/#history<\/a>\u00a0<br \/>API: <a href=\"https:\/\/seleniumhq.github.io\/selenium\/docs\/api\/py\/api.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/seleniumhq.github.io\/selenium\/docs\/api\/py\/api.html<\/a>\u00a0<br \/>Changelog: <a href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/blob\/trunk\/py\/CHANGES\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/selenium\/blob\/trunk\/py\/CHANGES<\/a>\u00a0<br \/>PyCharm: <a href=\"https:\/\/www.jetbrains.com\/pycharm\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.jetbrains.com\/pycharm\/<\/a>\u00a0<br \/>VSC: <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/code.visualstudio.com\/<\/a>\u00a0<br \/>VSC Python Extension: <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-python.python\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/marketplace.visualstudio.com\/items?itemName=ms-python.python<\/a>\u00a0<br \/>Aqua: <a href=\"https:\/\/www.jetbrains.com\/aqua\/download\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.jetbrains.com\/aqua\/download<\/a>\u00a0<br \/>Python: <a href=\"https:\/\/www.python.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.python.org\/<\/a>\u00a0<br \/>PIP: <a href=\"https:\/\/pip.pypa.io\/en\/stable\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pip.pypa.io\/en\/stable\/<\/a>\u00a0<br \/>Python Selenium Bindings: <a href=\"https:\/\/pypi.org\/project\/selenium\/#files\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/selenium\/#files<\/a>\u00a0\u00a0<br \/>Unittest: <a href=\"https:\/\/docs.python.org\/3\/library\/unittest.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.python.org\/3\/library\/unittest.html<\/a>\u00a0<br \/>Pytest: <a href=\"https:\/\/pypi.org\/project\/pytest\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/pytest<\/a>\u00a0<br \/>Pipenv: <a href=\"https:\/\/pypi.org\/project\/pipenv\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/pipenv\/<\/a>\u00a0<br \/>Venv: <a href=\"https:\/\/packaging.python.org\/en\/latest\/key_projects\/#venv\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/packaging.python.org\/en\/latest\/key_projects\/#venv<\/a>\u00a0<br \/>Virtualenv: <a href=\"https:\/\/pypi.org\/project\/virtualenv\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/virtualenv\/<\/a>\u00a0<br \/>Poetry: <a href=\"https:\/\/python-poetry.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/python-poetry.org\/<\/a>\u00a0<br \/>Bazel: <a href=\"https:\/\/bazel.build\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/bazel.build\/<\/a>\u00a0<br \/>Browser drivers: <a href=\"https:\/\/www.selenium.dev\/downloads\/#supported-browsers\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/downloads\/#supported-browsers<\/a>\u00a0<br \/>WebDriverManager: <a href=\"https:\/\/pypi.org\/project\/webdriver-manager\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/webdriver-manager\/<\/a>\u00a0<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1689152114800\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Selenium i Java\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Download: <a href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/selenium\/releases<\/a>\u00a0<br \/>API: <a href=\"https:\/\/seleniumhq.github.io\/selenium\/docs\/api\/Java\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/seleniumhq.github.io\/selenium\/docs\/api\/Java\/index.html<\/a>\u00a0<br \/>Changelog: <a href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/blob\/trunk\/Java\/CHANGELOG\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/selenium\/blob\/trunk\/Java\/CHANGELOG<\/a>\u00a0<br \/>IDEA: <a href=\"https:\/\/www.jetbrains.com\/idea\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.jetbrains.com\/idea\/ \u00a0 <\/a><br \/>VSC: <a href=\"https:\/\/code.visualstudio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/code.visualstudio.com\/<\/a>\u00a0<br \/>VSC CODING PACK for JAVA: <a href=\"https:\/\/aka.ms\/vscode-java-installer-win\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/aka.ms\/vscode-java-installer-win<\/a>\u00a0<br \/>VSC EXTENSION PACK for JAVA: <a href=\"https:\/\/code.visualstudio.com\/docs\/java\/extensions\" target=\"_blank\" rel=\"noreferrer noopener\">vscode:extension\/vscjava.vscode-java-pack\u00a0\u00a0<\/a><br \/>AQUA: <a href=\"https:\/\/www.jetbrains.com\/aqua\/download\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.jetbrains.com\/aqua\/download<\/a>\u00a0<br \/>JDK: <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase-downloads.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.oracle.com\/java\/technologies\/javase-downloads.html<\/a>\u00a0<br \/>MAVEN: <a href=\"https:\/\/maven.apache.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/maven.apache.org\/<\/a>\u00a0<br \/>GRADLE: <a href=\"https:\/\/gradle.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/gradle.org\/<\/a>\u00a0<br \/>JAVA SELENIUM BINDINGS: <a href=\"https:\/\/github.com\/SeleniumHQ\/selenium\/releases\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/selenium\/releases\/<\/a>\u00a0<br \/>JUNIT 4: <a href=\"https:\/\/junit.org\/junit4\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/junit.org\/junit4\/<\/a>\u00a0<br \/>JUNIT 5: <a href=\"https:\/\/junit.org\/junit5\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/junit.org\/junit5\/<\/a>\u00a0<br \/>TESTNG: <a href=\"https:\/\/testng.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/testng.org<\/a>\u00a0<br \/>BROWSER DRIVERS: <a href=\"https:\/\/www.selenium.dev\/downloads\/#supported-browsers\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/downloads\/#supported-browsers<\/a>\u00a0<br \/>WEBDRIVERMANAGER: <a href=\"https:\/\/bonigarcia.dev\/webdrivermanager\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/bonigarcia.dev\/webdrivermanager\/<\/a><\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1689152127734\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Selenium Grid i kontenery Docker\u00a0\u00a0<\/h3>\n<div class=\"rank-math-answer \">\n\n<p><a href=\"https:\/\/www.selenium.dev\/documentation\/grid\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/documentation\/grid\/<\/a>\u00a0<br \/><a href=\"https:\/\/www.selenium.dev\/documentation\/overview\/components\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.selenium.dev\/documentation\/overview\/components\/<\/a>\u00a0<br \/><a href=\"https:\/\/github.com\/SeleniumHQ\/docker-selenium\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/SeleniumHQ\/docker-selenium<\/a>\u00a0\u00a0<br \/><a href=\"https:\/\/hub.docker.com\/r\/selenium\/standalone-chrome\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/hub.docker.com\/r\/selenium\/standalone-chrome<\/a>\u00a0\u00a0<br \/><a href=\"https:\/\/www.browserstack.com\/guide\/run-selenium-tests-in-docker\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.browserstack.com\/guide\/run-selenium-tests-in-docker<\/a>\u00a0\u00a0<br \/><a href=\"https:\/\/qaautomation.expert\/2022\/04\/12\/run-selenium-tests-in-gitlab-ci-cd\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/qaautomation.expert\/2022\/04\/12\/run-selenium-tests-in-gitlab-ci-cd\/<\/a>\u00a0<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u015awiat IT i QA szybko si\u0119 zmienia, a popularno\u015b\u0107 niekt\u00f3rych z narz\u0119dzi mija. Kt\u00f3re wybra\u0107? Przeczytaj artyku\u0142 i poznaj zalety oraz wady \u0142\u0105czenia Selenium z dwoma obecnie najpopularniejszymi j\u0119zykami programowania: Jav\u0105 i Pythonem.<\/p>\n","protected":false},"author":149,"featured_media":29816,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":196,"footnotes":""},"categories":[1,582],"tags":[562],"offering":[522],"class_list":["post-29808","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-qa","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/149"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=29808"}],"version-history":[{"count":9,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29808\/revisions"}],"predecessor-version":[{"id":33812,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29808\/revisions\/33812"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/29816"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=29808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=29808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=29808"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=29808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}