webdriver.Dispose (), .Close () 및 .Quit ()의 차이점


285

이들의 차이점은 무엇입니까

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

어느 것을 언제 사용해야합니까?


2
#dispose 메소드가 WebDriver API에서 자동으로 삭제 된 것으로 보입니다. changelog에 언급이 없습니다. 내가 찾을 수있는 가장 최근의 언급은 v2.26 api docs인데 더 이상 링크를 찾을 수 없습니다.
jordanpg

아래 답변에서 혼란이 어디에서 오는지 봅니다. 위의 방법 (Close, Quit 및 Dispose)이 소문자 (java)가 아닌 대문자 (C #)로 시작하기 때문에이 질문은 원래 C # 질문이라고 생각합니다. C # WebDriver 클라이언트 바인딩에서 삭제가 삭제되지 않았습니다.
rcasady616

Dispose는 .Net 패턴이므로 셀레늄의 API 문서에는 문서화되어 있지 않습니다. RemoteWebDriver에서 Quit은 Dispose를 호출하여 Quit 명령 (DELETE / session / {sessionId})을 보냅니다. 클라이언트 측에는 Quit 명령이 인터셉트되는 여러 위치가 있습니다. 예를 들어 FirefoxDriver .net 구현은 프로세스가 정상적으로 종료되지 않으면 실제로 process.Kill () 호출을 수행합니다.
Tamir Daniely

답변:


244

사람들이해서는 안될 때 Close ()를 사용하는 것을 본 좋은 질문입니다. Selenium Client & WebDriver C # Bindings의 소스 코드에서 다음을 발견했습니다.

  1. webDriver.Close() -드라이버가 중점을 둔 브라우저 창을 닫습니다
  2. webDriver.Quit() -Dispose () 호출
  3. webDriver.Dispose() 모든 브라우저 창을 닫고 세션을 안전하게 종료합니다

아래 코드는 드라이버 개체를 삭제하고 세션을 종료하며 테스트 중 실패했는지 여부에 관계없이 테스트 중에 열린 모든 브라우저를 닫습니다.

public IWebDriver Driver;

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

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

요약하면 프로그램을 종료하기 전에 Quit () 또는 Dispose ()가 호출되는지 확인하고 수행중인 작업이 확실하지 않으면 Close () 메서드를 사용하지 마십시오.

참고
내 VM에 하드 드라이브 공간이 부족한 이유를 파악하려고 할 때이 질문을 발견했습니다. Quit () 또는 Dispose ()가 모든 실행에서 호출되지 않는 예외가 발생하여 appData 폴더가 하드 드라이브를 채우게됩니다. 그래서 우리는 Quit () 메소드를 올바르게 사용했지만 코드에 접근 할 수 없었습니다. 요약 모든 코드 경로가 예외 안전 패턴을 사용하여 관리되지 않는 개체를 정리하거나 IDisposable을 구현해야합니다.

또한
RemoteDriver의 경우 Quit () 또는 Dispose ()를 호출하면 Selenium 서버에서 세션이 닫힙니다. 세션이 닫히지 않으면 해당 세션의 로그 파일이 메모리에 남아 있습니다.


예외를 어떻게 업데이트 했습니까? 각각에 가서 quit ()을 추가하십시오.
Mark Mayo

1
NUnit, JUnit과 같은 테스트 프레임 작업에서 Dispose ()가 TestTeardown () 또는 TestFixtureTeardown ()에 있는지 확인하면됩니다. C #에서는 "using"문만 사용할 수 있으며 예외가 발생하면 Dispose가 항상 호출됩니다. 마지막으로 try catch를 사용하고 Dispose를 최종적으로 넣으면 Java에서 비슷한 작업을 수행 할 수 있습니다.
rcasady616

1
@ rcasady616 이것이 내가 가진 최고의 설명입니다. 감사합니다. 공감할만한 가치가 있다고 생각합니다.
RNS

2
@ Mr.Bultitude 잘, 그것은 차이 없다는 것을 고려하면 이해할 만하다 ^^이 답변에 따르면, 다음 Quit()으로 리디렉션됩니다Dispose()
PixelMaster

1
@PixelMaster, 예, 100 % 정확합니다. 기본적으로 리디렉션입니다. Selenium에서 코드를 작성한 사람이 아니기 때문에 C # 클라이언트 바인딩에 두 방법이 모두있는 이유에 대해서만 추측 할 수 있습니다. 아마도 클라이언트 언어 전체에서 "Quitting"에 대한 일반적인 방법을 유지하고 싶을뿐만 아니라 "using"문 구문에서 드라이버를 사용하고 싶었습니다 (스위치에는 Dispose () 메서드가 필요함). 그것이 최선의 추측입니다. 코드 또는 코드를 정리해야합니다.
rcasady616

47

Close() -현재 포커스가있는 브라우저 또는 페이지를 닫는 데 사용됩니다.

Quit() -웹 드라이버 인스턴스를 종료하거나 웹 드라이버 인스턴스를 파기하는 데 사용됩니다 (모든 창 닫기).

Dispose() -나는이 방법을 모른다.


3
.NET 언어 바인딩을 사용하는 경우 Quitand Dispose메소드는 서로 동의어 여야합니다. 즉,을 Quit호출합니다 Dispose.
JimEvans

23

driver.closedriver.quit셀레늄 WebDriver의 브라우저 세션을 닫는 두 가지 방법이 있습니다. 테스트 실행에서 두 가지를 모두 이해하고 각 방법을 사용할시기를 아는 것이 중요합니다. 따라서 두 가지 방법 모두에 대해 밝히려고 노력했습니다.

driver.close-이 방법은 포커스가 설정된 브라우저 창을 닫습니다. 이 방법의 익숙한 이름에도 불구하고 인터페이스를 구현 WebDriver하지 않습니다 .AutoCloseable

driver.quit–이 메소드는 기본적으로 driver.dispose이제 내부 메소드를 호출 하여 모든 브라우저 창을 닫고 WebDriver 세션을 정상적으로 종료합니다.

driver.dispose-앞에서 언급했듯이 WebDriver의 내부 방법은 다른 답변에 따라 자동으로 삭제되었습니다-확인 필요. 이전 방법 중 하나가 대부분의 사용 사례에서 작동하므로이 방법에는 실제 테스트 워크 플로에서 실제로 사용 사례가 없습니다.

사용 사례 : driver.quit프로그램을 종료 할 때마다 사용해야합니다 . 열려있는 모든 브라우저 창을 닫고 WebDriver 세션을 종료합니다. driver.quit프로그램 종료시 사용하지 않으면 WebDriver 세션이 제대로 닫히지 않고 파일이 메모리에서 지워지지 않습니다. 메모리 누수 오류가 발생할 수 있습니다.

위의 설명은 차이점을 설명해야합니다. driver.closedriver.quit WebDriver 와 메소드 . 도움이 되셨기를 바랍니다.

다음 웹 사이트는 셀레늄 테스트에 대한 좋은 팁이 있습니다 링크


또한 driver.close () 메소드를 사용하면 IE 기반 자동화 작업에 사용되는 IEDrivers가 종료되지 않습니다. driver.quit ()를 사용하여 종료해야했습니다. quit () 메서드는 close ()와 달리 리소스를 정리하는 것처럼 보이기 때문입니다. 예를 들어, 항상 단일 탭이 있습니다.
Pavan Dittakavi

14

quit():이 드라이버를 종료하고 열려있는 모든 관련 창을 닫습니다.

close() : 현재 열려있는 마지막 창인 경우 브라우저를 종료하고 현재 창을 닫습니다.


이 답변은 주요 차이점을 놓칩니다. quit ()은 기본 웹 드라이버 서비스를 중지하지만 close ()는 그렇지 않습니다. 프로 팁 : 경우에 그 어느 close ()를 호출하지 않는 단 하나의 창 남아
코리 골드버그

5

close () :-동일한 드라이버 인스턴스로 여러 개의 브라우저 창을 열었다 고 가정합니다. 이제 드라이버 인스턴스에서 close ()를 호출하면 드라이버 인스턴스가 가리키는 현재 창이 닫힙니다. 그러나 드라이버 인스턴스는 여전히 메모리에 남아 있으며 열려있는 다른 브라우저 창을 처리하는 데 사용할 수 있습니다.

quit () :-드라이버 인스턴스에서 quit ()을 호출하고 하나 이상의 브라우저 창이 열려 있으면 열려있는 모든 브라우저 창이 닫히고 드라이버 인스턴스가 가비지 수집됩니다. 즉, 메모리에서 제거됩니다. 이제 quit ()를 호출 한 후이 드라이버 인스턴스를 사용하여 다른 작업을 수행 할 수 없습니다. 그렇게하면 예외가 발생합니다.

dispose () :-WebDriver 인스턴스에 대한 dispose 메서드가 없다고 생각합니다.

이 셀레늄 공식 java doc 링크 를 참조하십시오.


"WebDriver 인스턴스에 대한 폐기 방법이 없다고 생각합니다." 물론 (적어도 C #에는) 있습니다.
EJoshuaS-복원 Monica Monica

5

PhantomJS의 Github 관련 문제에 따라 quit ()는 PhantomJS 프로세스를 종료하지 않습니다. 다음을 사용해야합니다.

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

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

링크


5

close () 는 현재 포커스가있는 브라우저 창을 닫는 웹 드라이버 명령입니다. 이 방법의 익숙한 이름에도 불구하고 인터페이스를 구현 WebDriver하지 않습니다 .AutoCloseable

자동화 프로세스 중에 브라우저 창이 두 개 이상 열려 있으면 close () 명령은 해당 시점에 포커스가있는 현재 브라우저 창만 닫습니다. 나머지 브라우저 창은 닫히지 않습니다. 다음 코드를 사용하여 현재 브라우저 창을 닫을 수 있습니다.

떠나다() 는 driver.dispose 메소드를 호출하는 웹 드라이버 명령으로, 모든 브라우저 창을 닫고 WebDriver 세션을 종료합니다. 프로그램 종료시 quit ()를 사용하지 않으면 WebDriver 세션이 제대로 닫히지 않고 파일이 메모리에서 지워지지 않습니다. 메모리 누수 오류가 발생할 수 있습니다.

자동화 프로세스가 단일 브라우저 창만 열면 close () 및 quit () 명령이 같은 방식으로 작동합니다. 자동화 중에 두 개 이상의 브라우저 창이 열리면 기능이 다릅니다.

이상 참조 : 여기를 클릭하십시오

Dispose 명령 Dispose ()는 Quit ()을 호출해야합니다. 그러나 PhantomJS를 수동으로 닫을 때까지 모든 후속 조치가 차단된다는 점에서도 동일한 문제점이 있습니다.

참조 링크


3

driver.close ()와 driver.quit ()의 차이점

driver.close – 포커스가 설정된 브라우저 창을 닫습니다.

driver.quit – 기본적으로 driver.dispose 메소드를 호출하여 모든 브라우저 창을 닫고 WebDriver 세션을 정상적으로 종료합니다.


2

셀레늄 웹 드라이버

  1. WebDriver.Close()이 방법은 현재 열린 창을 닫는 데 사용됩니다. 드라이버가 포커스를 둔 현재 열린 창을 닫습니다.

  2. WebDriver.Quit()이 메소드는 WebDriver 인스턴스를 파기하는 데 사용됩니다. 해당 드라이버와 관련된 모든 브라우저 창을 닫고 세션을 안전하게 종료합니다. WebDriver.Quit ()는 Dispose를 호출합니다.

  3. WebDriver.Dispose() 이 방법은 모든 브라우저 창을 닫고 세션을 안전하게 종료합니다


4
당신이 무언가를 인용하면 당신은 소스를 제공해야합니다.
Meirion Hughes

2

내 이해는 driver.close();현재 브라우저를 닫고 driver.quit();모든 브라우저를 종료합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.