Jenkins中止构建后仍无法停止Selenium测试执行,如何解决?
问题描述
我在Jenkins的slave机器上配置了构建任务执行Selenium测试,但是当我在测试执行过程中中止Jenkins构建时,Jenkins并没有停止测试执行,ChromeDriver仍在持续运行后续测试。请问有没有办法在构建运行时终止测试执行?
可行解决方案
1. 在测试代码中捕获中止信号,主动关闭Driver
在测试代码里加入信号监听逻辑,一旦收到Jenkins中止构建发出的终止信号(比如SIGTERM),立刻调用driver.quit()来关闭ChromeDriver和浏览器实例,避免进程残留。
Java示例代码:
Runtime.getRuntime().addShutdownHook(new Thread(() -> { if (driver != null) { driver.quit(); } }));
Python示例代码:
import signal from selenium import webdriver driver = webdriver.Chrome() def terminate_test(signal_num, frame): driver.quit() exit(0) # 监听终止和中断信号 signal.signal(signal.SIGTERM, terminate_test) signal.signal(signal.SIGINT, terminate_test)
2. 用Jenkins构建步骤强制清理进程
在Jenkins构建任务中添加清理步骤,在构建中止时直接杀死ChromeDriver和Chrome进程:
- Linux/macOS:添加
Execute shell步骤,执行命令:pkill -f chromedriver pkill -f chrome - Windows:添加
Execute Windows batch command步骤,执行命令:taskkill /F /IM chromedriver.exe taskkill /F /IM chrome.exe
也可以安装Jenkins的Process Killer Plugin,可视化配置在构建中止时杀死指定进程。
3. 修改Jenkins Slave的进程终止策略
Jenkins默认只终止构建主进程,不会清理子进程。可以在Jenkins Slave的启动参数中添加:
-Dorg.jenkinsci.plugins.process_tree_killer.killMode=PROCESS_GROUP
这样中止构建时,Jenkins会杀死整个进程组,包括ChromeDriver这类子进程。
4. 容器化运行测试
将Selenium测试放到Docker容器中执行,当Jenkins中止构建时,直接停止并销毁容器,容器内的所有进程(包括ChromeDriver、浏览器)都会被彻底清理。比如使用Selenium官方的Chrome镜像,构建任务中启动容器运行测试,中止时执行docker stop <容器ID/名称>即可。
内容的提问来源于stack exchange,提问作者PleasePlease
相关产品推荐
相关产品推荐

