有一个测试,像这样:

 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的过度影响(并且没关系-我是否在测试后手动关闭了浏览器):
java -  Selenium : How to stop geckodriver process impacting PC memory,而不调用driver.quit()吗?-LMLPHP

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

最佳答案

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

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

在按照最佳做法通过 Selenium 自动化时,您应该在quit()中调用 tearDown() {} 方法。通过使用 {“flags”:[“eForceQuit”]} 发送“quit” 命令来调用 quit() DELETE,从而在当前浏览 session 中调用,并最终在上发送 GET shut_rstrong请求。下面是一个示例:

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

因此,在调用 EndPoint 方法时,quit() session 和Web Browser实例被完全杀死。因此,您不必合并任何其他步骤,而这将是额外的开销。

解决方案

仍然,如果您想执行杀死悬空的WebDriver实例,例如 WebDriver 实例,您可以使用以下任一代码块杀死任何悬空的GeckoDriver.exe实例:
  • 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()
    
  • 关于java - Selenium : How to stop geckodriver process impacting PC memory,而不调用driver.quit()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47999568/

    10-10 05:08