Webdriver.io在Ubuntu虚拟机执行测试时频繁断连的问题求助
看你描述的情况,Mac上headful Chrome跑WDIO测试完全正常,到Ubuntu虚拟机就频繁报connect ECONNREFUSED 127.0.0.1:4444,偶尔能成但用browser.pause(1000)也不靠谱——这个问题我之前帮不少人排查过,主要是虚拟机环境和本地Mac的差异导致的,咱们一步步来解决:
首先明确报错核心:这个错误说明WDIO没法和ChromeDriver(或你用的Selenium Server)建立连接,要么是ChromeDriver没正常启动,要么是启动后因环境问题很快崩溃,或是连接超时。
下面是针对性的解决方案:
1. 确保ChromeDriver和Ubuntu上的Chrome版本严格匹配
Mac和Ubuntu上的Chrome版本大概率不一样,ChromeDriver对版本要求极严,差一个小版本都可能出问题。如果你的WDIO用的是@wdio/chromedriver-service,可以直接开启自动适配:
在wdio.conf.js里修改service配置:
services: [ ['chromedriver', { autoInstall: true, // 自动安装匹配当前Chrome的ChromeDriver版本 args: ['--verbose'] // 可选,开启日志方便排查启动问题 }] ]
如果是手动管理ChromeDriver,去ChromeDriver官网下载和Ubuntu上Chrome版本完全一致的包替换即可。
2. 给Chrome添加适配虚拟机的启动参数
Ubuntu虚拟机(尤其是无界面或资源有限的虚拟机)需要额外的Chrome启动参数才能稳定运行,在wdio.conf.js的capabilities里加上这些:
capabilities: [{ browserName: 'chrome', 'goog:chromeOptions': { args: [ '--no-sandbox', // 禁用沙箱,虚拟机通常没有完整的沙箱环境 '--disable-dev-shm-usage', // 解决/dev/shm空间不足导致Chrome崩溃的问题 '--disable-gpu', // 虚拟机无需GPU加速 '--window-size=1920,1080' // 固定窗口大小,避免元素定位异常 // 若为headful模式运行,虚拟机需启动Xvfb模拟显示,否则Chrome无法启动 ] } }]
如果你的Ubuntu虚拟机是无界面运行headful Chrome,必须先启动Xvfb模拟显示:
# 安装Xvfb sudo apt-get install xvfb # 启动一个显示实例(比如:99) Xvfb :99 -screen 0 1920x1080x24 & # 导出环境变量,让Chrome使用该显示 export DISPLAY=:99
之后再运行WDIO测试。
3. 优化WDIO的连接重试和超时配置
虚拟机资源有限,ChromeDriver启动可能比Mac慢,所以要调整WDIO的连接超时和重试次数:
在wdio.conf.js里添加:
connectionRetryCount: 3, // 连接失败时重试3次 connectionRetryTimeout: 10000, // 每次重试等待10秒 waitforTimeout: 10000, // 元素等待超时时间设为10秒
这样即使第一次连接失败,WDIO会自动重试,不用依赖不可靠的browser.pause。
4. 替换browser.pause为显式等待
browser.pause是硬等待,既不可靠又拖慢测试,换成基于条件的显式等待才是正确做法。比如等待元素显示:
// 等待元素显示,最多等10秒 await $('#target-element').waitForDisplayed({ timeout: 10000 }); // 或者用waitUntil等待某个条件满足 await browser.waitUntil(async () => { const text = await $('#status').getText(); return text === 'Loaded'; }, { timeout: 10000, timeoutMsg: '页面状态未加载完成' });
这样只有当条件满足时才继续执行,比固定暂停靠谱得多。
5. 检查虚拟机的资源分配
如果以上方法都试过还是偶尔失败,那可能是虚拟机的CPU、内存分配太少了。Chrome本身很吃资源,虚拟机至少要分配2核CPU和4GB内存,不然Chrome可能因资源不足崩溃,导致WDIO连接失败。
最后再提一下你遇到的报错:
ERROR: connect ECONNREFUSED 127.0.0.1:4444 chrome at new RuntimeError (/mypath/node_m...
本质就是ChromeDriver没在4444端口正常监听,要么是没启动起来,要么是启动后崩溃了,按照上面的步骤排查,应该能解决问题。
内容的提问来源于stack exchange,提问作者Pavel

