You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bonigarcia/WebDriverManager最新版在公司代理及Azure DevOps Pipeline环境下无法访问Selenium驱动的问题解决咨询

解决公司代理/VPN环境下bonigarcia/webdrivermanager无法下载驱动的问题

我正在使用最新版本的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_PROXYHTTPS_PROXY环境变量,不用改代码就能生效:

  • Azure DevOps Pipeline:在运行测试的任务里,添加环境变量:
    HTTP_PROXY=http://你的公司代理IP:端口
    HTTPS_PROXY=http://你的公司代理IP:端口
    NO_PROXY=localhost,127.0.0.1
    
    如果代理需要用户名密码,格式是http://用户名:密码@代理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.netchromedriver.storage.googleapis.com这两个域名是否在代理白名单里,以及托管代理的出站规则是否允许访问443端口


内容的提问来源于stack exchange,提问作者Ajay D

火山引擎 最新活动