2016-01-18 24 views
5

企業のプロキシの背後からRemoteWebDriver経由でBrowserStackなどのセレングリッドに接続するにはどうすればよいですか?社内プロキシの背後でSelenium RemoteWebDriverを使用する

テスト対象のアプリケーションは、プロキシの外部にあり、BrowserStackから自由にアクセスできます。

このUsing Selenium RemoteWebDriver behind corporate proxy (Java)のstackoverflowの質問は同じ質問をしましたが、私は受け入れられた答えに従うことができませんでした。

答えて

9

私はここに私の実装では、他の誰が同じ問題に貼り付ける場合にはですが、リンクされ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:[email protected]/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); 
    } 
} 
+0

これは非常に役に立ちました。私はこの問題について話している他のドキュメントは見つかりませんでした。私たちの企業ネットワークではうまくいきました。 –

関連する問題