Różnica między webdriver.Dispose (), .Close () i .Quit ()

285

Jaka jest różnica między nimi

  1. Webdriver.Close()
  2. Webdriver.Quit()
  3. Webdriver.Dispose()

Którego użyć i kiedy?

Puran Joshi
źródło
2
Wygląda na to, że metoda #dispose została po cichu usunięta z interfejsu API WebDriver. Brak wzmianki w dzienniku zmian, ostatnia wzmianka, którą mogłem znaleźć, to v2.26 api docs, do którego nie mogę już znaleźć linku.
jordanpg
Widzę, skąd bierze się zamieszanie w odpowiedziach poniżej. Myślę, że to pytanie było pierwotnie pytaniem C #, ponieważ powyższe metody (zamknij, zamknij i usuń) zaczynają się od dużej litery (C #), a nie małej litery (java). Opcja Dispose nie została usunięta z powiązań klienta C # WebDriver.
rcasady616,
Dispose to wzorzec .Net, więc nie jest udokumentowany w dokumentach API selenu. W RemoteWebDriver Quit wywołuje Dispose, który wysyła polecenie Quit (DELETE / session / {sessionId}). Po stronie klienta jest kilka miejsc, w których przechwytywane jest polecenie Zakończ. Na przykład implementacja FirefoxDriver .net faktycznie wykona wywołanie process.Kill (), jeśli proces nie zamknie się płynnie.
Tamir Daniely

Odpowiedzi:

244

To dobre pytanie. Widziałem, jak ludzie używają Close (), kiedy nie powinni. Szukałem w kodzie źródłowym Selenium Client & WebDriver C # Bindings i znalazłem następujące.

  1. webDriver.Close() - Zamknij okno przeglądarki, na którym skupia się sterownik
  2. webDriver.Quit() - Wywołania Dispose ()
  3. webDriver.Dispose() Zamyka wszystkie okna przeglądarki i bezpiecznie kończy sesję

Poniższy kod usuwa obiekt sterownika, kończy sesję i zamyka wszystkie przeglądarki otwarte podczas testu, czy test się nie powiedzie, czy przejdzie.

public IWebDriver Driver;

[SetUp]
public void SetupTest()
{
    Driver = WebDriverFactory.GetDriver();
}

[TearDown]
public void TearDown()
{
    if (Driver != null)
      Driver.Quit();
}

Podsumowując, upewnij się, że Quit () lub Dispose () jest wywoływana przed wyjściem z programu i nie używaj metody Close (), chyba że jesteś pewien, co robisz.

Uwaga
Znalazłem to pytanie, gdy próbowałem znaleźć powiązany problem, dlaczego moje maszyny wirtualne zabrakło miejsca na dysku twardym. Okazało się, że wyjątek powodował, że Quit () lub Dispose () nie były wywoływane przy każdym uruchomieniu, co spowodowało, że folder appData zapełnił dysk twardy. Używaliśmy więc poprawnie metody Quit (), ale kod był nieosiągalny. Podsumowanie upewnij się, że wszystkie ścieżki kodu wyczyszczą niezarządzane obiekty za pomocą bezpiecznych wzorców wyjątków lub zaimplementuj IDisposable

Również
w przypadku RemoteDriver wywołanie Quit () lub Dispose () spowoduje zamknięcie sesji na serwerze Selenium. Jeśli sesja nie zostanie zamknięta, pliki dziennika dla tej sesji pozostaną w pamięci.

rcasady616
źródło
Jak zaktualizowałeś swoje wyjątki? Po prostu przejdź do każdego z nich i dodaj quit ()?
Mark Mayo,
1
W ramce testowej działającej jak NUnit, JUnit musisz tylko upewnić się, że Dispose () znajduje się w TestTeardown () lub TestFixtureTeardown (). W języku C # można po prostu użyć instrukcji „using”, a Dispose jest zawsze wywoływany, jeśli zostanie zgłoszony wyjątek. Możesz zrobić coś podobnego w Javie, używając w końcu try catch i umieścić Dispose w końcu.
rcasady616
1
@ rcasady616 To jest najlepsze wytłumaczenie, jakie mam. Dzięki za to i myślę, że jest to warte pochwały.
RNS
2
@ Mr.Bultitude Cóż, to zrozumiałe, biorąc pod uwagę nie ma żadnej różnicy ^^ Zgodnie z tą odpowiedzią, Quit()jest przekierowanie doDispose()
PixelMaster
1
@PixelMaster, Tak, są w 100% poprawne, to w zasadzie przekierowanie. Nie będąc tym, który napisał kod w Selenium, mogę tylko zgadywać, dlaczego obie metody są obecne w powiązaniach klienta C #. Prawdopodobnie chcą zachować wspólną metodę „zamykania” w różnych językach klienta, ale chcą też używać sterownika w składni instrukcji „using” (która wymagałaby metody Dispose ()). To moje najlepsze przypuszczenie, że to albo kod musi zostać wyczyszczony.
rcasady616
47

Close() - Służy do zamykania przeglądarki lub aktualnie aktywnej strony.

Quit() - Służy do zamykania instancji sterownika sieci lub niszczenia instancji sterownika sieci (Zamknij wszystkie okna).

Dispose() - Nie znam tej metody.

Manigandan
źródło
3
Jeśli używasz powiązań języka .NET, metody Quiti Disposepowinny być dla siebie synonimami. Innymi słowy, Quitpołączenia Dispose.
JimEvans
23

driver.closei driver.quitsą dwiema różnymi metodami zamykania sesji przeglądarki w Selenium WebDriver. Zrozumienie obu z nich i wiedza, kiedy użyć każdej metody, jest ważne w wykonywaniu testu. Dlatego starałem się rzucić nieco światła na obie te metody.

driver.close- Ta metoda zamyka okno przeglądarki, na którym ustawiony jest fokus. Pomimo znanej nazwy dla tej metody WebDriverjest nie zaimplementować AutoCloseableinterfejs .

driver.quit- Ta metoda w zasadzie wywołuje driver.disposeteraz wewnętrzną metodę, która z kolei zamyka wszystkie okna przeglądarki i kończy sesję WebDriver z wdziękiem.

driver.dispose- Jak wspomniano wcześniej, jest to wewnętrzna metoda WebDriver, która została po cichu odrzucona zgodnie z inną odpowiedzią - Konieczna weryfikacja. Ta metoda naprawdę nie ma przypadku użycia w normalnym toku pracy testowej, ponieważ jedna z poprzednich metod powinna działać w większości przypadków użycia.

Objaśnienie przypadku użycia: Powinieneś używać, driver.quitgdy chcesz zakończyć program. Zamknie wszystkie otwarte okna przeglądarki i zakończy sesję WebDriver. Jeśli nie będziesz używać driver.quitna końcu programu, sesja WebDriver nie zostanie poprawnie zamknięta, a pliki nie zostaną usunięte z pamięci. Może to spowodować błędy wycieku pamięci.

Powyższe wyjaśnienie należy wyjaśnić różnicę pomiędzy driver.closei driver.quitmetod w WebDriver. Mam nadzieję, że uznasz to za przydatne.

Poniższa strona zawiera kilka dobrych wskazówek na temat testowania selenu: Link

Anudeep Samaiya
źródło
Zauważyłem również, że IEDrivery, które są używane do pracy z automatyzacją opartą na IE, nie wychodzą, jeśli użyjesz metody driver.close (). Musiałem użyć driver.quit (), aby go zakończyć. Wynika to z faktu, że metoda quit () również oczyszcza zasoby w przeciwieństwie do close (), chociaż w moim przykładzie zawsze mam jedną kartę.
Pavan Dittakavi
14

quit(): Zamyka ten sterownik, zamykając każde powiązane okno, które było otwarte.

close() : Zamknij bieżące okno, zamykając przeglądarkę, jeśli jest to ostatnie otwarte okno.

Ran Adler
źródło
ta odpowiedź pomija kluczową różnicę: quit () zatrzyma bazową usługę webdriver, podczas gdy close () nie. Porada: nigdy nie wywołuj close (), jeśli pozostanie tylko jedno okno
Corey Goldberg,
5

close (): - Załóżmy, że otworzyłeś wiele okien przeglądarki z tą samą instancją sterownika, teraz wywołanie close () w instancji sterownika zamknie bieżące okno, na które wskazuje instancja sterownika. Ale instancja sterownika wciąż pozostaje w pamięci i może być używana do obsługi innych otwartych okien przeglądarki.

quit (): - Jeśli wywołasz quit () w instancji sterownika, a jedno lub więcej okien przeglądarki jest otwarte, zamknie wszystkie otwarte okna przeglądarki, a instancja sterownika zostanie usunięta, tzn. usunięta z pamięci. Dlatego teraz nie można użyć tej instancji sterownika do wykonania innej operacji po wywołaniu jej na quit (). Jeśli to zrobisz, wygeneruje wyjątek.

dispose (): - Nie sądzę, aby istniała metoda usuwania dla instancji WebDriver.

Możesz przejść do tego oficjalnego linku do dokumentu selenium java w celach informacyjnych.

Prasanta Biswas
źródło
„Nie sądzę, aby istniała metoda usuwania dla instancji WebDriver.” Pewnie, że jest (przynajmniej w C #).
EJoshuaS - Przywróć Monikę
5

Na podstawie problemu dotyczącego Github z PhantomJS, quit () nie kończy procesu PhantomJS. Powinieneś użyć:

import signal
driver = webdriver.PhantomJS(service_args=service_args)
# Do your work here

driver.service.process.send_signal(signal.SIGTERM)
driver.quit()

połączyć

Wesam Na
źródło
5

close () to polecenie webdriver, które zamyka aktualnie aktywne okno przeglądarki. Pomimo znanej nazwy dla tej metody WebDriverjest nie zaimplementować AutoCloseableinterfejs .

Jeśli w trakcie procesu automatyzacji otwarte jest więcej niż jedno okno przeglądarki, polecenie close () zamknie tylko bieżące okno przeglądarki, które jest w tym momencie aktywne. Pozostałe okna przeglądarki nie zostaną zamknięte. Aby zamknąć bieżące okno przeglądarki, można użyć następującego kodu:

porzucić() to polecenie webdriver, które wywołuje metodę driver.dispose, która z kolei zamyka wszystkie okna przeglądarki i kończy sesję WebDriver. Jeśli nie użyjemy quit () na końcu programu, sesja WebDriver nie zostanie poprawnie zamknięta, a pliki nie zostaną usunięte z pamięci. Może to spowodować błędy wycieku pamięci.

Jeśli proces automatyzacji otwiera tylko jedno okno przeglądarki, polecenia close () i quit () działają w ten sam sposób. Oba będą różnić się funkcjonalnością, gdy w Automatyzacji zostanie otwarte więcej niż jedno okno przeglądarki.

Aby zobaczyć powyższy odnośnik : kliknij tutaj

Polecenie Dispose Funkcja Dispose () powinna wywołać Quit () i wygląda na to, że tak. Ma jednak ten sam problem, że wszelkie kolejne działania są blokowane do momentu ręcznego zamknięcia PhantomJS.

Link referencyjny

Dhaval Atri
źródło
3

Różnica między driver.close () i driver.quit ()

driver.close - Zamyka okno przeglądarki, w którym ustawiony jest fokus.

driver.quit - Zasadniczo wywołuje metodę driver.dispose, która z kolei zamyka wszystkie okna przeglądarki i kończy sesję WebDriver z wdziękiem.

Nagarjuna Yalamanchili
źródło
2

Selenium WebDriver

  1. WebDriver.Close()Ta metoda służy do zamknięcia bieżącego otwartego okna. Zamyka bieżące otwarte okno, na którym skupia się sterownik.

  2. WebDriver.Quit()Ta metoda służy do zniszczenia instancji WebDriver. Zamyka wszystkie okna przeglądarki powiązane z tym sterownikiem i bezpiecznie kończy sesję. Wywołania WebDriver.Quit () Dispose.

  3. WebDriver.Dispose() Ta metoda zamyka wszystkie okna przeglądarki i bezpiecznie kończy sesję

s10v10s
źródło
4
jeśli cytujesz coś, powinieneś podać źródło.
Meirion Hughes
2

Rozumiem, driver.close();że zamknie bieżącą przeglądarkę i driver.quit();zakończy działanie tej przeglądarki.

BIUbiubiu
źródło