Selenium Grid节点注册Jenkins Hub时遇WebDriverException错误求助
从你的描述和日志来看,虽然节点控制台显示“已注册到Hub并可使用”,但核心问题出在重复出现的警告:hudson.plugins.selenium.JenkinsCapabilityMatcher无法强制转换为实例,这个类转换错误是导致会话转发失败的根本原因。结合你的环境信息,我整理了以下针对性的解决方案:
1. 统一Selenium版本,匹配Jenkins插件与节点Jar包
Jenkins的Selenium Grid插件会自带特定版本的Selenium类库,如果你使用的独立节点Jar包(3.12.0)和插件内置的Selenium版本不匹配,就会出现自定义类(JenkinsCapabilityMatcher)无法识别的问题:
- 检查Jenkins上Selenium Grid插件的版本,确保节点使用的
selenium-server-standalone-*.jar版本和插件内置版本完全一致; - 如果插件版本较低,建议升级插件到与节点Jar对应的版本,或者降级节点Jar到插件兼容的版本。
2. 在节点配置中指定默认CapabilityMatcher
强制节点使用Selenium原生的匹配器,避免加载Jenkins插件的自定义类:
修改你的node.json,添加capabilityMatcher字段:
{ "capabilities": [ { "browserName": "firefox", "maxInstances": 5, "seleniumProtocol": "WebDriver" }, { "browserName": "chrome", "maxInstances": 5, "seleniumProtocol": "WebDriver" }, { "browserName": "internet explorer", "maxInstances": 1, "seleniumProtocol": "WebDriver" } ], "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "maxSession": 5, "port": 17946, "register": true, "registerCycle": 5000, "hub": "http://jenkins.us.abc.edu:4444", "nodeStatusCheckTimeout": 5000, "nodePolling": 5000, "role": "node", "unregisterIfStillDownAfter": 60000, "downPollingLimit": 2, "debug": false, "servlets" : [], "withoutServlets": [], "custom": {}, "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher" }
修改后重启节点,这个配置会让节点忽略Jenkins插件的自定义匹配器,使用Selenium默认实现,直接解决类转换错误。
3. 验证Hub与节点的网络连通性
节点能注册到Hub是因为节点主动连接Hub,但会话转发是Hub主动连接节点,所以要确保:
- 节点的17946端口对Hub机器开放,没有防火墙或安全组拦截;
- 在Hub机器上执行
telnet 节点IP 17946,测试是否能连通,不通的话需要调整网络规则。
4. 修正启动命令的拼写错误
你的启动命令里有个笔误:selenium-rver-standalone-3.12.0.jar应该是selenium-server-standalone-3.12.0.jar,虽然可能只是输入错误,但修正后避免不必要的问题:
java -jar -Dwebdriver.chrome.driver=chromedriver selenium-server-standalone-3.12.0.jar -role node -nodeConfig node.json
5. 确认chromedriver的权限与路径
确保节点机器上的chromedriver有可执行权限:
chmod +x chromedriver
同时确认启动命令中指定的路径正确,如果chromedriver不在当前目录,要写绝对路径,比如-Dwebdriver.chrome.driver=/path/to/chromedriver。
按照以上步骤逐一排查,应该能解决会话转发的错误。
内容的提问来源于stack exchange,提问作者Uday

