升级Selenium 3后Karma远程单元测试仅Chrome可用问题求助
从你的描述来看,Protractor能正常跑说明Selenium Hub和节点本身是没问题的,问题确实卡在Karma及其WebDriver启动器对Selenium 3的适配细节上。我之前踩过类似的坑,给你几个针对性的解决思路:
一、Firefox 59的配置调整
Firefox从版本55开始强制使用GeckoDriver,而旧的Karma WebDriver启动器可能没有正确处理Selenium 3下的GeckoDriver参数传递。你需要在Karma的customLaunchers里明确添加Firefox的特定capabilities:
customLaunchers: { 'remote_firefox': { base: 'WebDriver', browserName: 'firefox', config: { hostname: '你的Selenium Hub地址', port: 4444 }, platform: 'ANY', version: 'ANY', // 关键:添加GeckoDriver的专属配置 'moz:firefoxOptions': { args: ['--private'] // 可根据你的测试需求调整参数 }, // 显式指定Selenium协议,避免旧启动器默认用Selenium 2的协议 seleniumProtocol: 'WebDriver' } }
另外要确认Selenium节点服务器的环境变量里已经配置了geckodriver的路径,或者在节点配置文件中通过webdriver.gecko.driver参数指定驱动位置。
二、Internet Explorer 11的配置修复
IE的问题核心是Karma启动器没有正确传递Selenium 3下IE驱动的强制配置参数。你需要把节点配置里的IE专属参数同步到Karma的customLaunchers中:
customLaunchers: { 'remote_ie': { base: 'WebDriver', browserName: 'internet explorer', config: { hostname: '你的Selenium Hub地址', port: 4444 }, platform: 'ANY', version: 'ANY', seleniumProtocol: 'WebDriver', // 复制节点配置中的关键IE参数 'ie.ensureCleanSession': true, 'ie.forceCreateProcessApi': true, 'ie.browserCommandLineSwitches': '-private', // Selenium 3下IE驱动的额外必填配置 'ie.enablePersistentHover': false, 'ie.fileUploadDialogTimeout': 30000 } }
旧的Karma启动器不会自动从Hub同步节点的专属配置,必须手动显式传递这些参数才能让IE正常启动测试会话。
三、更换适配Selenium 3的Karma启动器
你尝试的几个启动器(karma-selenium-webdriver等)大多是针对Selenium 2开发的,对Selenium 3的兼容性很差。推荐使用最新版的karma-webdriver-launcher:
先安装最新版本:
npm install karma-webdriver-launcher@latest --save-dev
然后在Karma配置的plugins字段里明确声明启用这个插件:
plugins: [ // 保留你原有其他插件 'karma-webdriver-launcher' ]
四、调试排查技巧
如果还是无法解决,可以开启Karma的调试日志,查看会话创建过程中的细节:
karma start --log-level debug
重点关注WebDriver会话创建的请求内容,对比Protractor的请求(可以用抓包工具如Fiddler捕获),看看Karma有没有遗漏关键的capabilities参数。同时检查Selenium Hub的日志,确认Karma发送的请求是否被节点正常接收,有没有报错信息——这往往能快速定位到具体的参数问题。
内容的提问来源于stack exchange,提问作者cis

