Selenium移动模拟本地正常仅Bamboo CI/CD环境运行失败如何解决
排查与解决思路
1. 优先修正明显的配置错误
你的代码存在两处冗余/错误配置,不同环境的ChromeDriver对错误配置的容忍度不同,这是大概率诱因:
- 删掉冗余的重复配置:你同时通过
setCapability("mobileEmulation")和setExperimentalOption("mobileEmulation")设置移动端模拟,仅保留setExperimentalOption即可,mobileEmulation本身属于Chrome的实验性配置,重复设置会导致旧版本ChromeDriver解析配置失败。 - 删掉错误的自嵌套配置:删除
chromeOptions.setCapability(ChromeOptions.CAPABILITY, chromeOptions);这行,ChromeOptions本身就是合法的capability载体,不需要自己嵌套自己,CI环境的ChromeDriver很可能因为这个错误忽略了你的全部配置。 - 修正UserAgent错误:你当前UA里写的是
(iPad; CPU iPhone OS 15_0 like Mac OS X),开头标识为iPad,和你要模拟的iPhone X不符,修改为:String iphoneXUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15A5341f Safari/604.1";
2. 排查CI环境的Chrome启动参数注入
大部分CI/CD平台会全局强制注入Chrome启动参数,你本地注释了--headless不代表CI环境不会加:
- 在CI任务中添加日志打印所有最终生效的Chrome启动参数,确认没有被强制注入
--headless、--user-agent这类会覆盖你配置的参数。 - 如果你确实需要使用无头模式,Chrome 90及更早版本的旧无头模式对移动端模拟支持存在缺陷,可以切换为新无头模式,添加参数
--headless=chrome。
3. 验证请求头是否被CI网络环境篡改
企业CI环境通常会配置出口代理、WAF,可能会修改请求头或者添加额外标识:
- 在测试代码中新增临时逻辑,访问一个可打印请求头的内部测试接口,对比本地运行和CI运行的请求头差异,确认UA、设备相关头是否被篡改。
- 现在多数网站已使用Client Hints替代传统UA做设备识别,你可以添加参数禁用Client Hints避免额外标识泄漏:
args.add("--disable-features=UserAgentClientHint");
4. 替换为内置设备名配置
直接使用Chrome内置的iPhone X设备配置,避免手动写参数的遗漏:
Map<String, Object> mobileEmulation = new HashMap<>(); mobileEmulation.put("deviceName", "iPhone X"); chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulation);
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

