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

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