Selenium:如何在不调用 driver.quit() 的情况下停止 geckodriver 进程影响 PC 内存?
- 2024-12-04 08:56:00
- admin 原创
- 194
问题描述:
有一个测试,类似于:
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”的进程(更准确地说 - 做一些事情,将关闭 taskmgr 中的 geckodriver.exe 进程),但在测试完成后不会关闭浏览器?例如,在测试本身中添加一些方法,无论如何......这不会影响我的工作/测试本身,我只是想添加一些优化。
解决方案 1:
根据您的问题,注释掉driver.quit()
并不是Not to close firefox window after each run, because I just want to analyse what I have
最佳实践的一部分。
对于任何详细的分析,我们可以创建日志条目并拍摄快照。
Selenium
按照最佳实践进行自动化时,您应该quit()
在 中调用该方法tearDown() {}
。通过发送带有{"flags":["eForceQuit"]}的“退出”命令来调用当前浏览会话,最后在/shutdown上发送GET请求。下面是一个例子:quit()
DELETE
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()