webdriver.Dispose()、. Close()、. Quit()の違い


285

これらの違いは何ですか

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

どちらをいつ使用しますか?


2
#disposeメソッドはWebDriver APIから静かに削除されたようです。変更ログには言及がありません。私が見つけた最新の言及はv2.26 api docsで、これ以上リンクを見つけることができません。
jordanpg 2015

以下の回答で、混乱の原因がわかります。上記のメソッド(閉じる、終了、破棄)は小文字(java)ではなく大文字(C#)で始まるため、この質問は元々C#の質問だったと思います。DisposeはC#WebDriverクライアントバインディングから削除されていません。
rcasady616 2016

Disposeは.Netパターンであるため、SeleniumのAPIドキュメントには記載されていません。RemoteWebDriverでは、QuitはDisposeを呼び出し、Quitコマンド(DELETE / session / {sessionId})を送信します。クライアント側には、Quitコマンドがインターセプトされる場所がいくつかあります。たとえば、FirefoxDriver .net実装は、プロセスが正常にシャットダウンしない場合、実際にはprocess.Kill()を呼び出します。
Tamir Daniely、2018年

回答:


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()メソッドを使用しないでください。

注意:
仮想マシンのハードドライブ領域が不足している理由に関連する問題を解明しようとしたときに、この質問が見つかりました。例外により、実行ごとにQuit()またはDispose()が呼び出されず、appDataフォルダーがハードドライブをいっぱいにしていたことが判明しました。したがって、Quit()メソッドを正しく使用していましたが、コードに到達できませんでした。まとめ例外セーフパターンを使用するか、IDisposableを実装することにより、すべてのコードパスがアンマネージオブジェクトをクリーンアップすることを確認します

また
、RemoteDriverの場合、Quit()またはDispose()を呼び出すと、Selenium Serverのセッションも閉じます。セッションが閉じられていない場合、そのセッションのログファイルはメモリに残ります。


例外をどのように更新しましたか?それぞれに行き、quit()を追加するだけですか?
Mark Mayo

1
NUnit、JUnitなどのテストフレームでは、Dispose()がTestTeardown()またはTestFixtureTeardown()にあることを確認するだけで済みます。C#では、「using」ステートメントを使用するだけで、例外が発生した場合は常にDisposeが呼び出されます。最終的にtry catchを使用してDisposeをfinallyに配置することで、Javaで同様のことを行うことができます。
rcasady616 2013

1
@ rcasady616これは私が得た最高の説明です。ありがとうございます。賛成票を投じる価値があると思います。
2017年

2
@ Mr.Bultitude、それは理解できる、違いないことを考えると理解できる^^この回答によるQuit()と、リダイレクトはDispose()
PixelMaster

1
@PixelMaster、はい、100%正しいです。基本的にはリダイレクトです。Seleniumでコードを記述した人ではないので、C#クライアントバインディングに両方のメソッドが存在する理由を推測することしかできません。おそらく、クライアント言語間で「Quitting」するための共通のメソッドを維持したいと考えていますが、「using」ステートメント構文でドライバーを使用したいと考えていました(魔女はDispose()メソッドが必要です)。それが私の推測では、それかコードをクリーンアップする必要があります。
rcasady616

47

Close() -現在フォーカスされているブラウザまたはページを閉じるために使用されます。

Quit() -Webドライバーインスタンスをシャットダウンまたは破棄するために使用されます(すべてのウィンドウを閉じます)。

Dispose() -私はこの方法を知りません。


3
.NET言語バインディングを使用している場合、QuitおよびDisposeメソッドは互いに同義である必要があります。つまり、をQuit呼び出しますDispose
JimEvans 2013

22

driver.closeおよびdriver.quitは、Selenium WebDriverでブラウザセッションを閉じるための2つの異なる方法です。これらの両方を理解し、各メソッドをいつ使用するかを知ることは、テストの実行において重要です。したがって、私はこれらの方法の両方にいくつかの光を当てようとしました。

driver.close-このメソッドは、フォーカスが設定されているブラウザウィンドウを閉じます。このメソッドはおなじみの名前ですが、WebDriverインターフェースを実装していませAutoCloseable

driver.quit–このメソッドは基本的にdriver.dispose、現在は内部メソッドを呼び出し、次にすべてのブラウザーウィンドウを閉じ、WebDriverセッションを正常に終了します。

driver.dispose-前に述べたように、WebDriverの内部メソッドであり、別の回答に従ってサイレントにドロップされました-検証が必要です。通常のテストワークフローでは、この方法には実際にはユースケースがありません。ほとんどのユースケースでは、前の方法のどちらでも機能するはずです。

説明の使用例:driver.quitプログラムを終了するときはいつでも使用する必要があります。開いているすべてのブラウザウィンドウを閉じ、WebDriverセッションを終了します。driver.quitプログラムの最後にを使用しないと、WebDriverセッションが適切に閉じず、ファイルがメモリから消去されません。これにより、メモリリークエラーが発生する可能性があります。

上記の説明では、との違いを説明しなければならないdriver.closedriver.quitwebdriverをのメソッドを。お役に立てれば幸いです。

次のWebサイトには、セレンテストに関するヒントがいくつかあります。リンク


14

quit():このドライバーを終了し、開いていたすべての関連ウィンドウを閉じます。

close() :現在開いている最後のウィンドウの場合は、ブラウザを終了して、現在のウィンドウを閉じます。


この答えは重要な違いを見逃しています。quit()は基になるwebdriverサービスを停止しますが、close()は停止しません。プロのヒント:ウィンドウが1つだけ残っている場合は、close()を呼び出さないでください
Corey Goldberg

5

close():-同じドライバーインスタンスで複数のブラウザーウィンドウを開いたとします。ドライバーインスタンスでclose()を呼び出すと、ドライバーインスタンスが指している現在のウィンドウが閉じます。ただし、ドライバインスタンスはメモリに残り、開いている他のブラウザウィンドウを処理するために使用できます。

quit():-ドライバーインスタンスでquit()を呼び出し、1つ以上のブラウザーウィンドウが開いている場合、開いているすべてのブラウザーウィンドウが閉じ、ドライバーインスタンスはガベージコレクションされます。つまり、メモリから削除されます。そのため、このドライバインスタンスを使用して、quit()を呼び出した後に他の操作を実行することはできません。これを行うと、例外がスローされます。

dispose():-WebDriverインスタンスのdisposeメソッドはないと思います。

このセレンの公式java doc リンクにアクセスして参照できます。


「WebDriverインスタンスにdisposeメソッドがあるとは思いません。」確かにあります(少なくともC#では)。
EJoshuaS-2017年

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コマンドです。このメソッドはおなじみの名前ですが、WebDriverインターフェースを実装していませAutoCloseable

自動化プロセス中に、複数のブラウザーウィンドウが開いている場合、close()コマンドは、その時点でフォーカスされている現在のブラウザーウィンドウのみを閉じます。残りのブラウザウィンドウは閉じられません。次のコードを使用して、現在のブラウザウィンドウを閉じることができます。

quit()は、driver.disposeメソッドを呼び出すwebdriverコマンドであり、すべてのブラウザーウィンドウを閉じ、WebDriverセッションを終了します。プログラムの最後でquit()を使用しない場合、WebDriverセッションは適切に閉じられず、ファイルはメモリからクリアされません。これにより、メモリリークエラーが発生する可能性があります。

オートメーションプロセスがブラウザウィンドウを1つだけ開く場合、close()コマンドとquit()コマンドは同じように機能します。オートメーション中に複数のブラウザウィンドウが開かれている場合、どちらの機能も異なります。

上記の参照:ここをクリック

Disposeコマンド Dispose()はQuit()を呼び出す必要があり、そのように見えます。ただし、PhantomJSを手動で閉じるまで後続のアクションがブロックされるという同じ問題もあります。

参照リンク


3

driver.close()とdriver.quit()の違い

driver.close –フォーカスが設定されているブラウザーウィンドウを閉じます。

driver.quit –基本的にdriver.disposeメソッドを呼び出します。このメソッドはすべてのブラウザウィンドウを閉じ、WebDriverセッションを正常に終了します。


2

Selenium WebDriver

  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.