Selenium:如何在不调用 driver.quit() 的情况下停止影响 PC 内存的 geckodriver 进程?

Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?

有个测试,好像是:

 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();
   //}
}

因此,我启动了 geckodriver,并使用 firefox 实例成功地 运行 进行了我的测试。 但我不想在每次 运行 后关闭 firefox window,因为我只想分析我拥有的东西,并在测试后修复任何需要的东西 运行(我要取消注释 driver.quit() 之后)。 同时,每次在不关闭驱动程序的情况下调用都会导致对我 PC 上的 RAM 产生过度影响(这无关紧要 - 我是否在测试后手动关闭了浏览器):

所以,问题是: 有什么方法可以关闭 "geckodriver" 的进程(更准确地说 - 做 smth,这将关闭 taskmgr 中的 geckodriver.exe 进程),但不会在测试完成后关闭浏览器?例如,在测试本身中添加一些方法,无论如何......这不会影响我的 work/test 本身,我只是想添加一些优化。

根据您的问题,注释掉 driver.quit() 只是 Not to close firefox window after each run, because I just want to analyse what I have 不会成为最佳实践的一部分。

对于任何详细分析,我们可以创建日志条目并拍摄快照。

根据最佳实践通过 Selenium 进行自动化时,您应该在tearDown() {}。通过发送 "quit" 命令和 调用 quit() DELETEs 当前浏览会话{"flags":["eForceQuit"]} 最后在 /shutdown 上发送 GET 请求 EndPoint。下面是一个例子:

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 实例,例如GeckoDriver.exe 实例您可以使用以下任一代码块来杀死任何悬空的 WebDriver 实例:

  • Java解(Windows):

    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解法(Windows):

    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()