硒 : 如何停止 geckodriver 进程影响 PC 内存, 而不调用 driver.quit()?

2022-09-04 08:11:59

有一个测试,smth就像:

 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窗口,因为我只想在测试运行后分析我所拥有的内容,并修复任何需要的东西(我稍后会取消注释driver.quit()。同时,每次调用而不关闭驱动程序都会导致对PC上的RAM产生过度影响(没关系 - 测试后我是否手动关闭浏览器):enter image description here

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


答案 1

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

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

在按照最佳实践自动通过Selenium时,您应该在.通过发送带有{“flags”:[“eForceQuit”]}“quit”命令来调用当前浏览会话,并最终在/shutdown上发送GET请求。下面是一个例子:tearDown() {}DELETEEndPoint

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 BrowserWebDriver


溶液

不过,如果你想执行杀死悬空的实例,例如GeckoDriver.exe实例,你可以使用以下代码块中的任何一个来杀死任何悬空的实例:WebDriverWebDriver

  • Java Solution(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 Solution (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()
    

答案 2

推荐