Bonigarcia/WebDriverManager最新版在公司代理及Azure DevOps Pipeline环境下无法访问Selenium驱动的问题解决咨询
我正在使用最新版本的bonigarcia/webdrivermanager,不管是在公司VPN环境里,还是Azure DevOps Pipeline的托管代理服务器上,都没法访问驱动API站点来下载驱动程序,比如这两个地址都访问不了:
- MS Edge WebDriver:
http://msedgedriver.azureedge.net:443 - Chrome WebDriver:
chromedriver.storage.googleapis.com:443
我的初始化代码是这样的:
new DriverManager().SetUpDriver(new ChromeConfig(), VersionResolveStrategy.MatchingBrowser);
在Pipeline运行时会抛出这个错误:
2022-07-28T13:00:34.7272320Z Starting test execution, please wait...
2022-07-28T13:00:34.7980370Z A total of 1 test files matched the specified pattern.
2022-07-28T13:00:42.8980608Z Failed VerifyTextPresent [4 s]
2022-07-28T13:00:42.8980950Z Error Message:
2022-07-28T13:00:42.8981422Z OneTimeSetUp: System.Net.WebException : No connection could be made because the target machine actively refused it. [::ffff:XX.XX.XXX.XX]:443 (msedgedriver.azureedge.net:443)
2022-07-28T13:00:42.8982137Z ----> System.Net.Http.HttpRequestException : No connection could be made because the target machine actively refused it. [::ffff:XX.XX.XXX.XX]:443 (msedgedriver.azureedge.net:443)
2022-07-28T13:00:42.8982887Z ----> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException : No connection could be made because the target machine actively refused it. [::ffff:XX.XX.XXX.XX]:443...
我试过两种配置代理的方式,但都没解决问题:
- 方式一:直接给DriverManager设置代理
new DriverManager().WithProxy(proxy uri from hosted agent server) .SetUpDriver(new ChromeConfig(), VersionResolveStrategy.MatchingBrowser); - 方式二:给ChromeOptions加代理参数
var options = new ChromeOptions(); options.AddArgument("--proxy-server=http://" + "Proxy IP or URL" + ":" + "Proxy Port");
请问该如何解决这个问题?
备注:框架必须在VPN开启状态下或处于代理后的Azure DevOps Pipeline环境中运行,技术栈为Selenium C#
解决方案
首先得明确:你之前用的两种代理配置,作用对象完全不一样——ChromeOptions的代理是给浏览器访问网页用的,而WebDriverManager的WithProxy是让它自己下载驱动时用的。你遇到的核心问题是WebDriverManager下载驱动时没法通过公司代理,所以得针对性调整。给你几个可行的方案,按优先级推荐:
1. 配置系统级环境变量代理(最省心)
WebDriverManager会自动读取系统的HTTP_PROXY和HTTPS_PROXY环境变量,不用改代码就能生效:
- Azure DevOps Pipeline:在运行测试的任务里,添加环境变量:
如果代理需要用户名密码,格式是HTTP_PROXY=http://你的公司代理IP:端口 HTTPS_PROXY=http://你的公司代理IP:端口 NO_PROXY=localhost,127.0.0.1http://用户名:密码@代理IP:端口 - 本地VPN环境:确保系统的HTTP/HTTPS代理已经正确设置(比如Windows的Internet选项里配置),WebDriverManager会自动识别
2. 给WebDriverManager配置带认证的代理
如果公司代理需要用户名密码,直接传代理URI可能没带认证信息,试试用WebDriverManager自带的Proxy类配置:
// 注意:这里要用io.github.bonigarcia.wdm.config.Proxy,不是Selenium的Proxy var proxy = new io.github.bonigarcia.wdm.config.Proxy { HttpProxy = "http://代理IP:端口", SslProxy = "http://代理IP:端口", Username = "你的代理用户名", Password = "你的代理密码" }; new DriverManager() .WithProxy(proxy) .SetUpDriver(new ChromeConfig(), VersionResolveStrategy.MatchingBrowser);
3. 改用公司内部源托管驱动
如果公司网络严格禁止访问外部站点,你可以提前把Chrome/Edge的驱动包下载好,上传到公司内部文件服务器,然后让WebDriverManager从内部源拉取:
var chromeConfig = new ChromeConfig(); // 替换成你公司内部的Chrome驱动下载地址(要和官方的目录结构一致) chromeConfig.SetWebdriverUrl("http://你的内部服务器地址/chromedriver/"); new DriverManager() .SetUpDriver(chromeConfig, VersionResolveStrategy.MatchingBrowser);
4. 检查托管代理的网络权限
有时候不是代码问题,而是Azure DevOps托管代理所在的网络组没有被允许访问外部驱动站点。你可以联系公司的DevOps或IT团队,确认msedgedriver.azureedge.net和chromedriver.storage.googleapis.com这两个域名是否在代理白名单里,以及托管代理的出站规则是否允许访问443端口
内容的提问来源于stack exchange,提问作者Ajay D




