Пишем рулу - прокси

Я уже писал про использование 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