Я уже писал про использование browsermob-proxy в посте про поиск js-ошибок. В этом же посте предлагалось оформить работу с прокси и драйвером с использованием рул. Настало время сделать это =).
Создаём класс ProxyRule.java, расширяющий абстрактный класс TestWatcher:
public class ProxyRule extends TestWatcher {}
Т.к. нам нужно запускать прокси при старте теста и гасить её когда тест закончен, оверрайдим соответствующие методы:
@Override
protected void starting(Description description) {
proxy = new ProxyServer(0);
try {
proxy.start();
ScriptInjection.injectScriptRightAfterHeadTag(proxy, OnErrorHandler.SCRIPT);
caps = new DesiredCapabilities("firefox", "", Platform.ANY);
caps.setJavascriptEnabled(true);
ScriptInjection.addProxyToCapabilities(caps, proxy.seleniumProxy());
} catch (Exception e) {
throw new RuntimeException("Error while starting proxy: " + e.getMessage());
}
}
@Override
protected void finished(Description description) {
try {
proxy.stop();
} catch (Exception e) {
throw new RuntimeException("Error while stopping proxy: " + e.getMessage());
}
}
Кроме того, рула должна отдавать “наружу” созданные DesiredCapabilities, настроенные на работу с прокси.
public DesiredCapabilities getCaps() {
return caps;
}
Вот и вся реализация. Просто, правда? Добавляем нашу рулу в тест и удаляем всё, что было в @BeforeClass и @AfterClass:
@ClassRule
public static ProxyRule proxy = new ProxyRule();
Заметил, что я использую аннотацию @ClassRule, а поле помечено как static? Это нужно для того, чтобы прокси не создавалась при запуске каждого теста, а поднималась единожды для тестового класса. Осталось “настроить” вебдрайвер на использование прокси:
private WebDriver driver = new HtmlUnitDriver(proxy.getCaps());
Полные исходники примера как обычно можно найти у меня в репозитории в соответствующей ветке.
comments powered by Disqus