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?


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.


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.


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


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.


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.


„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ć


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


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.


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ę


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.