{"id":107,"date":"2017-09-20T12:09:12","date_gmt":"2017-09-20T10:09:12","guid":{"rendered":"http:\/\/rafallancucki.pl\/?p=107"},"modified":"2017-10-03T17:16:55","modified_gmt":"2017-10-03T15:16:55","slug":"potyczki-z-selenium-czesc-1","status":"publish","type":"post","link":"https:\/\/rafallancucki.pl\/index.php\/2017\/09\/20\/potyczki-z-selenium-czesc-1\/","title":{"rendered":"Potyczki z Selenium cz\u0119\u015b\u0107 1"},"content":{"rendered":"<p style=\"text-align: justify; text-indent: 30px;\">W tej ods\u0142onie bloga chcia\u0142bym si\u0119 podzieli\u0107 do\u015bwiadczeniami z uruchamianiem automatycznych test\u00f3w. W kwestii technicznej u\u017cywamy SpecFlow wraz z Selenium do tworzenia BDD i chcieli\u015bmy do\u0142\u0105czy\u0107 uruchamianie test\u00f3w automatycznych do naszej ci\u0105g\u0142ej integracji. W cz\u0119\u015bci 1 opisz\u0119 nasz\u0105 drog\u0119 do uzyskania \u015brodowiska wraz ze \u015blepymi uliczkami kt\u00f3re sprawdzili\u015bmy nie wnikaj\u0105c bardzo w techniczn\u0105 stron\u0119 zagadnienia. W 2 cz\u0119\u015bci wpisu podziel\u0119 si\u0119 r\u00f3wnie\u017c skryptami power shell i konfiguracj\u0105, kt\u00f3rej u\u017cywamy finalnie.<\/p>\n<p style=\"text-align: justify; text-indent: 30px;\">W sumie pocz\u0105tki wydawa\u0142y si\u0119 proste i obiecuj\u0105ce &#8211; cho\u0107 nie bezbolesne. Na pocz\u0105tku da\u0142o nam si\u0119 we znaki stworzenie driver-a we frameworku do test\u00f3w jako statycznej zmiennej. To bardzo szybko wywo\u0142a\u0142o konieczno\u015b\u0107 wi\u0119kszego refactoring-u bo uniemo\u017cliwia\u0142o uruchamianie r\u00f3wnoleg\u0142e test\u00f3w (wtedy jeszcze nie wiedzieli\u015bmy, \u017ce temat r\u00f3wnoleg\u0142o\u015bci zajmie nas na d\u0142u\u017cszy czas).<\/p>\n<p><!--more--><\/p>\n<h1>U\u017cywane technologie<\/h1>\n<p style=\"text-align: justify; text-indent: 30px;\">U\u017cywamy SpecFlow (v2.2.1) do BDD, Selenium WebDrivera (v3.5.2) i oparte to jest na NUnit runnerze (3.7.0). Numery wersji podaj\u0119, bo okaza\u0142o si\u0119 to wa\u017cne (szczeg\u00f3\u0142y dalej w tek\u015bcie). Testowane oprogramowanie u\u017cywa React\/Redux, ale to akurat z punktu widzenia test\u00f3w jest mniej istotne.<\/p>\n<h1>Historia uruchamiania<\/h1>\n<p style=\"text-align: justify; text-indent: 30px;\">Testy powstawa\u0142y w ramach rozwoju produktu i powsta\u0142a konieczno\u015b\u0107 zintegrowania ich z ci\u0105g\u0142\u0105 integracj\u0105. Uruchomienie wymaga\u0142o drobnych zmian aby przenie\u015b\u0107 ustawienia \u015brodowiska z app.config do pliku .runsettings aby mo\u017cna by\u0142o sterowa\u0107 wykonaniem test\u00f3w z poziomu definicji build-a. Nic wielkiego, jest du\u017co tutoriali, posz\u0142o szybko.<\/p>\n<p style=\"text-align: justify; text-indent: 30px;\">Nast\u0119pnym problemem do omini\u0119cia sta\u0142o si\u0119 uruchomienie Selenium Hub-a wraz z node-ami do uruchamiania test\u00f3w automatycznych. Wtedy pojawi\u0142y si\u0119 pierwsze schody zwi\u0105zane z bezobs\u0142ugowo\u015bci\u0105 rozwi\u0105zania. Poniewa\u017c chciali\u015bmy testowa\u0107 na kilku przegl\u0105darkach (Internet Explorer, Edge, Chrome i FireFox) wyborem na node by\u0142a stacja z Windows 10. Ale od razu pojawi\u0142y si\u0119 problemy z Hub-em i Node-em.<\/p>\n<p style=\"text-align: justify; text-indent: 30px;\">W pierwszym podej\u015bciu pr\u00f3bowali\u015bmy uruchomi\u0107 Hub-a i Node-a jako serwisy Windows (wydawa\u0142o si\u0119 to naturalnym wyborem). NSSM (&#8222;The Non-Sucking Service Manager&#8221;) i Hub dzia\u0142a. Ale od razu okaza\u0142o si\u0119, \u017ce w przypadku Node&#8217;a to nie zadzia\u0142a. O ile w przypadku Hub-a serwis sprawdza\u0142 si\u0119 ca\u0142kowicie, o tyle w przypadku Node-a Internet Explorer i Edge odm\u00f3wi\u0142y zdecydowanie wsp\u00f3\u0142pracy. Chyba Chrom i FireFox dzia\u0142a\u0142y, cho\u0107 na 100% trudno mi w tej chwili zawyrokowa\u0107 &#8211; ze wzgl\u0119du na konieczno\u015b\u0107 wspierania innych przegl\u0105darek musieli\u015bmy zrezygnowa\u0107 z tego rozwi\u0105zania. Wiadomo &#8211; problem Sesji 0 w Windows. Poszukiwania rozwi\u0105zania nie doprowadzi\u0142y do sukcesu. A wi\u0119c nie t\u0119dy droga.<\/p>\n<p style=\"text-align: justify; text-indent: 30px;\">Nast\u0119pnym krokiem sta\u0142 si\u0119 uruchomienie Node&#8217;\u00f3w w trybie zalogowanym do Windows &#8211; ze wzgl\u0119du na policy w naszej domenie musieli\u015bmy u\u017cy\u0107 softu do &#8222;poruszania&#8221; myszk\u0105 co chwila, ale normalnie powinno wystarczy\u0107 wy\u0142\u0105czenie wszelkich power options lub u\u017cycie softu do utrzymywania Windowsa w stanie zalogowanym lub wreszcie autologin Windows przy starcie (u nas te\u017c nie dzia\u0142a ze wzgl\u0119du na domenowe policy).<\/p>\n<p style=\"text-align: justify; text-indent: 30px;\">Uff, jest, dzia\u0142a, mamy Hub-a i 2 Node&#8217;y i gra muzyka. Czy faktycznie? Test\u00f3w coraz wi\u0119cej, czas wykonywania wszystkiego zaczyna puchn\u0105\u0107. Mamy 2 Node&#8217;y wi\u0119c sensowne wydaje si\u0119 u\u017cycie r\u00f3wnoleg\u0142o\u015bci. No i od razu trafiamy na rafy. Pojawi\u0142o si\u0119 ich kilka, postaram si\u0119 je opisa\u0107 kolejno &#8211; niekoniecznie pojawia\u0142y si\u0119 w tej kolejno\u015bci, ale wa\u017cniejsze jest zgrupowanie tematyczne ni\u017c chronologia.<\/p>\n<h1>R\u00f3wnoleg\u0142o\u015b\u0107 w NUNit runner<\/h1>\n<p style=\"text-align: justify; text-indent: 30px;\">NUnit runner w wersji nowszej ni\u017c 3.7.0 ma problemy z r\u00f3wnoleg\u0142ym uruchamianiem test\u00f3w. Wysz\u0142o po d\u0142ugich bojach, ale objawia si\u0119 to losowymi b\u0142\u0119dami podczas r\u00f3wnoleg\u0142ego uruchamiania test\u00f3w (nie mo\u017cna pobra\u0107 nast\u0119pnego kroku). Oczywi\u015bcie dodatkowo w samym frameworku SpecFlow trzeba zmieni\u0107 odwo\u0142ania do ScenarioContext ale to jest opisywane w dokumentacji do SpecFlow wi\u0119c nie b\u0119d\u0119 tutaj rozszerza\u0142 tematu. Konfiguracj\u0119 samego assembly opisz\u0119 w drugiej cz\u0119\u015bci artyku\u0142u.<\/p>\n<h1>Internet Explorer<\/h1>\n<p style=\"text-align: justify; text-indent: 30px;\">Kiedy ju\u017c uda\u0142o si\u0119 uruchomi\u0107 testy r\u00f3wnolegle pojawi\u0142 si\u0119 problem r\u00f3wnoleg\u0142ej pracy przegl\u0105darek na Node&#8217;ach Selenium. O ile Chrome i FireFox dzia\u0142a\u0142y bezb\u0142\u0119dnie nawet w kilku instancjach o tyle Internet Explorer zacz\u0105\u0142 stawia\u0107 op\u00f3r. Po wielu testach okaza\u0142o si\u0119, \u017ce problemem jest Focus, a raczej jego przenoszenie do innych przegl\u0105darek. Ten sam test uruchomiony indywidualnie dzia\u0142a\u0142, ale jego r\u00f3wnoleg\u0142e uruchomienie z testem np. na Chrome powodowa\u0142o, \u017ce fokus z IE znika\u0142, a driver nie by\u0142 ju\u017c w stanie odnale\u017a\u0107 element\u00f3w strony (cho\u0107 by\u0142y one dost\u0119pne). Rozwi\u0105zaniem okaza\u0142o si\u0119 po\u0142\u0105czenie 2 rozwi\u0105za\u0144:<br \/>\n1) U\u017cycie 64-bitowego IE WebDriver-a wraz z 64-bitow\u0105 przegl\u0105dark\u0105 + konfiguracja opisana dla IE WebDriver-a (wpisy w rejestrze)<br \/>\n2) U\u017cycie Headless IE Selenium<\/p>\n<h1>FireFox<\/h1>\n<p style=\"text-align: justify; text-indent: 30px;\">Z FireFox okaza\u0142o si\u0119, \u017ce wersja WebDriver-a kt\u00f3ra dzia\u0142a lokalnie nie dzia\u0142a na Node-ach i odwrotnie. Na ten moment u\u017cywamy najnowszej wersji WebDriver-a i u\u017cywamy Node-\u00f3w r\u00f3wnie\u017c do lokalnego wykonywania test\u00f3w.<\/p>\n<h1>Edge<\/h1>\n<p style=\"text-align: justify; text-indent: 30px;\">Tu niestety dobre wie\u015bci si\u0119 ko\u0144cz\u0105. Edge zmusi\u0142 nas do wywieszenia bia\u0142ej flagi. Generalnie testy dzia\u0142aj\u0105, ale czasami (zupe\u0142nie losowo, a przynajmniej bez jasnej przyczyny) test potrafi si\u0119 zawiesi\u0107 na d\u0142u\u017cszy czas. Po kilku pr\u00f3bach zmuszenia Edge-a do wsp\u00f3\u0142pracy zrezygnowali\u015bmy i dop\u00f3ki nie pojawi si\u0119 nowsza wersja WebDriver-a zrezygnowali\u015bmy z testowania na Edge.<\/p>\n<h1>Podsumowanie<\/h1>\n<p style=\"text-align: justify; text-indent: 30px;\">Na ten moment mamy uruchomione testy automatyczne w konfiguracji 2 Node i Hub. Na Nod&#8217;ach mamy po kilka instancji Chrome, FireFox i IE i dzia\u0142a to stabilnie (oczywi\u015bcie mamy skrypty powershell do resetowania Node&#8217;\u00f3w &#8211; opisz\u0119 w 2 cz\u0119\u015bci wpisu). W przysz\u0142o\u015bci liczymy na pojawienie si\u0119 stabilnej wersji WebDriver-a do Edge i poprawienia b\u0142ed\u00f3w w NUnit runnerze, aby mo\u017cliwe by\u0142o u\u017cycie nowszej wersji.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tej ods\u0142onie bloga chcia\u0142bym si\u0119 podzieli\u0107 do\u015bwiadczeniami z uruchamianiem automatycznych test\u00f3w. W kwestii technicznej u\u017cywamy SpecFlow wraz z Selenium do tworzenia BDD i chcieli\u015bmy do\u0142\u0105czy\u0107 uruchamianie test\u00f3w automatycznych do naszej ci\u0105g\u0142ej integracji. W cz\u0119\u015bci 1 opisz\u0119 nasz\u0105 drog\u0119 do uzyskania \u015brodowiska wraz ze \u015blepymi uliczkami kt\u00f3re sprawdzili\u015bmy nie wnikaj\u0105c bardzo w techniczn\u0105 stron\u0119 zagadnienia. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[7],"tags":[],"_links":{"self":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts\/107"}],"collection":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/comments?post=107"}],"version-history":[{"count":7,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts\/107\/revisions"}],"predecessor-version":[{"id":114,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts\/107\/revisions\/114"}],"wp:attachment":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/media?parent=107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/categories?post=107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/tags?post=107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}