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

问题描述 投票:0回答:2

有一个测试,例如:

 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() )。 同时,每次调用而不关闭驱动程序都会导致对我的电脑上的 RAM 产生过度影响(并且无关紧要 - 在测试后我是否手动关闭浏览器):

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

java python selenium firefox geckodriver
2个回答
23
投票

根据您的问题注释

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 是当前浏览会话,最后在 /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()
    

0
投票

在Python中,

当手动关闭 Selenium 驱动的浏览器窗口时,您可以结合使用信号处理和子进程来优雅地终止 Python 脚本。首先,设置一个信号处理程序来捕获 SIGINT (Ctrl+C) 并定义一个函数来处理浏览器关闭事件。在此函数中,不断检查浏览器窗口是否关闭。如果是,请使用 os.kill() 终止主脚本进程及其子进程。这是一个最小的例子:


import signal
import sys
import os
import subprocess
import threading
from selenium import webdriver

# Function to handle browser close event
def browser_close_handler():
    global driver, main_pid
    while True:
        if not driver:
            break
        try:
            driver.title
        except:
            os.kill(main_pid, signal.SIGTERM)

# Signal handler function
def signal_handler(sig, frame):
    global driver
    if driver:
        driver.quit()
    sys.exit(0)

# Register signal handler for SIGINT (Ctrl+C)
signal.signal(signal.SIGINT, signal_handler)

if __name__ == "__main__":
    main_pid = os.getpid()

    # Start Chrome WebDriver session
    driver = webdriver.Chrome()
    
    # Start a separate thread for browser close event handling
    browser_close_thread = threading.Thread(target=browser_close_handler)
    browser_close_thread.start()

    # Main processing logic here
© www.soinside.com 2019 - 2024. All rights reserved.