【问题标题】:Using Selenium RemoteWebDriver behind corporate proxy (Java)在公司代理 (Java) 后面使用 Selenium RemoteWebDriver
【发布时间】:2015-10-21 15:12:56
【问题描述】:

我正在尝试在一些远程自动化服务(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

【问题讨论】:

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


    【解决方案1】:

    您链接到的 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的实例,传入命令执行器。

    【讨论】:

    • 谢谢!这就是我现在要下去的。它最终变成了很多自定义代码(它们的两个内部类的完整副本,并进行了一些小改动)。我遇到了 NTCredentials 不是线程安全的单独问题,迫使我确保一次只有一个线程处于活动状态。我可能有一些 sn-ps 可以很快在这里分享。它不像我希望的那样方便,但我认为这就是设计。
    • 我已经在 stackoverflow.com/questions/34846014/… 上发布了一个可行的实现,供任何像我一样坚持下去的人使用。
    猜你喜欢
    • 2014-10-28
    • 2023-03-29
    • 1970-01-01
    • 2015-04-23
    • 2021-05-30
    • 2012-08-05
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多