Selenium Grid(Java)中maxSession无法限制浏览器会话为1的问题
maxSession=1 却仍并行运行多测试的问题 嘿,这个问题我之前帮不少人排查过,核心是Selenium Grid的几个配置项没配合好,加上你用了自定义Firefox二进制,咱们一步步来解决:
为什么会出现这种情况?
你设置了maxSession=1,这个参数本来是控制单个Node同时运行的最大会话数,但如果没给你用的自定义Firefox明确限制实例数,Grid可能会用默认的maxInstances值(通常是5),这时候即使全局maxSession=1,也可能因为浏览器实例配置没跟上,导致限制失效。另外,你用的是复制的Firefox二进制,如果没在Node启动时指定路径,Grid可能没正确识别这个浏览器实例的唯一性,进一步加剧了问题。
具体解决方案
1. 启动Node时明确指定Firefox的配置参数
修改你的启动命令,加上针对Firefox的实例限制和自定义二进制路径,这样Grid能准确识别并应用限制:
java -jar ${jarLocation} -role webdriver -hub ${hubRegisterURL} -port ${port} -log ${gridNodeLog} -maxSession 1 -browser browserName=firefox,maxInstances=1,firefoxBinary=/绝对路径/到/你复制的Firefox二进制文件
这里要注意:
firefoxBinary的值必须是绝对路径,确保Node能访问到这个文件browser参数里的逗号分隔不能加空格,否则Grid会解析失败
2. 检查TestNG的并行配置
确认你的TestNG套件的并行模式:如果是methods级别的并行,可能会一次性发送多个请求到Grid,这时候要确保Grid的限制和TestNG的线程数匹配。另外,一定要在每个测试方法结束后显式关闭Driver实例,避免会话残留导致Grid误判当前可用会话数。
3. 验证Node的注册状态
启动Node后,打开Grid Hub的控制台(比如http://你的Hub地址:端口/grid/console),找到这个Node的配置卡片,确认maxSession和Firefox对应的maxInstances都显示为1。如果配置不对,说明启动命令的参数格式有问题,再检查一遍路径和参数分隔符。
4. 适配旧版Selenium Grid(如果适用)
如果你用的是Selenium 3.x及更早版本,firefoxBinary参数可能不生效,需要换成JVM参数指定:
java -Dwebdriver.firefox.bin=/绝对路径/到/自定义Firefox -jar ${jarLocation} -role webdriver -hub ${hubRegisterURL} -port ${port} -log ${gridNodeLog} -maxSession 1 -browser browserName=firefox,maxInstances=1
这样调整后,应该就能让Node严格遵守maxSession=1的限制,不会再并行启动多个浏览器实例了。
内容的提问来源于stack exchange,提问作者Ravikiran Kulkarni

