Selenium+Spectron运行Electron测试报Chrome启动失败DevToolsActivePort错误
Selenium+Spectron Electron自动化测试启动失败修复方案
问题场景
使用Selenium搭配Spectron开展Electron应用自动化测试,已添加--headless、--no-sandbox、--disable-dev-shm-usage等常规启动参数,执行测试时仍抛出Chrome启动失败、DevToolsActivePort文件不存在的报错。
原测试代码
const webdriver = require('selenium-webdriver'); var Application = require('spectron').Application; var assert = require('assert'); const driver = new webdriver.Builder() // 9515为chrome driver默认监听端口 .usingServer('http://localhost:9515') .withCapabilities({ 'goog:chromeOptions': { // 原配置指向系统Chrome二进制路径 binary: 'C:/Program Files/Google/Chrome/Application/chrome.exe', }, }) .forBrowser('electron') // selenium-webdriver <=3.6.0版本需指定浏览器为electron .build(); describe('Application launch', function () { var app; jest.setTimeout(30000); beforeEach(function () { app = new Application({ path: 'node_modules/.bin/electron', args: ['--headless', '--no-sandbox', '--disable-dev-shm-usage'], }); return app.start(); }); afterEach(function () { if (app && app.isRunning()) { return app.stop(); } }); it('click a button', function* () { yield driver.sleep(5000); }); });
原始报错信息
yarn run v1.22.19 warning package.json: License should be a valid SPDX license expression warning ..\..\..\package.json: No license field $ jest --NODE_ENV=test FAIL src/__test__/App.spec.jsx (10.623 s) Application launch × click a button (6564 ms) ● Application launch › click a button Failed to create session. unknown error: Chrome failed to start: was killed. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location C:\Users\vipul\appname\src\node_modules\spectron\lib\launcher.bat is no longer running, so ChromeDriver is assuming that Chrome has crashed.) at startWebDriverSession (src/node_modules/webdriver/build/utils.js:72:15) at Function.newSession (src/node_modules/webdriver/build/index.js:58:45) at Object.remote (src/node_modules/webdriverio/build/index.js:73:22) Test Suites: 1 failed, 1 total Tests: 1 failed, 1 total Snapshots: 0 total Time: 11.878 s Ran all test suites. error Command failed with exit code 1.
根因分析与修复步骤
报错核心是代码逻辑冲突、配置错误导致Electron进程启动后立刻退出,ChromeDriver无法连接到调试端口,按以下步骤逐一排查修复:
- 移除冗余的手动Selenium Driver初始化逻辑:代码中手动创建的
webdriver.Builder实例与Spectron的Application启动逻辑完全冲突,Spectron本身会自动拉起版本匹配的ChromeDriver、管理会话连接,不需要手动指定9515端口服务,也不需要单独构建driver实例。原代码中手动配置的binary指向系统安装的Chrome浏览器,并非Electron二进制,是启动失败的核心诱因之一。 - 修正Windows环境下的Electron路径配置:原代码中
path字段填写的node_modules/.bin/electron是npm生成的启动脚本(即报错中提到的launcher.bat),并非实际的Electron可执行文件,需要将路径改为node_modules/electron/dist/electron.exe,直接指向真实二进制,避免拉起脚本进程后立刻退出被ChromeDriver判定为崩溃。 - 补全Windows无头模式必填启动参数:Windows环境下无头运行Electron/Chrome仅加三个基础参数不够,需要补充
--disable-gpu、--remote-debugging-port=9222、--window-size=1280,720参数,解决GPU进程异常、调试端口未正常初始化导致的DevToolsActivePort file doesn't exist报错。同时args中需要添加自身Electron应用的主入口文件路径,否则Electron启动后会因无加载目标直接退出。 - 校验版本匹配关系:确认本地安装的Spectron版本与Electron版本严格对应,版本错位会导致内置ChromeDriver与Electron集成的Chrome版本不兼容,启动即崩溃。
- 排查路径与权限问题:如果项目路径包含中文、特殊字符,或者运行测试的终端没有项目目录读写权限,也会导致进程被系统拦截杀死,可将项目移动到纯英文无特殊字符的路径下,以管理员权限启动终端执行测试验证。
修复后可运行示例代码
var Application = require('spectron').Application; var assert = require('assert'); describe('Application launch', function () { var app; jest.setTimeout(30000); beforeEach(function () { app = new Application({ // Windows下直接指向dist目录内的真实electron可执行文件 path: 'node_modules/electron/dist/electron.exe', args: [ '--headless', '--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu', '--remote-debugging-port=9222', '--window-size=1280,720', // 替换为自身项目的Electron主进程入口路径 './main.js' ], startTimeout: 10000 }); return app.start(); }); afterEach(function () { if (app && app.isRunning()) { return app.stop(); } }); it('click a button', async function () { // 直接通过Spectron内置的app.client调用webdriverio接口操作页面 await app.client.pause(5000); // 后续页面交互逻辑(如按钮点击)直接基于app.client实现即可 }); });
内容的提问来源于stack exchange,提问作者Vipul Learning
相关产品推荐
相关产品推荐

