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

Selenium iOS Driver代理环境下运行Xamarin iOS应用自动化测试遇DNS解析失败问题求助

解决Selenium IOSDriver在代理环境下的NameResolutionFailure问题

我来分享几个针对这个代理问题的可行方案,都是在Mac环境下使用Selenium IOSDriver测试Xamarin iOS应用时,处理代理感知问题的实用思路:

1. 配置系统/终端环境变量

很多.NET和Selenium相关工具会优先读取系统环境变量中的代理设置,这是最直接的方式之一:

  • 临时终端设置:在启动Visual Studio for Mac前,先在终端执行以下命令(替换成你的代理地址和端口):
    export HTTP_PROXY=http://your-proxy-server:port
    export HTTPS_PROXY=http://your-proxy-server:port
    export NO_PROXY=localhost,127.0.0.1,<你的测试主机URL>
    
    之后从这个终端启动VS for Mac,测试进程会自动继承这些代理配置。
  • VS for Mac项目配置:右键测试项目 → OptionsRunConfigurationsDebug,在Environment Variables区域添加上述三个变量的键值对,这样每次运行测试都会自动加载代理规则。

2. 直接配置IOSDriver的服务选项

如果环境变量不生效,可以在初始化IOSDriver时,直接给DriverService指定代理参数:

// 创建IOSDriver服务实例
var iosDriverService = IOSDriverService.CreateDefaultService();

// 配置代理规则
var proxySettings = new OpenQA.Selenium.Proxy
{
    HttpProxy = "http://your-proxy-server:port",
    SslProxy = "http://your-proxy-server:port",
    NoProxy = "localhost,127.0.0.1,<你的测试主机URL>"
};
iosDriverService.Proxy = proxySettings;

// 结合Appium配置初始化Driver
var appiumOptions = new AppiumOptions();
// 这里可添加应用包名、设备UDID等测试配置
var driver = new IOSDriver<IOSElement>(iosDriverService, appiumOptions);

注意:如果你的IOSDriver依赖独立的Appium服务器,需要确保Appium本身也能正确识别代理。

3. 配置Appium服务器的代理参数

如果你是通过独立Appium服务器连接IOSDriver,启动Appium时需要明确指定代理:

  • 终端启动Appium时添加参数:
    appium --proxy http://your-proxy-server:port --proxy-ssl http://your-proxy-server:port --no-proxy localhost,127.0.0.1,<你的测试主机URL>
    
  • 或者通过Appium配置文件(appium.json)持久化设置:
    {
      "proxy": "http://your-proxy-server:port",
      "proxySsl": "http://your-proxy-server:port",
      "noProxy": ["localhost", "127.0.0.1", "<你的测试主机URL>"]
    }
    

4. 检查Visual Studio for Mac的内置代理设置

确保VS for Mac本身已正确配置代理,这样它启动的测试进程才能继承代理规则:

  1. 打开VS for Mac菜单 → PreferencesNetworkProxy
  2. 选择Manual proxy configuration,填入你的代理服务器地址和端口
  3. Bypass proxy for these hosts & domains中添加测试主机URL、localhost等不需要代理的地址

5. 自定义HttpClientHandler注入(高级场景)

如果上述方法都无效,可能需要直接给Selenium内部使用的HttpClient配置代理:

// 创建带代理的HttpClientHandler
var proxyHandler = new HttpClientHandler
{
    Proxy = new WebProxy("http://your-proxy-server:port")
    {
        Credentials = new NetworkCredential("代理用户名", "代理密码"), // 若代理需要认证
        BypassProxyOnLocal = true,
        BypassList = new[] { "<你的测试主机URL>" }
    },
    UseProxy = true
};

// 配置Appium选项,注入自定义HttpClient
var appiumOptions = new AppiumOptions();
appiumOptions.AddAdditionalCapability("httpClientFactory", () => new HttpClient(proxyHandler));

// 初始化Driver
var driver = new IOSDriver<IOSElement>(new Uri("http://localhost:4723/wd/hub"), appiumOptions);

这个方案需要注意Selenium/Appium的版本兼容性,部分版本可能需要通过反射替换内部的HttpClient实例。

额外排查点

  • 确认测试主机URL能在Mac浏览器(已配置代理)中正常访问,排除代理服务器本身无法解析该URL的问题
  • 如果代理需要NTLM认证,可能需要额外配置CredentialCache处理认证逻辑

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

火山引擎 最新活动