当前位置: 首页 > 知识库问答 >
问题:

在公司代理背后使用Selenium RemoteWebDriver

袁博
2023-03-14

如何从公司代理后面通过RemoteWebDriver连接到selenium网格(如BrowserStack)?

被测应用程序位于代理之外,可以从BrowserStack自由访问。

这个使用Selenium RemoteWebDriver隐藏公司代理(Java)stackoverflow的问题问了同样的问题,但我无法按照公认的答案回答。

共有3个答案

宗涵蓄
2023-03-14

我稍微修改了Andrew Sumner的解决方案,并删除了一些,以防像我这样的人想通过Fiddler快速地将他们的WebDriver流量导入,从而查看流量。

import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import org.apache.http.HttpHost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.openqa.selenium.ie.InternetExplorerOptions;
import org.openqa.selenium.remote.CommandInfo;
import org.openqa.selenium.remote.HttpCommandExecutor;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.http.HttpClient;
import org.openqa.selenium.remote.http.HttpClient.Factory;
import org.openqa.selenium.remote.internal.ApacheHttpClient;

public class ProxiedRemoteExample {
    private static final String PROXY_HOST = "localhost";
    private static final int PROXY_PORT = 8888;

    public ProxiedRemoteExample() throws MalformedURLException {
        InternetExplorerOptions ieOptions = new InternetExplorerOptions();
        RemoteWebDriver driver = new RemoteWebDriver(new HttpCommandExecutor(new HashMap<String, CommandInfo>(),
                new URL("http://localhost:5555/"), new Factory() {
                    private HttpClientBuilder builder;
                    {
                        builder = HttpClientBuilder.create();
                        builder.setProxy(new HttpHost(PROXY_HOST, PROXY_PORT));
                    }
                    @Override
                    public HttpClient createClient(URL url) {
                        return new ApacheHttpClient(builder.build(), url);
                    }

                }), ieOptions);
    }

}
孙熠彤
2023-03-14

除了上面Andrew的答案之外,要使Appium的这项工作改变

HttpCommandExecutor executor = new HttpCommandExecutor(new HashMap<String, CommandInfo>(), url, factory);

HttpCommandExecutor executor = new HttpCommandExecutor(MobileCommand.commandRepository, url, factory);
吴星汉
2023-03-14

根据链接的stackoverflow问题中的公认答案,我成功地实现了一些功能,以下是我的实现,以防其他人遇到相同的问题:

示例

import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;
import org.openqa.selenium.remote.CommandInfo;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.HttpCommandExecutor;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.http.HttpClient.Factory;

public class Example {
    public RemoteWebDriver connectViaProxy(DesiredCapabilities caps) {
        String proxyHost = "?";
        int proxyPort = 8080;
        String proxyUserDomain = "?";
        String proxyUser = "?";
        String proxyPassword = "?";

        URL url;

        try {
            url = new URL("http://bsuser:bspassword@hub.browserstack.com/wd/hub");
        } catch (MalformedURLException e) {
            throw new RuntimeException(e.getMessage(), e);
        }

        HttpClientBuilder builder = HttpClientBuilder.create();

        HttpHost proxy = new HttpHost(proxyHost, proxyPort);

        CredentialsProvider credsProvider = new BasicCredentialsProvider();

        credsProvider.setCredentials(new AuthScope(proxyHost, proxyPort), new NTCredentials(proxyUser, proxyPassword, getWorkstation(), proxyUserDomain));

        if (url.getUserInfo() != null && !url.getUserInfo().isEmpty()) {
            credsProvider.setCredentials(new AuthScope(url.getHost(), (url.getPort() > 0 ? url.getPort() : url.getDefaultPort())), new UsernamePasswordCredentials(url.getUserInfo()));
        }

        builder.setProxy(proxy);
        builder.setDefaultCredentialsProvider(credsProvider);

        Factory factory = new MyHttpClientFactory(builder);

        HttpCommandExecutor executor = new HttpCommandExecutor(new HashMap<String, CommandInfo>(), url, factory);

        return new RemoteWebDriver(executor, caps);
    }

    private String getWorkstation() {
        Map<String, String> env = System.getenv();

        if (env.containsKey("COMPUTERNAME")) {
            // Windows
            return env.get("COMPUTERNAME");         
        } else if (env.containsKey("HOSTNAME")) {
            // Unix/Linux/MacOS
            return env.get("HOSTNAME");
        } else {
            // From DNS
            try
            {
                return InetAddress.getLocalHost().getHostName();
            }
            catch (UnknownHostException ex)
            {
                return "Unknown";
            }
        }
    }
}

MyHttpClientFactory

import java.net.URL;

import org.apache.http.impl.client.HttpClientBuilder;
import org.openqa.selenium.remote.internal.ApacheHttpClient;

public class MyHttpClientFactory implements org.openqa.selenium.remote.http.HttpClient.Factory {
    final HttpClientBuilder builder; 

    public MyHttpClientFactory(HttpClientBuilder builder) {
        this.builder = builder;
    }

    @Override
    public org.openqa.selenium.remote.http.HttpClient createClient(URL url) {
        return new ApacheHttpClient(builder.build(), url);
    }
}
 类似资料:
  • 我需要通过npm下载几个软件包,但我们的公司代理配置是。pac文件(我在windows上) 我已经试过了 或 但这行不通... 有什么建议吗?谢谢

  • 问题内容: 如何从公司代理后面通过RemoteWebDriver连接到硒网格,例如Br​​owserStack? 被测应用程序在代理之外,可以从BrowserStack免费访问。 问题答案: 我设法根据链接的问题中的可接受答案得到了一些解决方案,如果有人遇到相同问题,这是我的实现: 例 MyHttpClientFactory

  • 问题内容: 我需要通过npm下载几个软件包,但我们的公司代理配置是.pac文件(我在Windows上) 我已经尝试过 要么 但这行不通… 有什么建议吗?谢谢 问题答案: 我有一个非常类似的问题,我无法让npm在我们的代理服务器后面工作。 我的用户名的格式为“域\用户名”-代理配置中的斜杠导致出现正斜杠。因此输入: 然后运行此命令将返回以下内容: http:// domain / username:

  • 问题内容: 我试图在一些远程自动化服务(Sauce Labs,Browserstack等)上运行Selenium测试,并遇到通过我的公司防火墙攻击其API的问题。 请注意,我要测试的应用程序 不在 此防火墙后面,可以公开访问。 问题似乎是Selenium的管道将url中的user:key解释为代理凭据,因此它永远不会离开我们的网络。是否有任何特定的技巧来配置它?似乎在后台使用了Apache Htt

  • 我正在尝试从我们的网络访问cloud Elasticsearch安装,这需要使用外部请求的代理。这是我用来传递Elasticsearch凭据和代理设置的代码片段: CredentialsProvider CredentialsProvider=new BasicCredentialsProvider();CredentialsProvider.SetCredentials(AuthScope.An

  • 我想在一个具有身份验证的公司代理后面使用来自外部世界的REST服务。如何配置SpringCloud佯装以使用我们的代理?注意:我使用的是伪spring启动实现,我不需要为伪“feign.builder()…”创建一个生成器,因为它是Spring自动建造的?我一直在寻找这个通过公司代理向地址发出请求的解决方案,但一直没有找到任何解决方案。