web-dev-qa-db-ja.com

セレン:driver.quit()を呼び出さずに、PCのメモリに影響を与えるgeckodriverプロセスを停止する方法は?

次のようなテストがあります。

 import //needed imports

 public class TestClass{
    WebDriver driver;

    @Before
    public void setUp() {
       //some code
    }

    @Test
    public void test1() {
       //some code, including init of driver (geckodriver)
    }

   //@After
   // public void tearDown() {
   //  driver.quit();
   //}
}

そこで、Firefoxインスタンスを使用してgeckodriverを初期化し、テストを正常に実行しました。しかし、実行後は毎回firefoxウィンドウを閉じないようにしたいのは、テストの実行後、自分が持っているものを分析し、必要に応じて修正したいだけだからです(後でuncomment driver.quit()にします)。同時に、ドライバーを閉じずに呼び出すたびに、RAMが私のPCに影響を及ぼします(テスト後、ブラウザーを手動で閉じたかどうかは関係ありません):- enter image description here

だから、質問です:「geckodriver」のプロセス(より正確には-taskmgrのgeckodriver.exeプロセスを閉じるsmthを実行します)を閉じる方法はありますが、テストの終了後にブラウザーを閉じませんか?たとえば、テスト自体に何らかのメソッドを追加するなど、これは私の作業/テスト自体には影響しません。最適化を追加したいだけです。

9
Dmitry

あなたの質問によると、コメントアウトdriver.quit()だけ_Not to close firefox window after each run, because I just want to analyse what I have_は、ベストプラクティスの一部ではありません。

詳細な分析の場合、ログエントリを作成してスナップショットを取得できます。

Seleniumを使用して自動化しているときに、ベストプラクティスに従って、quit()メソッドがtearDown() {}内にあります。 quit()DELETEsを呼び出して、現在のブラウジングセッションを送信 "quit"で呼び出していますコマンドに{"flags":["eForceQuit"]}を指定して、最後に[〜#〜] get [〜#〜]リクエスト/ shutdownEndPoint。以下に例を示します。

_1503397488598   webdriver::server   DEBUG   -> DELETE /session/8e457516-3335-4d3b-9140-53fb52aa8b74 
1503397488607   geckodriver::marionette TRACE   -> 37:[0,4,"quit",{"flags":["eForceQuit"]}]
1503397488821   webdriver::server   DEBUG   -> GET /shutdown
_

したがって、quit()メソッドを呼び出すと、_Web Browser_セッションとWebDriverインスタンスが完全に終了します。したがって、オーバーヘッドとなる追加の手順を組み込む必要はありません。


この質問への回答:

それでも実行したい場合は、ダングリングWebDriverインスタンスをkillしてください。 _GeckoDriver.exe_インスタンス次のコードブロックのいずれかを使用して、ダングリングWebDriverインスタンスを強制終了できます。

  • Javaソリューション(WindowsOS固有):

    _import Java.io.IOException;
    
    public class Kill_ChromeDriver_GeckoDriver_IEDriverserver 
    {
        public static void main(String[] args) throws Exception 
        {
            Runtime.getRuntime().exec("taskkill /F /IM geckodriver.exe /T");
            Runtime.getRuntime().exec("taskkill /F /IM chromedriver.exe /T");
            Runtime.getRuntime().exec("taskkill /F /IM IEDriverServer.exe /T");
        }
    }
    _
  • Pythonソリューション(WindowsOS固有):

    _import os
    os.system("taskkill /f /im geckodriver.exe /T")
    os.system("taskkill /f /im chromedriver.exe /T")
    os.system("taskkill /f /im IEDriverServer.exe /T")
    _
  • Pythonソリューション(クロスプラットフォーム):

    _import os
    import psutil
    
    PROCNAME = "geckodriver" # or chromedriver or IEDriverServer
    for proc in psutil.process_iter():
        # check whether the process name matches
        if proc.name() == PROCNAME:
            proc.kill()
    _
9
DebanjanB