[食谱好菜] 替 Selenium WebDriver 加上 Proxy 的设定来加快测试的速度

我们使用 Selenium WebDriver 在做 Web Testing 的时候,测试对象往往已经是接近 Production 的状态,多少会使用一些外部资源,像是 cdnjs.cloudflare.com、ajax.googleapis.com 的 CDN 服务,万一网络不给力,整个测试行程 run 下来会多很多时间,这时候我想到可以架设 Proxy Server 来专门服务 Selenium,借由 Proxy Server 降低存取外部资源的延迟时间,如果我们公司内部已经有架好的 Proxy Server 当然就不需要我们自己动手了。


另外要注意的是,建议从 Proxy Server 中将测试对象的 domain 设定为不要代理。

至于如何架设 Proxy Server,自行 Google 一下就很多了,以下就为大家献上三大浏览器的 WebDriver 如何做 Proxy 设定?

Firefox WebDriver Proxy Settings

public static IWebDriver GenerateFirefoxDriver()
{
    var proxySettings = ConfigurationManager.AppSettings["Proxy"].Split(':');
    var proxyHost = proxySettings[0];
    var proxyPort = int.Parse(proxySettings[1]);

    var options = new FirefoxOptions();

    options.SetPreference("network.proxy.type", 1);
    options.SetPreference("network.proxy.http", proxyHost);
    options.SetPreference("network.proxy.http_port", proxyPort);
    options.SetPreference("network.proxy.ssl", proxyHost);
    options.SetPreference("network.proxy.ssl_port", proxyPort);

    return new FirefoxDriver(options);
}

FirefoxDriver 类提供一个建构函数的重载 public FirefoxDriver(FirefoxOptions options),我们 new 一个 FirefoxOptions 调用 SetPreference 方法,一个一个指定 Firefox 的 Proxy 设定,相关设定值的说明可以在这里找到。

Google Chrome Proxy Settings

public static IWebDriver GenerateChromeDriver()
{
    var proxySettings = ConfigurationManager.AppSettings["Proxy"];

    var proxy = new Proxy { HttpProxy = proxySettings, SslProxy = proxySettings };

    var options = new ChromeOptions { Proxy = proxy };

    return new ChromeDriver(options);
}

跟 FirefoxDriver 类一样有提供相关的建构函数重载 public ChromeDriver(ChromeOptions options),但是设定的程序更简单,new 一个 ChromeOptions 指定 Proxy 的属性值即可。

InternetExplorer(俗称 IE) Proxy Settings

IE 的写法跟 Chrome 一样

public static IWebDriver GenerateInternetExplorerDriver()
{
    var proxySettings = ConfigurationManager.AppSettings["Proxy"];

    var proxy = new Proxy { HttpProxy = proxySettings, SslProxy = proxySettings };

    var options = new InternetExplorerOptions { Proxy = proxy };

    return new InternetExplorerDriver(options);
}