2016-09-06 3 views
0

Я пытаюсь интегрировать BrowserMob в мои тесты на селен. Он отлично работает с веб-сайтом, работающим на http, но с https-сайтами браузеры перестают работать, а файл HAR не содержит никаких запросов.Selenium (Chrome) и BrowserMob не работают для https

При переходе на сайт https я получаю эту ошибку в браузере.

«С прокси-сервером что-то не так, или адрес неверен».

Вот мой код.

public class Browsermob { 

    BrowserMobProxy proxy = new BrowserMobProxyServer(); 

    @Test 
    public void browsermobtest() { 


    proxy.start(9091); 

    // get the Selenium proxy object 
    Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); 


    // configure it as a desired capability 
    DesiredCapabilities capabilities = new DesiredCapabilities(); 
    capabilities.setCapability(CapabilityType.PROXY, seleniumProxy); 
    System.setProperty("webdriver.chrome.driver", "C:/Users/Madis/Documents/chromedriver.exe"); 

    WebDriver driver = new ChromeDriver(capabilities); 

    // enable more detailed HAR capture, if desired (see CaptureType for the complete list) 
    proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT); 

    // create a new HAR with the label "google.com" 
    proxy.newHar("http://www.google.com/"); 

    // open google.com 
    driver.get("https://www.google.ee/#gfe_rd=cr"); 
    driver.findElement(By.cssSelector("#gb_70")).click(); 



    } 

    @AfterMethod 
    public void Afterthetest() { 

    // get the HAR data 
    Har har = proxy.getHar(); 

    File harFile = new File("C:/Users/Madis/Documents/har.har"); 
    try { 
     har.writeTo(harFile); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    } 
} 

ответ

0

мне удалось заставить его работать.После добавления log4j и отладок журналов browsermob вопрос был вызван

Caught an exception on ClientToProxyConnection 
java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.fromHost(Ljava/lang/String;)Lcom/google/common/net/HostAndPort; 

Для того, чтобы сделать его работу я должен был добавить зависимость к моему Maven проекту. Это исправило эту проблему, и я смог увидеть захват трафика на https-сайтах, а также http-сайты.

<dependency> 
<groupId>com.google.guava</groupId> 
<artifactId>guava</artifactId> 
<version>20.0</version> 
</dependency> 
+0

Guava уже является зависимостью BMP. Какую зависимость от BMP вы затягиваете? –

+0

@JasonHoetger Я использую \t net.lightbody.bmp \t browsermob жильный \t 2.1.4 \t. Показывается в github. –

+0

Browsermob-core уже зависит от guava 20. Возможно, вы включаете guava где-то еще в своем пом? Вы можете использовать 'mvn dependency: tree', чтобы быть уверенным. В любом случае, рад, что вы его работали. –

0

Вы вводите в заблуждение объект прокси-сервера браузера и объект-прокси-сервер selenium.

Ваша прокси-переменная proxy - это фактический прокси-сервер, к которому будет подключен ваш браузер.

Ваш seleniumProxy переменная - это объект, который представляет настройки прокси-сервера вашего браузера.

Вы предлагаете браузеру использовать «trustAllSSLCertificates» в качестве адреса вашего прокси-сервера, поэтому вы получаете сообщение об ошибке. Вместо этого вы должны указать браузеру (proxy) на номер trustAllSSLCertificates, а вашему sslProxy необходимо обратиться к прокси-серверу browserermob.

Запустите прокси так:

public void startProxy() { 
     proxy = new BrowserMobProxyServer(); 
     proxy.setTrustAllServers(true); 
     proxy.start(9091); 
} 

Запустить драйвер следующим образом:

public void startBrowserWithProxy() { 
     Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); 
     seleniumProxy.setSslProxy("localhost:" + proxy.getPort()); 
     DesiredCapabilities capabilities = new DesiredCapabilities(); 
     capabilities.setCapability(CapabilityType.PROXY, seleniumProxy); 
     System.setProperty("webdriver.chrome.driver", "C:/Users/Madis/Documents/chromedriver.exe"); 
     WebDriver driver = new ChromeDriver(capabilities); 
} 
+0

По-прежнему та же проблема. Прекрасно работает на http-подключении, как только я перехожу на сайт https, после чего он перестает работать. –

+0

Извинения, я пропустил команду '' 'proxy.start (9091);' '' из моего первоначального примера. Вы все равно запускали прокси? –

+0

Да, я запустил прокси. Он отлично работает, когда я использую его на веб-сайте, который не использует https. Нужно ли сначала устанавливать некоторые сертификаты? –

2

Вам не нужно указать sslProxy на объекте Селен Proxy. ClientUtil.createSeleniumProxy делает это за вас, а в большинству простых случаях он выбирает подходящее значение по умолчанию (используя InetAddress.getLocalHost(), если он работает для HTTP, он также будет работать и для HTTPS).

Несколько вещей, которые нужно иметь в виду:

  1. Вы получите SSL предупреждения в браузере, если вы либо сообщить браузеру игнорировать CERT ошибки (на Chrome, используйте --ignore-сертификат-ошибки флаг командной строки) или установите BMP CA в хранилище доверия браузера (для Chrome в Windows его необходимо установить в хранилище доверия Windows).
  2. В зависимости от вашей версии Chrome и ОС вам может потребоваться указать альтернативный пользовательский data-dir с помощью параметра командной строки. Например, --user-data-dir=/tmp/insecurechrome.
  3. BMP имеет собственный источник доверенных сертификатов (хранилище доверия Java + недавний список из Mozilla), поэтому, если вы пытаетесь подключиться к внутренним веб-сайтам с сертификатами, выпущенными частным CA, вам необходимо сообщить BMP либо доверять приватный CA или пропустить сертификацию сертификата с использованием .setTrustAllServers (true).
  4. Прокси-сервер должен быть запущен с использованием .start (...) перед вызовом createSeleniumProxy().

Объединяя все эти вещи, ваш код будет выглядеть примерно так:

BrowserMobProxy proxy = new BrowserMobProxyServer(); 
proxy.setTrustAllServers(true); 
proxy.start(9091); 

// get the Selenium proxy object 
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); 
// NOTE: there is no call to .setSslProxy() here 

// configure it as a desired capability 
DesiredCapabilities capabilities = new DesiredCapabilities(); 
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy); 
System.setProperty("webdriver.chrome.driver", "C:/Users/Madis/Documents/chromedriver.exe"); 

ChromeOptions options = new ChromeOptions(); 
options.addArgument("--ignore-certificate-errors"); 
// replace 'somedirectory' with a suitable temp dir on your filesystem 
options.addArgument("--user-data-dir=somedirectory"); 
capabilities.setCapability(ChromeOptions.CAPABILITY, options); 

WebDriver driver = new ChromeDriver(capabilities); 

// [...] 
+0

Я скопировал это, и он, похоже, не работает. Тот же вопрос, что и мой. Сайты, использующие https, не будут загружаться. –

+0

Спасибо за помощь. Мне удалось заставить его работать после получения всех журналов отладки для браузера. Добавление зависимостей goava goava исправило проблему для меня. –

1

У меня была эта проблема. После многочисленных испытаний я узнал, что мы должны добавить setmitmManager и upstream-прокси, если вы подключены к корпоративному прокси. Это сработало для меня.

Вот пример кода.

BrowserMobProxy proxy = new BrowserMobProxyServer(); 
proxy.setTrustAllServers(true); 

//Add below line if you are under corporate proxy. 
proxy.setChainedProxy(new InetSocketAddress("XXX.XXX.com", 8080)); 
proxy.setMitmManager(ImpersonatingMitmManager.builder().trustAllServers(true).build()); 
proxy.start(9091); 

// get the Selenium proxy object 
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); 

// configure it as a desired capability 
DesiredCapabilities capabilities = new DesiredCapabilities(); 
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy); 
System.setProperty("webdriver.chrome.driver","C:/Users/Madis/Documents/chromedriver.exe"); 


WebDriver driver = new ChromeDriver(capabilities); 
// your code to start, get har 
Смежные вопросы