macOS环境下使用Selenium WebDriver调用Chrome获取地理位置失败咨询
macOS GitHub Actions Chrome地理定位失败解决方案
根因说明
macOS 10.15+的系统权限策略与Ubuntu、Windows不同,默认禁止无UI交互的自动化Chrome读取系统位置服务,同时Chrome默认的地理定位权限弹窗在CI无头模式下无法被手动触发允许,因此会出现获取不到坐标的问题。
可行方案
方案1:代码层面强制覆盖(兼容性最高,推荐)
直接通过Chrome参数和Selenium 4的CDP能力绕过系统位置服务依赖,无需修改CI配置,全平台通用:
- 初始化
ChromeOptions时新增权限配置,默认授予地理定位权限:
ChromeOptions options = new ChromeOptions(); Map<String, Object> prefs = new HashMap<>(); // 1表示允许地理定位权限,2为拒绝,0为询问 prefs.put("profile.default_content_setting_values.geolocation", 1); options.setExperimentalOption("prefs", prefs);
- 初始化Driver后调用CDP接口强制覆盖地理位置,无需依赖系统位置服务返回值:
DevTools devTools = ((ChromeDriver) driver).getDevTools(); devTools.createSession(); // 三个参数分别为自定义纬度、经度、定位精度,可按测试需求修改 devTools.send(Emulation.setGeolocationOverride( Optional.of(40.7128), Optional.of(-74.0060), Optional.of(100)) );
方案2:CI配置层面修改系统权限
如果不想修改测试代码,可以在GitHub Actions的macOS执行步骤中新增权限配置:
在对应job的steps中新增如下步骤:
- name: 配置macOS Chrome地理定位权限 if: runner.os == 'macOS' run: | # 修改Chrome配置默认允许地理定位 mkdir -p ~/Library/Application\ Support/Google/Chrome/Default/ echo '{"profile": {"default_content_setting_values": {"geolocation": 1}}}' > ~/Library/Application\ Support/Google/Chrome/Default/Preferences # 开启系统位置服务对Chrome的授权 sudo defaults write /Library/Preferences/com.apple.locationd.plist Authorized -bool true sudo defaults write com.apple.locationd ClientAuthorization -dict-add "com.google.Chrome" -int 2 sudo killall locationd
额外注意
你当前使用的Selenium 4.0.0-rc-1预览版存在macOS Chrome CDP接口兼容性问题,配置后如果仍失败,建议将Selenium依赖升级到4.0.0正式版及以上,该版本已修复对应兼容缺陷。
内容的提问来源于stack exchange,提问作者Boni García
相关产品推荐
相关产品推荐

