Selenium Grid4.2.1运行测试报无法找到POST /session处理程序异常
异常产生原因
- 触发
Unable to find handler for (POST) /session的核心原因是Selenium Grid请求地址配置错误。Selenium Grid 4.x 采用分布式组件架构,5555是Node节点的内部通信端口,仅用于节点与Hub/Router之间的状态上报、事件同步,不对外提供WebDriver会话服务;所有测试侧的请求(包括创建会话的POST /session接口)必须发送给Router组件的监听端口,Grid 4默认Router端口为4444。当前代码直接将请求发送到Node的5555端口,该端口没有对应路径的请求处理器,直接抛出该异常。 - 现有代码还存在两处会导致后续执行失败的隐患:
- pytest fixture未将初始化完成的driver实例注入测试上下文,用例中调用
self.driver时会直接抛出属性不存在错误 - 代码使用的
DesiredCapabilities.CHROME传参方式在新版Selenium客户端中已被标记为废弃,存在版本兼容问题
- pytest fixture未将初始化完成的driver实例注入测试上下文,用例中调用
排查解决步骤
- 修正Grid连接地址
将代码中grid_url的端口从Node的5555改为Grid Router的监听端口(默认4444),地址格式为http://<Hub部署机器的IP>:4444。地址校验技巧:在浏览器访问
http://<HubIP>:4444/ui,能正常打开Grid控制台页面就说明Router地址和端口连通正常。 - 修复fixture的实例传递逻辑
在fixture中通过request.cls将driver绑定到测试类实例上,保证测试用例可以通过self.driver正常获取驱动对象。 - 替换废弃的配置写法
弃用旧的DesiredCapabilities传参方式,改用ChromeOptions传递浏览器配置,兼容新版Selenium客户端与Grid版本。
修正后的conftest.py代码如下:
import pytest from selenium import webdriver from selenium.webdriver.chrome.options import Options @pytest.fixture() def setup(request): # 替换为实际部署的Grid Router地址 grid_url = "http://192.168.88.189:4444" chrome_options = Options() # 可按需添加启动参数,比如无头模式、禁用沙箱等 driver = webdriver.Remote( command_executor=grid_url, options=chrome_options ) driver.maximize_window() # 绑定driver到测试类实例 request.cls.driver = driver yield driver # quit方法会自动完成驱动、连接的资源释放,无需额外调用close、stop_client driver.quit()
如果修正地址后仍然报错,可以先在Grid控制台确认Chrome节点是否处于正常可用的已注册状态,再检查测试执行机器与Hub机器的4444端口是否存在防火墙、安全组拦截,保证网络连通。
内容的提问来源于stack exchange,提问作者Łukasz Kaznodzieja
相关产品推荐
相关产品推荐

