Selenium Grid4通过ngrok组网测试时RemoteWebDriver抛出JsonException异常
异常产生原因
你遇到的org.openqa.selenium.json.JsonException: Unable to determine type from: R错误,核心原因是Selenium组件收到了非JSON格式的响应,首字符R来自ngrok默认HTTP/HTTPS隧道返回的重定向报文或者错误HTML页面的开头内容,具体触发场景如下:
- Selenium Grid 4的Node注册时,你配置的
--host和--port对应的是ngrok的HTTP隧道地址,ngrok默认会将80端口的HTTP请求301/302重定向到HTTPS端口,Selenium Grid的内部通信默认不会处理3xx重定向,直接将重定向响应内容当作JSON解析触发报错 - 你转发Hub的4442、4443、4444端口时如果使用了HTTP隧道,Selenium Grid事件总线基于TCP协议的报文会被HTTP隧道插入额外的请求头/响应头,导致报文格式损坏无法解析
解决方案
按照以下步骤调整配置即可解决:
- Hub侧端口转发全部改用TCP隧道
停止原有ngrok进程,分别为Hub的3个端口启动TCP转发,示例命令:
记录每个TCP隧道的对外地址,比如ngrok tcp 4442 ngrok tcp 4443 ngrok tcp 44441.tcp.ngrok.io:20001对应4442端口,1.tcp.ngrok.io:20002对应4443端口,1.tcp.ngrok.io:20003对应4444端口。 - Node侧端口转发改用TCP隧道
停止Node侧原有ngrok进程,为Node的服务端口启动TCP转发,示例命令(本地端口可自定义未占用端口即可):
记录Node侧TCP隧道的对外地址,比如ngrok tcp 55552.tcp.ngrok.io:30001。 - 调整Node启动参数
替换原有启动命令中的事件总线地址、Node对外地址参数:java -jar "selenium-server-4.0.0.jar" node --detect-drivers true --publish-events tcp://1.tcp.ngrok.io:20001 --subscribe-events tcp://1.tcp.ngrok.io:20002 --host 2.tcp.ngrok.io --port 30001 - 调整测试代码连接地址
将RemoteWebDriver的连接地址改为Hub的4444端口对应TCP隧道地址,使用http协议:URL url = new URL("http://1.tcp.ngrok.io:20003/wd/hub");
调整完成后先访问Hub的/status接口,确认Node已正常注册且Node的对外地址为TCP隧道地址,再执行测试即可正常运行。
内容的提问来源于stack exchange,提问作者Программер
相关产品推荐
相关产品推荐

