Czy w modelu obiektów strony wszystkie klasy muszą współużytkować jedną instancję sterownika?

Dec 19 2020

Mogę utworzyć plik BaseTest.java i zadeklarować publiczny statyczny sterownik WebDriver; w tym. Następnie wszystkie klasy mogą rozszerzać i używać tego samego odwołania do sterownika.

Wtedy wszystkie moje klasy testowe mogą używać tej samej instancji.

Mogę uzyć:

driver = new ChromeDriver(); 

w każdej metodzie testowej lub scenariuszu Cucumber. Jestem zdezorientowany, jak używać sterownika. Czy sterownik jest sesją okna Chrome?

Odpowiedzi

2 JoãoFarias Dec 19 2020 at 16:31

Czy sterownik jest sesją okna Chrome?

Nie. Sterownik ChromeDriver reprezentuje serwer, który kontroluje przeglądarkę Chrome działającą lokalnie. Serwer będzie kontrolował cykl życia przeglądarki, taki jak inicjowanie, zabijanie i kontrolowanie działań.

Więcej informacji można znaleźć w dokumentacji

Czy mogę utworzyć sterownik = nowy ChromeDriver (); w każdej metodzie testowej lub scenariuszu Cucumber

Tak, ale będzie to zależeć od twojego kontekstu. Jeśli chcesz, aby wiele przeglądarek działało niezależnie w niektórych działaniach, możesz utworzyć nowy sterownik.

Premia:

Mogę utworzyć plik BaseTest.java i zadeklarować publiczny statyczny sterownik WebDriver; w tym. Następnie wszystkie klasy mogą rozszerzać i używać tego samego odwołania do sterownika.

To może być niebezpieczne. Nieherantancja jest najsilniejszą formą sprzężenia, jaką możesz stworzyć, a posiadanie zmiennej globalnej może spowodować zmianę w zachowaniu bardzo trudną do zrozumienia. Możesz chcieć zrefaktoryzować swój kod, tak aby instancje sterownika zostały wprowadzone do obiektów strony . W ten sposób nie łączysz obiektów strony ze zmienną globalną i możesz łatwo tworzyć dla nich testy jednostkowe, wstrzykując podwójny test dla sterownika.

2 PDHide Dec 19 2020 at 19:39

Co to jest chromedriver:

chromedriver ma kod, który może współdziałać z przeglądarką. Te polecenia są ujawniane za pośrednictwem interfejsu API (widzisz to, gdy chromedriver został uruchomiony na hoście lokalnym: 14563). Z kodu uzyskujemy dostęp do punktów końcowych tego interfejsu API, aby nakazać sterownikowi Chrome, aby coś zrobił.

Na przykład, kiedy powiesz elem.click (), selen komunikuje się z API i każe chromedriverowi kliknąć określony element w przeglądarce. Sterownik Chrome robi to i zwraca odpowiedź z przeglądarki i zwraca ją do kodu wyjściowego

Dlaczego potrzebujemy klasy bazowej

Ma to na celu zapewnienie, że sesje sterowników są przekazywane między różnymi klasami. W przeciwnym razie nie będziesz w stanie zrobić czegoś takiego

   page1.sendpassword()
   page1.sendusername()
   page1.submit()
   page2.adduser()

Ponieważ jeśli masz inną sesję sterownika dla page1 i page2,

wtedy po uruchomieniu page2.adduser () sterownik chrome zostanie uruchomiony na nowo, a poprzednie sesje logowania nie będą dostępne, więc musisz zalogować się ponownie

Nie można również dodawać zrzutów ekranu ani działań specyficznych dla sterownika w klasach odbiorników do raportowania

Możesz przeczytać więcej o klasie bazowej pod adresem:

Jaki jest cel tworzenia klasy BaseTest, która deklaruje globalny statyczny obiekt WebDriver w ramach POM?

AlexeyR. Dec 19 2020 at 16:33

Wystąpienie WebDriver w kodzie to rodzaj kanału, którego używasz do interakcji z pojedynczą sesją implementacji sterownika sieciowego. Zasadniczo to, czego używasz w swoim kodzie, to tak zwane powiązanie klienta .

WebDriver to serwer HTTP, który udostępnia API REST w kierunku powiązań klienta (np. Bibliotek Java) z jednej strony i może kontrolować przeglądarkę z drugiej strony.

Zatem cały Twój kod, który zakłada, że ​​działa z tą samą sesją Chrome (zachowując pliki cookie itp.), Musi współdzielić tę samą instancję sterownika sieciowego.

Nic nie stoi na przeszkodzie, aby w Twoim kodzie utworzyć instancję jeszcze jednego nurka. Dzięki tej nowej instancji uzyskasz kontrolę nad inną równolegle izolowaną sesją przeglądarki.