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

Posted

技术标签:

【中文标题】Selenium:如何在不调用 driver.quit() 的情况下停止影响 PC 内存的 geckodriver 进程?【英文标题】:Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()? 【发布时间】:2018-06-08 12:50:05 【问题描述】:

有一个测试,smth like:

 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 造成过度影响(这无关紧要 - 我是否在测试后手动关闭了浏览器):

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

【问题讨论】:

试试这个从任务列表中杀死进程 - ***.com/questions/81902/…. 【参考方案1】:

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

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

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

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

【讨论】:

psutils 方法救了我……我挠头这么久……谢谢!

以上是关于Selenium:如何在不调用 driver.quit() 的情况下停止影响 PC 内存的 geckodriver 进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]

如何在不使用pip或conda安装的情况下链接Selenium等库?

如何在不需要自定义库的情况下在 Google Colabs 上使用 Selenium IDE,例如科拉?

在不使用 Selenium 的情况下将 ChromeDriver 与 WebDriverIO 一起使用

Selenium 在不使用 XPath 的情况下从已经给定的元素中查找近元素

如何使用 C# Selenium 调用 JS onclick 函数和参数