在公司代理(Java)后面使用Selenium RemoteWebDriver

时间:2015-10-21 15:12:56

标签: java selenium firewall apache-httpclient-4.x

我正在尝试在一些远程自动化服务(Sauce Labs,Browserstack等)上运行Selenium测试,并遇到通过我公司防火墙点击其API的问题。

请注意,我正在尝试测试的应用在此防火墙后面,可以公开访问。

DesiredCapabilities caps = DesiredCapabilities.internetExplorer();
caps.setCapability("platform", "Windows 7");
caps.setCapability("version", "9.0");
caps.setCapability("idleTimeout", "300");
caps.setCapability("name", "Invitation Tests");
driver = new RemoteWebDriver(new URL("https://user:key@saucelabs.com), caps);

问题似乎是Selenium解释用户的管道:将url中的密钥作为代理凭据,因此它永远不会离开我们的网络。是否有任何特定的技巧来配置它?它似乎使用了Apache HttpClient。

认为我们正在使用NTLM代理,它似乎使用基本身份验证。从这里可能是同一个问题:https://code.google.com/p/selenium/issues/detail?id=7286

1 个答案:

答案 0 :(得分:3)

您链接到的Google代码问题确实似乎是原因。请注意,该问题已得到解决,因此您现在可以在创建RemoteWebDriver时注入自己的CommandExecutor实现。

具体来说,您可能会这样做:

  • 编写org.openqa.selenium.remote.http.HttpClient.Factory的自定义实现,其行为与https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/remote/internal/ApacheHttpClient.java的自定义实现类似,但允许您注入HttpClient实例(或HttpClientFactory实例,如果需要继承那个)。这是一个非常简单的界面,一个简单的复制实现,所以这应该很容易。
  • 为不同主机创建具有不同凭据的org.apache.http.impl.client.BasicCredentialsProvider实例(有关详细信息,请参阅org.apache.http.auth.AuthScope)。
  • 使用org.apache.http.impl.HttpClientBuilder与您的凭据提供程序构建客户端。
  • 构建HttpCommandExecutor的实例,传入自定义工厂的实例并注入客户端。
  • 构造RemoteWebDriver的实例,传入命令执行程序。