Selenium控制Chrome协议处理:解决Linux下xdg-open弹窗问题
Linux下Selenium自动化遇到xdg-open弹窗的问题与解决方案
问题背景
在Linux系统下使用Selenium编写Web自动化代码时,遭遇xdg-open弹窗无法通过Selenium API关闭的问题。该弹窗仅提供“始终允许”选项,无拒绝选项,严重干扰自动化流程执行。
尝试过的无效方案
方案1:通过Chrome Preferences配置自动启动协议
在Chrome 129.0版本中,使用以下配置启动Chrome WebDriver:
prefs = {'protocol_handler.policy.auto_launch_protocols_from_origins':[ { 'protocol': 'protocol-name', 'allowed_origins':['https://domain-allowed-calling-this-protocol/'] } ]} ops.add_experimental_option("prefs", prefs)
补充说明:自定义协议名称前无需添加部分网站提及的
web+前缀
问题点:虽能阻止带复选框的自定义协议弹窗,但会自动打开新的空白Chrome窗口,且执行webdriver.quit()后该窗口仍残留。
方案2:禁用网站协议处理功能
在Chrome 129.0图形界面中设置默认行为为Don't allow sites to handle protocols(不允许网站处理协议),对应Chrome的Preferences文件会生成如下配置:
"custom_handlers":{"enabled":false,"ignored_protocol_handlers":[],"registered_protocol_handlers":[]}
问题点:无论通过图形界面手动设置,还是通过Selenium传入该配置,均无法生效,xdg-open弹窗依旧出现。
相关疑问
- 是否有方法在Linux下关闭xdg?
- Chrome的协议处理功能具体如何运作?
- 是否存在其他解决xdg-open弹窗问题的方法?
最终可行解决方案
基于selenium/standalone-chrome:129.0-chromedriver-129.0镜像的Docker容器环境,执行以下步骤:
- 在初始为空的
/etc/opt/目录下创建层级子目录:chrome/policies/managed/ - 在该目录下创建
blocklist.json文件,写入以下内容:
{ "URLBlocklist": ["third-party-protocol-name-1://*", "third-party-protocol-name-2://*"] }
- 重启Chrome后,xdg-open弹窗不再弹出。
内容的提问来源于stack exchange,提问作者YouCL
相关产品推荐
相关产品推荐

