{"id":20073,"date":"2023-03-02T05:00:00","date_gmt":"2023-03-02T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=20073"},"modified":"2025-02-21T15:04:11","modified_gmt":"2025-02-21T14:04:11","slug":"automatyzacja-testow-aplikacji-desktopowej-w-systemie-windows-przy-uzyciu-selenium-w-jezyku-python","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/automatyzacja-testow-aplikacji-desktopowej-w-systemie-windows-przy-uzyciu-selenium-w-jezyku-python\/","title":{"rendered":"Automatyzacja test\u00f3w aplikacji desktopowej w systemie Windows przy u\u017cyciu Selenium w j\u0119zyku Python"},"content":{"rendered":"\n<p>Zapewne wszyscy testerzy automatyzuj\u0105cy wiedz\u0105, czym jest Selenium \u2013 je\u015bli nie z do\u015bwiadczenia, to na pewno ze s\u0142yszenia. Nic w tym dziwnego, gdy\u017c Selenium, a w\u0142a\u015bciwie Selenium WebDriver, to bez w\u0105tpienia najbardziej znana biblioteka do automatyzacji test\u00f3w aplikacji webowych, wykorzystywana z wi\u0119kszo\u015bci\u0105 wsp\u00f3\u0142czesnych j\u0119zyk\u00f3w programowania. No w\u0142a\u015bnie \u2013 aplikacji webowych.<\/p>\n\n\n\n<p>Ale czy mo\u017cna za pomoc\u0105 tego narz\u0119dzie <strong>pisa\u0107 i wykonywa\u0107 testy na aplikacjach desktopowych w systemach Windows?<\/strong> Oczywi\u015bcie! Nic prostszego. Jak w takim razie zacz\u0105\u0107? Odpowied\u017a znajdziecie w niniejszym artykule.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Konfiguracja \u015brodowiska<\/strong><\/h2>\n\n\n\n<p>Pierwszym krokiem jest skonfigurowanie \u015brodowiska, na kt\u00f3rym uruchamiane b\u0119d\u0105 testy. Z racji tego, \u017ce artyku\u0142 dotyczy testowania w j\u0119zyku Python, zak\u0142adam, \u017ce zosta\u0142 on ju\u017c zainstalowany na komputerze.<\/p>\n\n\n\n<p>Na wst\u0119pie nale\u017cy \u015bci\u0105gn\u0105\u0107 i zainstalowa\u0107 Windows Application Driver, czyli oficjalny serwis wspieraj\u0105cy testowanie UI aplikacji w systemie Windows. Mo\u017cna to zrobi\u0107 z oficjalnego <a href=\"https:\/\/github.com\/Microsoft\/WinAppDriver\/releases\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >repozytorium projektu, wybieraj\u0105c najnowsz\u0105 stabiln\u0105 wersj\u0119<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/1.png\"><img decoding=\"async\" width=\"808\" height=\"321\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/1.png\" alt=\"Instalacja Windows Application Driver\" class=\"wp-image-20074\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/1.png 808w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/1-300x119.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/1-768x305.png 768w\" sizes=\"(max-width: 808px) 100vw, 808px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Instalacja Windows Application Driver<\/figcaption><\/figure>\n\n\n\n<p>Powinni\u015bmy pami\u0119ta\u0107 o tym, aby <strong>w\u0142\u0105czy\u0107 tryb deweloperski<\/strong> w systemie Windows.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/2.png\"><img decoding=\"async\" width=\"1018\" height=\"798\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/2.png\" alt=\"W\u0142\u0105czanie tryby deweloperskiego \" class=\"wp-image-20076\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/2.png 1018w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/2-300x235.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/2-768x602.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/2-370x290.png 370w\" sizes=\"(max-width: 1018px) 100vw, 1018px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 W\u0142\u0105czanie tryby deweloperskiego<\/figcaption><\/figure>\n\n\n\n<p>Nast\u0119pnie, konieczne jest zainstalowanie zewn\u0119trznej biblioteki Appium-Python-Client, dodaj\u0105cej protok\u00f3\u0142 WebDriver oraz podstawowe komendy Appium.<\/p>\n\n\n\n<p>Kolejny krok stanowi instalacja Selenium. Wa\u017cnym jest, aby zainstalowa\u0107 odpowiednie wersje obu tych bibliotek. WinAppDriver komunikuje si\u0119 z selenium\/appium-python-client za pomoc\u0105 protoko\u0142u JSON Wire, podczas gdy najnowsze wersje tych bibliotek u\u017cywaj\u0105 do komunikacji protoko\u0142u W3C. Biblioteki te mo\u017cna zainstalowa\u0107 za pomoc\u0105 domy\u015blnego systemu zarz\u0105dzania pakietami dla \u015brodowiska j\u0119zyka Python:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npip install selenium==3.141.0\n\tpip install appium-python-client==1.3.0\n\n<\/pre><\/div>\n\n\n<p>Tak przygotowane \u015brodowisko gotowe jest do rozpocz\u0119cia pisania kodu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przygotowanie uchwytu<\/strong><\/h2>\n\n\n\n<p>W przypadku testowania aplikacji webowych naszym uchwytem jest zazwyczaj sama przegl\u0105darka internetowa. Do tego celu u\u017cywamy m.in.: ChromeDrivera czy FirefoxDrivera.\u00a0To w\u0142a\u015bnie na takim uchwycie tworzymy swoj\u0105 zmienn\u0105, na kt\u00f3rej nast\u0119pnie wykonywane s\u0105 wszystkie kroki testu, np.:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfrom selenium import webdriver\nfrom webdriver_manager.chrome import ChromeDriverManager\n\ndriver = webdriver.Chrome(ChromeDriverManager().install())\ndriver.get(&#039;http:\/\/www.google.com&#039;)\n\n<\/pre><\/div>\n\n\n<p>W naszym przypadku uchwytem (handlerem) nie b\u0119dzie przegl\u0105darka, a sama aplikacja, kt\u00f3ra podlega testowaniu. We\u017amy na tapet najprostszy mo\u017cliwy przyk\u0142ad \u2013 windowsowy kalkulator. W tym celu nale\u017cy napisa\u0107 metod\u0119, kt\u00f3ra otworzy i\/lub zlokalizuje nasz handler. Kod, z wykorzystaniem biblioteki appium, w najprostszej postaci mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfrom appium import webdriver\n\nclass Handlers:\n    def calculator(self):\n        desired_caps = {}\n        desired_caps&#x5B;&#039;app&#039;] = \n&quot;Microsoft.WindowsCalculator_8wekyb3d8bbwe!App&quot;\n        self.driver = webdriver.Remote(\n            command_executor=&quot;http:\/\/127.0.0.1:4723&quot;,\n            desired_capabilities=desired_caps)\n\n<\/pre><\/div>\n\n\n<p>Desired Capabilities to s\u0142ownik z kluczami i warto\u015bciami w formacie JSON, wysy\u0142any przez Appium do uruchomionego serwera Windows Application Driver, gdy rozpoczynana jest nowa sesja. Przekazuje on wa\u017cne informacje \u2013 przede wszystkim dotycz\u0105ce aplikacji, kt\u00f3ra ma zosta\u0107 otwarta. Parametr path s\u0142u\u017cy do podania dok\u0142adnej \u015bcie\u017cki do aplikacji, kt\u00f3ra ma zosta\u0107 przechwycona. Adres <a href=\"http:\/\/127.0.0.1:4723\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >http:\/\/127.0.0.1:4723<\/a> to adres i numer portu, na kt\u00f3rym nas\u0142uchuje uruchomiony Windows Application Driver.<\/p>\n\n\n\n<p>Wa\u017cnym jest, aby WinAppDriver by\u0142 uruchomiony podczas wykonywania testu. Samo w\u0142\u0105czenie go r\u00f3wnie\u017c mo\u017ce zosta\u0107 zautomatyzowane, np. poprzez wykorzystanie biblioteki os:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nclass WinAppDriver:\n    def __init__(self):\n        self.winAppDriver = os.startfile(&quot;C:\\\\Program Files (x86)\\\\Windows Application Driver\\\\WinAppDriver.exe&quot;)\n\n<\/pre><\/div>\n\n\n<p>Podobnie mo\u017cna post\u0105pi\u0107 w przypadku zako\u0144czenia test\u00f3w, gdy chcieliby\u015bmy automatycznie zamkn\u0105\u0107 naszego WinAppDrivera. Wystarczy w klasie WinAppDriver doda\u0107 odpowiedni\u0105 metod\u0119 zamykaj\u0105c\u0105, np.:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndef close(self):\n    os.system(&quot;TASKKILL \/F \/IM WinAppDriver.exe&quot;)\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Lokalizowanie element\u00f3w<\/strong><\/h2>\n\n\n\n<p>Lokalizowanie element\u00f3w przy testowaniu aplikacji webowej jest (relatywnie) bardzo proste, tj. nie wymaga od nas \u017cadnych zewn\u0119trznych narz\u0119dzi. Wystarczy sama przegl\u0105darka i tryb inspekcji.<\/p>\n\n\n\n<p>W naszym przypadku musimy skorzysta\u0107 ze specjalnego programu, kt\u00f3ry umo\u017cliwi nam wgl\u0105d w ca\u0142\u0105 zawarto\u015b\u0107 aplikacji. Takim programem mo\u017ce by\u0107 np. <strong>Accessibility Insights<\/strong>, stworzony przez Microsoft. Po jego uruchomieniu mo\u017cemy najecha\u0107 kursorem na interesuj\u0105cy nas element bezpo\u015brednio w aplikacji, by pozna\u0107 jego \u201ewn\u0119trze\u201d. Nas interesowa\u0107 b\u0119dzie zazwyczaj jeden z trzech mo\u017cliwych lokalizator\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Name,<\/li>\n\n\n\n<li>ClassName,<\/li>\n\n\n\n<li>AutomationId.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/3.png\"><img decoding=\"async\" width=\"1490\" height=\"630\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/3-1024x433.png\" alt=\"Lokalizowanie element\u00f3w\" class=\"wp-image-20078\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/3-1024x433.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/3-300x127.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/3-768x325.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/3.png 1490w\" sizes=\"(max-width: 1490px) 100vw, 1490px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 Lokalizowanie element\u00f3w<\/figcaption><\/figure>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy przetestowa\u0107 windowsowy kalkulator. Test b\u0119dzie prosty: dodajemy do siebie dwie liczby i sprawdzamy, czy wynik b\u0119dzie poprawny. W tym celu musimy znale\u017a\u0107 przyciski z klawiatury numerycznej oraz przyciski operacji, kt\u00f3re zamierzamy klikn\u0105\u0107, okno wyniku i wy\u015bwietlany w nim tekst. Wszystkie nazwy mo\u017cemy zapisa\u0107 do odpowiedniego pliku, by m\u00f3c korzysta\u0107 z nich w przysz\u0142o\u015bci:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nclass CalculatorLocators:\n    #MAIN\n    RESULTS_ID = &#039;CalculatorResults&#039;\n    RESULT_TEXT = &#039;Wy\u015bwietlana warto\u015b\u0107 to &#039;\n\n    #OPERATORS\n    PLUS_BUTTON_ID = &#039;plusButton&#039;\n    MINUS_BUTTON_ID = &#039;minusButton&#039;\n    EQUAL_BUTTON_ID = &#039;equalButton&#039;\n    DIVIDE_BUTTON_ID = &#039;divideButton&#039;\n    MULTIPLY_BUTTON_ID = &#039;multiplyButton&#039;\n\n    # NUMBERS\n    ZERO_BUTTON_ID = &#039;num0Button&#039;\n    ONE_BUTTON_ID = &#039;num1Button&#039;\n    TWO_BUTTON_ID = &#039;num2Button&#039;\n    THREE_BUTTON_ID = &#039;num3Button&#039;\n    FOUR_BUTTON_ID = &#039;num4Button&#039;\n    FIVE_BUTTON_ID = &#039;num5Button&#039;\n    SIX_BUTTON_ID = &#039;num6Button&#039;\n    SEVEN_BUTTON_ID = &#039;num7Button&#039;\n    EIGHT_BUTTON_ID = &#039;num8Button&#039;\n    NINE_BUTTON_ID = &#039;num9Button&#039;\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Pierwszy test<\/strong><\/h2>\n\n\n\n<p>Wszystko jest ju\u017c gotowe, wi\u0119c mo\u017cemy przyst\u0105pi\u0107 do napisania pierwszego testu, polegaj\u0105cego na dodaniu do siebie dw\u00f3ch cyfr. Za\u0142\u00f3\u017cmy, \u017ce chcemy doda\u0107 do siebie dwie liczby 5 i sprawdzi\u0107, czy wynik b\u0119dzie poprawny, tj. otrzymamy wy\u015bwietlan\u0105 liczb\u0119 10.<\/p>\n\n\n\n<p>W tym celu mo\u017cemy ju\u017c u\u017cy\u0107 zwyk\u0142ej sk\u0142adni Selenium, lokalizuj\u0105cej i klikaj\u0105cej wybrany element, ko\u0144cz\u0105c wszystko asercj\u0105. Kod poszczeg\u00f3lnych krok\u00f3w w najprostszej postaci mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nWYNIK = 5 + 5\n\nself.driver.find_element_by_accessibility_id(CalculatorLocators.FIVE_BUTTON_ID).click()\nself.driver.find_element_by_accessibility_id(CalculatorLocators.PLUS_BUTTON_ID).click()\nself.driver.find_element_by_accessibility_id(CalculatorLocators.FIVE_BUTTON_ID).click()\nself.driver.find_element_by_accessibility_id(CalculatorLocators.EQUAL_BUTTON_ID).click()\n\nresult = self.driver.find_element_by_accessibility_id(CalculatorLocators.RESULTS_ID)\nself.assertEqual(result.text, CalculatorLocators.RESULT_TEXT + str(WYNIK))\n<\/pre><\/div>\n\n\n<p>Musimy r\u00f3wnie\u017c pami\u0119ta\u0107 o samym zaimportowaniu potrzebnych rzeczy oraz o w\u0142\u0105czeniu Windows Application Drivera i zainicjowaniu uchwytu, tj. drivera. Ca\u0142y kod prezentuje si\u0119 zatem nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nmport unittest\nfrom helpers.win_app_driver import WinAppDriver\nfrom helpers.handlers import Handlers\nfrom locators.calculator_locators import CalculatorLocators\n\nclass Calculator(unittest.TestCase):\n\n    def setUp(self):\n        WinAppDriver()\n        Handlers.calculator(self)\n\n    def test_dodawanie(self):\n        #TEST\n        WYNIK = 5 + 5\n\n        self.driver.find_element_by_accessibility_id(CalculatorLocators.FIVE_BUTTON_ID).click()\n        self.driver.find_element_by_accessibility_id(CalculatorLocators.PLUS_BUTTON_ID).click()\n        self.driver.find_element_by_accessibility_id(CalculatorLocators.FIVE_BUTTON_ID).click()\n        self.driver.find_element_by_accessibility_id(CalculatorLocators.EQUAL_BUTTON_ID).click()\n\n        result = self.driver.find_element_by_accessibility_id(CalculatorLocators.RESULTS_ID)\n        self.assertEqual(result.text, CalculatorLocators.RESULT_TEXT + str(WYNIK))\n\n    def tearDown(self):\n        WinAppDriver.close(self)\n\nif __name__ == &quot;__main__&quot;:\n    unittest.main()\n<\/pre><\/div>\n\n\n<p>Id\u0105c tym tropem, mo\u017cemy dalej wykonywa\u0107 kolejne testy dla pozosta\u0142ych operator\u00f3w, tj. odejmowanie od siebie liczb, ich mno\u017cenie oraz dzielenie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Selenium WebDriver mo\u017ce by\u0107 u\u017cywany do testowania aplikacji desktopowych na systemach Windows. Je\u017celi odpowiednio skonfigurujemy swoje \u015brodowisko, tj. zainstalujemy odpowiednie biblioteki i programy, jak r\u00f3wnie\u017c przyzwyczaimy si\u0119, \u017ce naszym driverem nie jest przegl\u0105darka, a sama aplikacja podlegaj\u0105ca testowaniu, istnieje prosta mo\u017cliwo\u015b\u0107 u\u017cycia sk\u0142adni Selenium do przeprowadzania wielu operacji \u2013 nie tylko tych prostych jak poszczeg\u00f3lne klikni\u0119cia, ale r\u00f3wnie\u017c bardziej skomplikowanych.<\/p>\n\n\n\n<p>Trzeba jednak pami\u0119ta\u0107 o pewnych <strong>ograniczeniach<\/strong> tego rozwi\u0105zania. W przypadku u\u017cywania Selenium w aplikacji webowej mo\u017cemy w testach posi\u0142kowa\u0107 si\u0119 np. obs\u0142ug\u0105 JavaScript, co przydatne mo\u017ce by\u0107 do m.in.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>przesuwania element\u00f3w,<\/li>\n\n\n\n<li>scrollowania,<\/li>\n\n\n\n<li>zaznaczania,<\/li>\n\n\n\n<li>odznaczania element\u00f3w itp.<\/li>\n<\/ul>\n\n\n\n<p>W przypadku Selenium w aplikacji desktopowej nale\u017cy rozwi\u0105zywa\u0107 problemy inaczej, w du\u017cej mierze polegaj\u0105c na samym j\u0119zyku programowania i\/lub innych, zewn\u0119trznych bibliotekach. Ale o tym mo\u017ce przy innej okazji.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u017celi interesuje Ci\u0119 obszar automatyzacji, polecamy inne artyku\u0142y naszych ekspert\u00f3w m.in.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a aria-label=\" (opens in a new tab)\" class=\"ek-link\" href=\"https:\/\/sii.pl\/blog\/codeceptjs-przyjazna-automatyzacja-testow-akceptacyjnych-dla-www\/?category=testowanie&amp;tag=centrum-kompetencyjne-uslug-testowych,codeceptjs,e2e,test-automation,testing-competency-center\" target=\"_blank\" rel=\"noreferrer noopener\">CodeceptJS \u2013 Przyjazna automatyzacja test\u00f3w akceptacyjnych dla www!<\/a><\/li>\n\n\n\n<li><a aria-label=\" (opens in a new tab)\" class=\"ek-link\" href=\"https:\/\/sii.pl\/blog\/robot-framework-wprowadzenie-do-automatyzacji-testow-aplikacji-webowej\/?category=testowanie&amp;tag=autoamtyzacja-testow,python,robot-framework,selenium,test-automation,testing\" target=\"_blank\" rel=\"noreferrer noopener\">Robot Framework \u2013 wprowadzenie do automatyzacji test\u00f3w aplikacji webowej<\/a><\/li>\n\n\n\n<li><a aria-label=\" (opens in a new tab)\" class=\"ek-link\" href=\"https:\/\/sii.pl\/blog\/automatyzacja-testow-systemow-wbudowanych-z-wykorzystaniem-robot-frameworka-czesc-1\/?category=development-na-twardo&amp;tag=centrum-kompetencyjne-embedded,embedded,embedded-competency-center,python,raspberry-pi,robot-framework,testing\" target=\"_blank\" rel=\"noreferrer noopener\">Automatyzacja test\u00f3w System\u00f3w Wbudowanych z wykorzystaniem Robot Frameworka \u2013 cz\u0119\u015b\u0107 1<\/a><\/li>\n\n\n\n<li><a aria-label=\" (opens in a new tab)\" class=\"ek-link\" href=\"https:\/\/sii.pl\/blog\/automatyzacja-testow-systemow-wbudowanych-z-wykorzystaniem-robot-frameworka-czesc-2\/?category=development-na-twardo&amp;tag=centrum-kompetencyjne-embedded,embedded,embedded-competency-center,python,raspberrypi,robotframework,testing,testowanie\" target=\"_blank\" rel=\"noreferrer noopener\">Automatyzacja test\u00f3w System\u00f3w Wbudowanych z wykorzystaniem Robot Frameworka \u2013 cz\u0119\u015b\u0107 2<\/a><\/li>\n\n\n\n<li><a aria-label=\" (opens in a new tab)\" class=\"ek-link\" href=\"https:\/\/sii.pl\/blog\/alm-automatyzacja-zadan-administracyjnych-w-dynamics-365-fo-wprowadzenie\/?category=development-na-twardo&amp;tag=alm,automatyzacja,dynamics-365,dynamics-365-finance-and-operations\" target=\"_blank\" rel=\"noreferrer noopener\">ALM \u2013 automatyzacja zada\u0144 administracyjnych w Dynamics 365 F&amp;O. Wprowadzenie<\/a><\/li>\n<\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;20073&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;8&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Automatyzacja test\u00f3w aplikacji desktopowej w systemie Windows przy u\u017cyciu Selenium w j\u0119zyku Python&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zapewne wszyscy testerzy automatyzuj\u0105cy wiedz\u0105, czym jest Selenium \u2013 je\u015bli nie z do\u015bwiadczenia, to na pewno ze s\u0142yszenia. Nic w &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/automatyzacja-testow-aplikacji-desktopowej-w-systemie-windows-przy-uzyciu-selenium-w-jezyku-python\/\">Continued<\/a><\/p>\n","protected":false},"author":482,"featured_media":20082,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":4,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[103,584,230,250],"class_list":["post-20073","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-autoamtyzacja-testow","tag-python","tag-selenium","tag-windows"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/03\/Automatyzacja-testow-aplikacji-desktopowej-w-systemie-Windows-przy-uzyciu-Selenium-w-jezyku-Python.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20073"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/482"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=20073"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20073\/revisions"}],"predecessor-version":[{"id":30506,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20073\/revisions\/30506"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/20082"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=20073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=20073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=20073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}