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

4

我正在尝试在一些远程自动化服务(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中的user:key解释为代理凭据,因此它永远不会离开我们的网络。有没有特定的技巧来配置这个?它似乎在内部使用Apache HttpClient。
我认为我们正在使用NTLM代理,它似乎使用基本身份验证。可能是从这里开始的相同问题:https://code.google.com/p/selenium/issues/detail?id=7286
1个回答

3
您所提供的Google Code问题确实是原因。请注意,该问题已得到解决,因此在创建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实例,传入命令执行器。

谢谢!这正是我现在要做的事情。它最终成为了很多定制代码(完整复制了他们内部两个类并进行了一些小改动)。我遇到了一个独立问题,即NTCredentials不是线程安全的,所以我被迫确保每次只有一个线程处于活动状态。我可能会在这里分享一些片段。这并不像我希望的那样方便,但我认为这就是设计。 - Dan
1
我已经在https://dev59.com/g5Pea4cB1Zd3GeqP-x7u#34908953发布了一个可行的实现,供那些像我一样卡在这个问题上的人参考。 - Andrew Sumner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接