{"id":46068,"date":"2023-07-20T14:03:58","date_gmt":"2023-07-20T12:03:58","guid":{"rendered":"https:\/\/qualityminds.com\/?p=46068"},"modified":"2024-09-30T15:34:11","modified_gmt":"2024-09-30T13:34:11","slug":"framework-testow-w-selenium-z-paralelizacja-obsluga-wielu-przegladarek-i-internacjonalizacja","status":"publish","type":"post","link":"https:\/\/qualityminds.com\/pl\/framework-testow-w-selenium-z-paralelizacja-obsluga-wielu-przegladarek-i-internacjonalizacja\/","title":{"rendered":"Framework test\u00f3w w Selenium z paralelizacj\u0105, obs\u0142ug\u0105 wielu przegl\u0105darek i internacjonalizacj\u0105"},"content":{"rendered":"\n<section id=\"block-6679271531c50\"  class=\"hero-section template11\">\n\t<div class=\"bg\">\n\t\t\t<\/div>\n\t<div class=\"container\">\n\t\t<div class=\"hero-section__wrapper flex flex-wrap justify-between\">\n\t\t\t<div class=\"hero-section__description\">\n\t\t\t\t<div class=\"text-element-wrapper\">\n\t\t\t\t\t<div class=\"text-element\">\n\n<h1 class=\"wp-block-heading has-text-align-left\"><strong>Framework test\u00f3w w Selenium z paralelizacj\u0105, obs\u0142ug\u0105 wielu przegl\u0105darek i internacjonalizacj\u0105<\/strong><\/h1>\n\n<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"hero-section__img\">\n\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"2560\" height=\"1707\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-scaled.jpg\" class=\"attachment-full size-full\" alt=\"\" loading=\"eager\" srcset=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-scaled.jpg 2560w, https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-300x200.jpg 300w, https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-1024x683.jpg 1024w, https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-768x512.jpg 768w, https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-1536x1024.jpg 1536w, https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-2048x1365.jpg 2048w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\t\t<\/div>\n\t<\/div>\n\n\t<div class=\"social\">\n\t\t<div class=\"container\">\n\t\t\t<div class=\"social-wrapper flex items-center\">\n\t\t\t\t\u015aled\u017a nas\t\t\t\t\t<ul class=\"no-list no-margin social-list\">\n\t\t\t\t\t<li>\n\t\t\t\t<a href=\"https:\/\/www.linkedin.com\/company\/qualityminds-gmbh\/\" target=\"_blank\" aria-label=\"share on social media\" rel=\"noopener\">\n\t\t\t\t\t<img decoding=\"async\" width=\"29\" height=\"29\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/06\/linkedin.svg\" class=\"attachment-full size-full\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t<\/a>\n\t\t\t<\/li>\n\t\t\t\t\t<li>\n\t\t\t\t<a href=\"https:\/\/de-de.facebook.com\/QualityMindsGmbH\/\" target=\"_blank\" aria-label=\"share on social media\" rel=\"noopener\">\n\t\t\t\t\t<img decoding=\"async\" width=\"29\" height=\"29\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/06\/facebook.svg\" class=\"attachment-full size-full\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t<\/a>\n\t\t\t<\/li>\n\t\t\t\t\t<li>\n\t\t\t\t<a href=\"https:\/\/www.xing.com\/pages\/qualitymindsgmbh\" target=\"_blank\" aria-label=\"share on social media\" rel=\"noopener\">\n\t\t\t\t\t<img decoding=\"async\" width=\"29\" height=\"29\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/09\/xing_icon.svg\" class=\"attachment-full size-full\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t<\/a>\n\t\t\t<\/li>\n\t\t\t<\/ul>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/section>\n\n\n\t<section id=\"block-6679271531ca5\"  class=\"single-post-section\">\n\t\t<div class=\"container\">\n\t\t\t<div class=\"content\">\n\t\t\t\t<div class=\"single-post-main\">\n\t\t\t\t\t<div class=\"text-element\">\n\n<h2 class=\"wp-block-heading\">W poni\u017cszym artykule postaram si\u0119 przybli\u017cy\u0107 odpowied\u017a na trzy pytania, kt\u00f3re cz\u0119sto pojawiaj\u0105 si\u0119 podczas pisania test\u00f3w:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Jak napisa\u0107 framework z ca\u0142kowicie niezale\u017cnymi testami, kt\u00f3re mo\u017cna uruchamia\u0107 r\u00f3wnolegle w dowolnej konfiguracji (a nawet zagnie\u017cd\u017ca\u0107 paralelizacj\u0119)? <\/li>\n\n\n\n<li>Jak doda\u0107 wsparcie dla r\u00f3\u017cnych przegl\u0105darek? <\/li>\n\n\n\n<li>Jak doda\u0107 wsparcie dla r\u00f3\u017cnych wersji j\u0119zykowych (lokalizacji)? <\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ca\u0142y kod znajduje si\u0119 w tym <a href=\"https:\/\/github.com\/QualityMinds\/SeleniumParallel\" target=\"_blank\" rel=\"noopener\">repozytorium<\/a> i podzielony jest na 8 krok\u00f3w. Zak\u0142adam, \u017ce czytelniczka lub czytelnik zna Jav\u0119 na poziomie juniora, oraz ma poj\u0119cie o automatyzacji test\u00f3w i Selenium, poniewa\u017c, aby zachowa\u0107 przejrzysto\u015b\u0107, nie b\u0119d\u0119 t\u0142umaczy\u0142 ka\u017cdej rzeczy od podstaw, a skupi\u0119 si\u0119 na tytu\u0142owych zagadnieniach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Za\u0142\u00f3\u017cmy, \u017ce dostali\u015bmy zadanie przetestowania strony internetowej naszego pracodawcy. Aby unikn\u0105\u0107 monotonnej pracy, zautomatyzujemy to zadanie. Strona jest dost\u0119pna w trzech j\u0119zykach &#8211; angielskim, niemieckim i polskim i najcz\u0119\u015bciej otwierana jest na trzech przegl\u0105darkach &#8211; Chrome, Edge i Firefox. By\u0142oby \u015bwietnie, gdyby\u015bmy mogli codziennie rano uruchamia\u0107 automatyzacj\u0119 za pomoc\u0105 cron-a i po przyj\u015bciu do pracy wiedzie\u0107, co dzia\u0142a, a co nie. W tym celu musimy doda\u0107 obs\u0142ug\u0119 plik\u00f3w konfiguracyjnych lub interfejsu wiersza polece\u0144 (<span style=\"font-family: courier;\">CLI<\/span>). Przyda\u0142by si\u0119 r\u00f3wnie\u017c tryb bezinterfejsowy (<span style=\"font-family: courier;\">headless<\/span>), bo zasoby s\u0105 kosztowne. Kod napiszemy w Javie z wykorzystaniem biblioteki Selenium, bo tak lubi autor. Nasz pracodawca chce mie\u0107 pewno\u015b\u0107, \u017ce przycisk \u201eKontakt\u201d w podmenu \u201eAutomatyzacja Test\u00f3w\u201d dzia\u0142a poprawnie. Musimy tak\u017ce sprawdzi\u0107, czy wersja polska przekierowuje na polskie adresy e-mail, a wersje angielska i niemiecka na odpowiednie adresy w tych j\u0119zykach. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podsumowuj\u0105c, musimy stworzy\u0107 framework, kt\u00f3ry obs\u0142u\u017cy przegl\u0105darki Chrome, Edge i Firefox oraz b\u0119dzie mo\u017cna go uruchomi\u0107 na platformie GitHub Actions (lub innym \u015brodowisku wykonawczym). Testy b\u0119d\u0105 niezale\u017cne od siebie i mo\u017cliwe b\u0119dzie ich r\u00f3wnoczesne uruchamianie na wielu maszynach, w zale\u017cno\u015bci od naszych mo\u017cliwo\u015bci. W przysz\u0142o\u015bci rozwa\u017cam dodanie rozszerze\u0144 lub ulepsze\u0144 do tego kursu, kt\u00f3re obejm\u0105 obs\u0142ug\u0119 zmiennych \u015brodowiskowych, Dockera, Selenium Grid oraz innych interesuj\u0105cych funkcji. Do napisania kodu wykorzysta\u0142em IntelliJ Ultimate. Ca\u0142y kod jest dost\u0119pny na platformie GitHub, a proces tworzenia kodu zosta\u0142 podzielony na kolejne ga\u0142\u0119zie, zaczynaj\u0105c od 001 i ko\u0144cz\u0105c na 008.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stw\u00f3rzmy zatem nowy projekt w IntelliJ.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/image-2023-6-23_10-41-42-2.png\" alt=\"\" class=\"wp-image-33587\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Zacznijmy od utworzenia nowego projektu w IntelliJ. Ja b\u0119d\u0119 u\u017cywa\u0142 Gradle i j\u0119zyka Kotlin jako DSL, poniewa\u017c nie przepadam za Groovym. Po klikni\u0119ciu przycisku <span style=\"font-family: courier;\">Create<\/span>, IntelliJ utworzy dla nas szkielet projektu. Przy okazji warto wspomnie\u0107, \u017ce mam nawyk umieszczania wszystkich test\u00f3w automatycznych i kodu pomocniczego w sekcji <span style=\"font-family: courier;\">test<\/span> projektu (a nie w <span style=\"font-family: courier;\">main<\/span>). W\u0142a\u015bciwie nie ma to znaczenia, gdzie trzymamy te testy, poniewa\u017c nie b\u0119dziemy budowa\u0107 tego projektu ani tworzy\u0107 \u017cadnych archiw\u00f3w. Musimy tylko pami\u0119ta\u0107, \u017ceby oznaczy\u0107 wszystkie zale\u017cno\u015bci jako \u201etest\u201d i propagowa\u0107 <span style=\"font-family: courier;\">JVM options<\/span> do zadania \u201etest\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 1: konfiguracja zale\u017cno\u015bci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zajmijmy si\u0119 teraz plikiem <span style=\"font-family: courier;\">build.gradle.kts<\/span> (nie b\u0119dziemy go wi\u0119cej zmienia\u0107, dlatego ju\u017c teraz wrzucimy wszystkie potrzebne zmiany). Poni\u017cej wyja\u015bni\u0119 kilka interesuj\u0105cych linijek. \n<br><br>\n<script src=\"https:\/\/gist.github.com\/rafalmich\/f6fbfd47fa6ae423b2e27b0848a1f22e.js\"><\/script>\n<br><br>\nJe\u015bli chodzi o zale\u017cno\u015bci, to u\u017cyjemy <span style=\"font-family: courier;\">Selenium<\/span> i <span style=\"font-family: courier;\">TestNG<\/span> oraz <span style=\"font-family: courier;\">WebDriverManager<\/span> do konfigurowania Drivera. <span style=\"font-family: courier;\">AssertJ<\/span> do asercji, <span style=\"font-family: courier;\">Logback<\/span> i <span style=\"font-family: courier;\">SLF4J<\/span> do logowania i <span style=\"font-family: courier;\">Jackson<\/span> do czytania plik\u00f3w <span style=\"font-family: courier;\">json<\/span> (w kt\u00f3rym b\u0119d\u0105 stringi w 3 j\u0119zykach, z kt\u00f3rymi por\u00f3wnamy tre\u015b\u0107 na stronie). Do ca\u0142o\u015bci dodamy <span style=\"font-family: courier;\">Lombok<\/span> dla wygody. \n<br><br>\nLinijki 42 \u2013 57, to konfiguracja test\u00f3w, w linijce 44 piszemy, gdzie <span style=\"font-family: courier;\">TestNG<\/span> ma szuka\u0107 pliku konfiguracyjnego \u2013 w folderze <span style=\"font-family: courier;\">testng<\/span>. Zostawiamy sobie mo\u017cliwo\u015b\u0107 zmodyfikowania nazwy pliku, korzystaj\u0105c z properties \u2013 <span style=\"font-family: courier;\">suiteFile<\/span> \u2013 kt\u00f3re domy\u015blnie ma mie\u0107 warto\u015b\u0107 <span style=\"font-family: courier;\">testng.xml<\/span>. \n<br><br>\nLinijka 47 jest potrzeba, aby <span style=\"font-family: courier;\">JVM options<\/span> by\u0142y widoczne tak\u017ce dla task\u00f3w <span style=\"font-family: courier;\">test<\/span>, inaczej nie da\u0142oby si\u0119 przekazywa\u0107 parametr\u00f3w korzystaj\u0105c z <span style=\"font-family: courier;\">CLI<\/span>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 2: podstawowe klasy <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Za nami konfigurowanie zale\u017cno\u015bci. Teraz zajmiemy si\u0119 uruchomieniem pierwszego testu i dodaniem niezb\u0119dnych klas, o kt\u00f3re oparty b\u0119dzie framework.  \n<br><br>\nZacznijmy od stworzenia package <span style=\"font-family: courier;\">base<\/span>, a w nim klasy <span style=\"font-family: courier;\">AutomationException<\/span> \u2013 wrappera dla <span style=\"font-family: courier;\">RuntimeExpection<\/span> oraz enum\u00f3w <span style=\"font-family: courier;\">BrowserType<\/span> z warto\u015bciami <span style=\"font-family: courier;\">CHROME<\/span>, <span style=\"font-family: courier;\">FIREFOX<\/span> i <span style=\"font-family: courier;\">EDGE<\/span> oraz <span style=\"font-family: courier;\">I18n<\/span> z <span style=\"font-family: courier;\">ENGLISH<\/span>, <span style=\"font-family: courier;\">GERMAN<\/span>, <span style=\"font-family: courier;\">POLISH<\/span>.  \n<br><br>\nNast\u0119pnie skonfigurujmy <span style=\"font-family: courier;\">WebDriverManager<\/span>, aby mie\u0107 z g\u0142owy samodzielne zarz\u0105dzanie driverem. Logik\u0119 umie\u015b\u0107my w package <span style=\"font-family: courier;\">wdm<\/span>. Zacznijmy od klasy <span style=\"font-family: courier;\">DriverManagerFactory<\/span> z jedn\u0105 metod\u0105 <span style=\"font-family: courier;\">DriverManager getManager()<\/span>\n<br><br>\n<script src=\"https:\/\/gist.github.com\/rafalmich\/9e172c4085cf1625c214a4913a477f38.js\"><\/script>\n<br><br>\nPoniewa\u017c b\u0119dziemy korzysta\u0107 z trzech r\u00f3\u017cnych przegl\u0105darek, potrzebujemy trzy implementacje naszego interfejsu, tutaj poka\u017c\u0119 implementacje dla Chrome, kod dla innych przegl\u0105darek dost\u0119pny jest w repozytorium na GitHubie: \n<br><br>\n<script src=\"https:\/\/gist.github.com\/rafalmich\/12ad72d507075c814374fdd230889cb3.js\"><\/script>\n<br><br>\nA poni\u017cej kod interfejsu <span style=\"font-family: courier;\">DriverManager<\/span>: \n<br><br>\n<script src=\"https:\/\/gist.github.com\/rafalmich\/7450b4f7656f86aa4e6c07c1fe823738.js\"><\/script>\n<br><br>\nTeraz nadchodzi chyba najwa\u017cniejszy moment w tworzeniu ca\u0142ego frameworka: \n<br><br>\nPo zaimplementowaniu trzech interfejs\u00f3w, mamy dzia\u0142aj\u0105cy <span style=\"font-family: courier;\">WebDriverManager<\/span>. Teraz stw\u00f3rzmy klas\u0119 <span style=\"font-family: courier;\">BaseTest<\/span>, kt\u00f3ra b\u0119dzie klas\u0105 bazow\u0105 dla wszystkich klas test\u00f3w. Przy projektowaniu tej klasy musimy si\u0119 chwil\u0119 zastanowi\u0107 nad jej struktur\u0105. Poniewa\u017c chcemy, aby nasz framework by\u0142 w stanie uruchamia\u0107 ka\u017cd\u0105 metod\u0119 testow\u0105 r\u00f3wnolegle, musimy zadba\u0107 o to, aby nie by\u0142y one od siebie w \u017caden spos\u00f3b zale\u017cne i aby stan \u017cadnego testu nie zale\u017ca\u0142 od wyniku poprzedniego. Ponadto, przed ka\u017cdym testem powinni\u015bmy tworzy\u0107 now\u0105 instancj\u0119 drivera, a po ka\u017cdym te\u015bcie go wy\u0142\u0105cza\u0107. Dzi\u0119ki temu ograniczymy g\u0142\u00f3wnie problemy techniczne zwi\u0105zane z r\u00f3wnoleg\u0142ym wykonywaniem test\u00f3w. W zwi\u0105zku z tym, w klasie <span style=\"font-family: courier;\">BaseTest<\/span> skorzystamy z adnotacji <span style=\"font-family: courier;\">@BeforeMethod<\/span> i <span style=\"font-family: courier;\">@AfterMethod<\/span> do tworzenia i niszczenia instancji drivera. \n<br><br>\nDrugim istotnym aspektem jest mo\u017cliwo\u015b\u0107 parametryzacji test\u00f3w. Musimy w jaki\u015b spos\u00f3b przekaza\u0107 naszemu narz\u0119dziu informacje o przegl\u0105darce, na kt\u00f3rej chcemy uruchamia\u0107 testy oraz czy ma by\u0107 u\u017cywany tryb <span style=\"font-family: courier;\">headless<\/span> czy nie. Domy\u015blnie korzystamy z pliku suite file, kt\u00f3rego lokalizacj\u0119 i nazw\u0119 ustalili\u015bmy jako <span style=\"font-family: courier;\">testng\/testng.xml<\/span> w kroku 001. Dodatkowo, by\u0142oby dobrze, gdyby\u015bmy mogli nadpisywa\u0107 te parametry, podaj\u0105c je za pomoc\u0105 <span style=\"font-family: courier;\">CLI<\/span> lub jako <span style=\"font-family: courier;\">JVM options<\/span> w konfiguracji IntelliJ. Na razie skupmy si\u0119 jednak na dostarczeniu parametr\u00f3w z pliku XML. W kolejnych krokach dodamy pozosta\u0142e funkcjonalno\u015bci. \n<br><br>\nAby dostarczy\u0107 parametry z pliku XML, mo\u017cemy u\u017cy\u0107 mechanizmu <span style=\"font-family: courier;\">TestNG<\/span>, kt\u00f3ry umo\u017cliwia przekazywanie parametr\u00f3w z plik\u00f3w XML bezpo\u015brednio do metod testowych. Mo\u017cemy zdefiniowa\u0107 te parametry w pliku suite file (<span style=\"font-family: courier;\">testng.xml<\/span>) i odczyta\u0107 je w naszych testach, o czym za chwil\u0119. Na razie stw\u00f3rzmy klas\u0119 <span style=\"font-family: courier;\">BaseTest<\/span>, kt\u00f3ra b\u0119dzie mog\u0142a odczyta\u0107 te parametry: \n<br><br>\n<script src=\"https:\/\/gist.github.com\/rafalmich\/7bb44d5ef4a48f042d00b789d1b4c20d.js\"><\/script>\n<br><br>\nW linii 6 deklarujemy pole <span style=\"font-family: courier;\">`ThreadLocal<webdriver> driver`<\/webdriver><\/span>, kt\u00f3re jest niezb\u0119dne do prawid\u0142owej paralelizacji. \n<br><br>\nW linii 24 deklarujemy metod\u0119 <span style=\"font-family: courier;\">`before`<\/span>, kt\u00f3ra pobiera dwa opcjonalne parametry: <span style=\"font-family: courier;\">`browser`<\/span> i <span style=\"font-family: courier;\">`headless`<\/span>, zgodnie z konfiguracj\u0105. Adnotacja z linii 22 (<span style=\"font-family: courier;\">`@Parameters`<\/span>) odpowiada za przekazywanie tych parametr\u00f3w, a adnotacja <span style=\"font-family: courier;\">`@Optional`<\/span> w sygnaturze metody sprawia, \u017ce je\u015bli nie zostan\u0105 dostarczone argumenty, framework b\u0119dzie nadal dzia\u0142a\u0142 &#8211; musimy tylko ustawi\u0107 warto\u015bci domy\u015blne, o czym dowiemy si\u0119 w kolejnych krokach. \n<br><br>\nW linii 25 inicjalizujemy driver zgodnie z ustawieniami odczytanymi z pliku XML. \n<br><br>\n<script src=\"https:\/\/gist.github.com\/rafalmich\/130c96645d3c5d620c9baaee7df6d841.js\"><\/script>\n<br><br>\nNast\u0119pnie tworzymy plik <span style=\"font-family: courier;\">testng.xml<\/span> w katalogu <span style=\"font-family: courier;\">testng<\/span> oraz package <span style=\"font-family: courier;\">tests<\/span> z klasa <span style=\"font-family: courier;\">ExampleTest<\/span> dziedzicz\u0105c\u0105 z <span style=\"font-family: courier;\">BaseTest<\/span>, w kt\u00f3rej zrobimy jedn\u0105 metod\u0119 <span style=\"font-family: courier;\">exampleTest<\/span> otwieraj\u0105c\u0105 nasz\u0105 stron\u0119 \u2013 <span style=\"font-family: courier;\">driver().get(\u201ehttps:\/\/qualityminds.com\u201d<\/span>; \n<br><br>\nPlik XML jest skonfigurowany tak, by uruchomi\u0107 nasz\u0105 metod\u0119 <span style=\"font-family: courier;\">exampleTest<\/span> raz na 2 r\u00f3\u017cnych przegl\u0105darkach. Klikamy prawym na plik <span style=\"font-family: courier;\">testng.xml<\/span> i wciskamy run, b\u0105d\u017a te\u017c wpisujemy w terminal: <span style=\"font-family: courier;\">.\/gradlew clean test<\/span>.  \n<br><br>\nZach\u0119cam do dopisania przyk\u0142adowych test\u00f3w do klasy <span style=\"font-family: courier;\">ExampleTest<\/span>, stworzenia dodatkowej klasy z testami oraz eksperymentowania z liczb\u0105 <span style=\"font-family: courier;\">thread-count<\/span> oraz parametrem <span style=\"font-family: courier;\">parallel=\u201dmethods\u201d<\/span> (dost\u0119pne to <span style=\"font-family: courier;\">tests<\/span>, <span style=\"font-family: courier;\">classes<\/span>, <span style=\"font-family: courier;\">methods<\/span>, <span style=\"font-family: courier;\">instances<\/span>, warto\u015bci <span style=\"font-family: courier;\">true<\/span> i <span style=\"font-family: courier;\">false<\/span> s\u0105 deprecated).  \n<br><br>\nJe\u015bli z jakiego\u015b powodu otrzymujemy b\u0142\u0105d przy pr\u00f3bie uruchomienia pliku XML, mo\u017cemy post\u0119powa\u0107 wed\u0142ug nast\u0119puj\u0105cych krok\u00f3w: \n<br><br>\nKlikamy na przycisk &#8222;<span style=\"font-family: courier;\">Edit Configuration<\/span>&#8221; obok przycisku &#8222;<span style=\"font-family: courier;\">Play<\/span>&#8221; na g\u00f3rnym panelu <span style=\"font-family: courier;\">IntelliJ<\/span>. \n<br><br>\nW oknie konfiguracji szukamy opcji &#8222;<span style=\"font-family: courier;\">Use classpath or module<\/span>&#8222;. \n<br><br>\nWybieramy opcj\u0119 &#8222;<span style=\"font-family: courier;\">seleniumframework.test<\/span>&#8221; (je\u015bli nazwali\u015bmy projekt &#8222;<span style=\"font-family: courier;\">seleniumframework<\/span>&#8222;). \n<br><br>\nDzi\u0119ki temu ustawieniu b\u0119dziemy korzysta\u0107 z odpowiednich \u015bcie\u017cek i modu\u0142\u00f3w podczas uruchamiania test\u00f3w, co powinno rozwi\u0105za\u0107 problem z b\u0142\u0119dem zwi\u0105zanym z plikiem XML. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W nast\u0119pnym artykule przybli\u017c\u0119 Wam nast\u0119pne kroki, zaczynaj\u0105c od konfiguracji logowania. Zapraszam Was do lektury!<\/p>\n\n<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"single-post-aside\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"post-author-wr\">\n\t\t\t\t\t\t\t<div class=\"author-img\">\n\t\t\t\t\t\t\t\t<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/be24f7a5f0d4999b17910d6208d7a4e726fc3e94e1131257b63d9069f8b5926f?s=96&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/be24f7a5f0d4999b17910d6208d7a4e726fc3e94e1131257b63d9069f8b5926f?s=192&#038;d=mm&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-info text-element\">\n\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\tNapisane przez:\t\t\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t\t\t\t<p class=\"author-name\">\n\t\t\t\t\t\t\t\t\t\tAdministrator QualityMinds\t\t\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"aside-cta\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"icon-wr\">\n\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"76\" height=\"76\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/05\/Capa_1.svg\" class=\"attachment-full size-full\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"text-element\">\n\t\t\t\t\t\t\t\t\t<p class=\"p1\">Chcesz om\u00f3wi\u0107 swoje osobiste obawy dotycz\u0105ce transformacji cyfrowej?<\/p>\n<p class=\"p1\">Skontaktuj si\u0119 z nami w celu uzyskania bezp\u0142atnej i niewi\u0105\u017c\u0105cej konsultacji:<\/p>\n<p><a href=\"mailto:hello@qualityminds.de\">hello@qualityminds.de<\/a><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"similar-posts\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"heading\">\n\t\t\t\t\t\t\t\t\tDalszy wk\u0142ad\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ul class=\"no-list no-margin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/qualityminds.com\/pl\/ai-navigator-2024-jestesmy-jego-czescia\/\">AI Navigator 2024 &#8211; Jeste\u015bmy jego cz\u0119\u015bci\u0105\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/qualityminds.com\/pl\/framework-testow-w-selenium-z-paralelizacja-obsluga-wielu-przegladarek-i-internacjonalizacja-czesc-2\/\">Framework test\u00f3w w Selenium z paralelizacj\u0105, obs\u0142ug\u0105 wielu przegl\u0105darek i internacjonalizacj\u0105 &#8211; cz\u0119\u015b\u0107 2\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/qualityminds.com\/pl\/thoughts-on-using-chatgpt-as-a-software-developer\/\">Thoughts on using ChatGPT as a software developer\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t<\/div>\n\n\t\t\t\t\t\t\t<div class=\"social-sharing\">\n\t\t\t\t\t<p class=\"no-margin\">Udzia\u0142\t\t\t\t\t<\/p>\n\t\t\t\t\t\n<ul class=\"no-list no-margin\">\n\t<li>\n\t\t<a href=\"https:\/\/www.linkedin.com\/feed\/?shareActive=true&#038;text=https:\/\/qualityminds.com\/pl\/thoughts-on-using-chatgpt-as-a-software-developer\/\" class=\"linkedin\" target=\"_blank\" aria-label=\"Udost\u0119pnij na LinkedIn\"><\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"https:\/\/www.facebook.com\/sharer\/sharer.php?u=https:\/\/qualityminds.com\/pl\/thoughts-on-using-chatgpt-as-a-software-developer\/\" class=\"facebook\" target=\"_blank\" aria-label=\"Udost\u0119pnij na Facebooku\"><\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"https:\/\/www.xing.com\/spi\/shares\/new?url=https:\/\/qualityminds.com\/pl\/thoughts-on-using-chatgpt-as-a-software-developer\/\" class=\"xing\" target=\"_blank\" aria-label=\"Udost\u0119pnij na Xing\"><\/a>\n\t<\/li>\n<\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t<\/section>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":67,"featured_media":46067,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[26,489,491,493],"tags":[216,347,300,421],"class_list":["post-46068","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-news-pl","category-qm-stories-pl","category-testing-qa-pl","tag-software-testing-pl","tag-testing-pl","tag-testowanie","tag-tworzenie-oprogramowania-2"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/qualityminds.com\/wp-content\/uploads\/2023\/07\/6502426-1-scaled-1-scaled.jpg","_links":{"self":[{"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/posts\/46068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/users\/67"}],"replies":[{"embeddable":true,"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/comments?post=46068"}],"version-history":[{"count":9,"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/posts\/46068\/revisions"}],"predecessor-version":[{"id":59670,"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/posts\/46068\/revisions\/59670"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/media\/46067"}],"wp:attachment":[{"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/media?parent=46068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/categories?post=46068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qualityminds.com\/pl\/wp-json\/wp\/v2\/tags?post=46068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}