在公司代理后面使用 Selenium RemoteWebDriver (Java)
Using Selenium RemoteWebDriver behind corporate proxy (Java)
我正在尝试 运行 在一些远程自动化服务(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
您链接到的 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
实例,传入命令执行器
我正在尝试 运行 在一些远程自动化服务(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
您链接到的 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
实例,传入命令执行器