У меня сейчас как раз работет сценарий с получением har и просмотром, какие уходят запросы. работаю как раз с последней версей little proxy.
Еще есть тесты, где перехватываются запросы и подменяются. Тоже с помощью прокси.
Если что - по конкретным вопросам могу дать примеры.
О, да, очень нужны примеры.
Достаточно самый простой: перехватывать и логировать все запросы и ответы.
Смотри, этот пример я использую у себя. Он на 80% стырен был откуда-то с гугла.
Мне в основном нужен был метод для получения кол-ва определенных запросов(метод getCallsCountByContainsKey). Ну думаю не составит труда разобраться, как вынуть нужную информацию.
Работает сейчас - каждый день запускается не по одному разу.
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("Cant start proxy-server on port: " + proxyServer.getPort(), e);
}
Proxy proxy = null;
try {
proxy = createHttpProxy(proxyServer.getPort());
} catch (UnknownHostException e) {
e.printStackTrace();
}
createNewHar();
// configure it as a desired capability
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("Cant 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();
}
}
Зависимость следующая:
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-core-littleproxy</artifactId>
<version>2.1.0-beta-5</version>
</dependency>
Спасибо!
Но у меня проблема. Когда через этот проекси открывают google.com, работает.
А когда открываю “https://127.0.0.1:48895/page_with_uploads.html” - не работает, Пишет “The site can’t be reached”. А я все тесты именно на localhost запускаю.
@sidelnikovmike Хелп ниидед! Не получается использовать прокси с http://127.0.0.1
Беда прям, что делать-то?
А какая версия BMP? Вот тут описана опция контроля native dns resolution
. Где-то читал, что без нее могут быть проблемы с определением localhost. Но в 2+ версиях она должна быть включена по дефолту.
П.С. Сам не тестил, т.к. использую remote BMP.
Да у меня эта проблема со всеми версиями BMP. Ок, спасибо, потыкаю эту настройку.
А ты используешь вместо BMP что-то другое?
ща подумаем, попробуем. Не пробовал сам, надо поглядеть
Нет, тот же BMP, просто remote версию. Поднимаю batch / sh и конекчусь рест клиентом. Пробовал даже в докер контейнере поднимать.
Я запускаю прокси и читаю запросы с ответами так:
Единственное, что пока не решил (но вроде как не влияет), я получаю такой прокси (кстати из-за поиска решения с этими нулями я и попал сюда):
Starting proxy at address: 0.0.0.0/0.0.0.0:0
Proxy listening with TCP transport
Proxy started at address: /0:0:0:0:0:0:0:0:39998 (ну и порт каждый раз разный)
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(0);
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
System.setProperty("webdriver.chrome.driver", getCfgValue("webdriver_place"));
WebDriver driver = new ChromeDriver(capabilities);
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
proxy.newHar(getCfgValue("SITE_URL"));
driver.get(getCfgValue("SITE_URL"));
Har har = proxy.getHar();
boolean isCSRFPresent = false;
for (HarEntry entry : har.getLog().getEntries())
if (entry.getRequest().getMethod().equals("POST")) {
log.info("request code: " + entry.getRequest().getMethod()); // Output request type
log.info("--> response url: " + entry.getRequest().getUrl()); // Output url of request
log.info("--> response code: " + entry.getResponse().getStatus()); // Output the
log.info(getCfgValue("line"));
List<HarPostDataParam> params = entry.getRequest().getPostData().getParams();
log.info("Reading POST parameters:");
log.info(getCfgValue("line"));
int element = 1;
for (HarPostDataParam param : params) {
String parameter = element + ". " + param.getName() + ": " + param.getValue();
log.info(parameter);
if(param.getName().contains("csrf")) {
if(!param.getValue().equals("") || !param.getValue().equals(" ") || param.getValue() != null) {
isCSRFPresent = true;
}
}
element++;
}
log.info(getCfgValue("line"));
// время ожидания ответа от сервера в миллисекундах
log.info("Time spent on receiving response from server: " + entry.getTimings().getWait() + " ms");
// время чтения ответа от сервера в миллисекундах
log.info("Time spent on reading received response: " + entry.getTimings().getReceive() + " ms");
log.info(getCfgValue("line"));
log.info(getCfgValue("line"));
}
Вопрос ко всем, у кого проблемы с localhost, а чего вы не пропишетесь в hosts? Добавляете таргет на ваш хост+порт и вуаля.
@tymoschuk_jane Да, это помогло бы.
Но хочется сделать запуск текстов максимально простым. Чтобы любой мог зачекаутить проект и одной командой запустить тесты, и ему не пришлось бы прописывать миллион параметров в hosts, файлах, настройках, эксельках и пр.
ну, как минимум, такому человеку поднимать тестируемый энв у себя локально
Не-не. Ничего подобного.
На моём проекте так: любой человек может запустить тесты на своей машине, запустив всего лишь эти две команды:
- git clone git://my-project
- ./build.sh
- ./run-tests.sh
Эти скрипты сами всё сделают. Запустят тестируемое приложение, прогонят тесты и остановят приложение.
ну тогда не вижу проблемы добавить в build.sh строку, которая прописывает локалхост в хосты
Не так-то просто.
Это нужно проанализировать: вдруг там уже есть такая трока? Вдруг она указывает на какой-то другой хост? Да и вообще, это требует от простого скрипта “build” SUDO прав…
В общем, можно, но не хотелось бы. Запускать на localhost гораздо проще.
Всё остальное обычно запускается.