Всем привет.
Не так давно в работе мне пришла задачка - нужно было смотреть, сколько определенных запросов уходит при открытии страницы и при некоторых действиях на ней. Как же сделать? Первое, что приходит на ум - прокси. Browser Proxy - библиотека, которая уже давно живет где-то по соседству с selenium, да вот только с недавних пор она притерпела небольшую "пластику" и теперь с ней нужно общаться немного по другому. Как именно - я сейчас расскажу и покажу. asdf
Итак. Для начала - ссылочка на гитхаб с библиотекой - https://github.com/lightbody/browsermob-proxy
Там в readme уже есть неплохое описание, какие-то основные вещи можно понять и оттуда. Но я всё же расскажу еще раз в разрезе решаемой задачи.
Первое, что мы делаем - правильно - подключаем библиотечку к нашему проекту с помощью любимого maven:
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-core-littleproxy</artifactId>
<version>2.1.0-beta-5</version>
</dependency>
И собственно пишем код для работы с прокси:
public class BrowserProxy {
private BrowserMobProxy proxyServer;
private boolean isServerStarted;
public void startServer(DesiredCapabilities capabilities) {
proxyServer = new BrowserMobProxyServer(0);
try {
proxyServer.start();
isServerStarted = true;
} catch (Exception e) {
throw new RuntimeException("Can't start proxy-server on port: " + proxyServer.getPort(), e);
}
Proxy proxy = null;
try {
proxy = createHttpProxy(proxyServer.getPort());
} catch (UnknownHostException e) {
e.printStackTrace();
}
createNewHar();
capabilities.setCapability(CapabilityType.PROXY, proxy);
}
private Proxy createHttpProxy(int port) throws UnknownHostException {
Proxy proxy = new Proxy();
proxy.setProxyType(Proxy.ProxyType.MANUAL);
String proxyStr = String.format("%s:%d", InetAddress.getLocalHost().getCanonicalHostName(), port);
proxy.setHttpProxy(proxyStr);
proxy.setSslProxy(proxyStr);
return proxy;
}
public void createNewHar(){
proxyServer.newHar();
}
public void stopServer() {
if (isServerStarted) {
try {
proxyServer.stop();
} catch (Exception e) {
throw new RuntimeException("Can't stop proxy server", e);
}
}
}
public int getCallsCountByContainsKey(String key, boolean clearHistory) {
int result = 0;
Har har = proxyServer.getHar();
if (har != null) {
HarLog harLog = har.getLog();
List<HarEntry> entries = harLog.getEntries();
for (HarEntry entry : entries) {
if (entry.getRequest().getUrl().contains(key)) {
result++;
}
}
} else {
return -1;
}
if(clearHistory) {
createNewHar();
}
return result;
}
public Har getHar() {
return proxyServer.getHar();
}
}
Ну и теперь - всё, что нам нужно - это вызвать метод getCallsCountByContainsKey с желаемым урлом, который нам нужен. Второй параметр - clearHistory - нужен для того, чтобы можно было удалять по сути не нужную историю, чтоб при подсчете кол-ва вызовов не всегда проходить по огромному списку урлов.
Код, который получится у Вас в итоге:
public static void main(String[] args){
BrowserProxy browserProxy = new BrowserProxy();
DesiredCapabilities caps = getBrowserCapabilities(); //здесь мы в зависимости от браузера берем capabilities browserProxy.startServer(caps);
WebDriver webDriver = new RemoteWebDriver(caps);
webDriver.get("http://yandex.ru");
int callsCount = browserProxy.getCallsCountByContainsKey("coolUrl.com", false);
assertTrue("Unexpected calls count",callsCount == 2);
webDriver.quit();
}
Вот и всё. Проще простого!