Поиск js-ошибок

Тут нам пригодится browsermob-proxy. В нашем случае мы будем использовать её как локально поднимаемую, динамически конфигурируемую проксю для webdriver. Направляя наш браузер на эту проксю, мы можем творить всякие непотребства (например, подменять юзер-агент или любые другие заголовки http-запросов; смотреть, какие запросы делаются при загрузке страницы и т.д.). Полные исходники рабочего проекта я выложил на github. Давайте посмотрим на код теста. Первое что мы делаем - стартуем прокси. Задача прокси-сервера в данном случае - добавить в начало страницы наш js-код, который будет хэндлить ошибки.

proxy = new ProxyServer(0);
proxy.start();
ScriptInjection.injectScriptRightAfterHeadTag(proxy, OnErrorHandler.SCRIPT);

После этого нужно сказать вебдрайверу чтобы он использовал эту прокси. Для этого создаём DesiredCapabilities и устанавливаем в них наш прокси.

caps = new DesiredCapabilities("firefox", "", Platform.ANY);
caps.setJavascriptEnabled(true);
ScriptInjection.addProxyToCapabilities(caps, proxy.seleniumProxy());

Всё, приготовления закончены. Теперь создаём драйвер с подготовленными Capabilities и запрашиваем нашу страничку. Остаётся проверить, что у нас лежит в errors.

driver = new HtmlUnitDriver(caps);
driver.get(url);
List<String> errors = OnErrorHandler.getCurrentErrors(driver);
assertThat("Detected " + errors.size() + " js-errors:" + collectErrorMessages(errors),
	errors.size(), equalTo(0));

Как вы могли заметить, этот код не идеален =). Например, я использовал Before/After(Class) методы для работы с драйвером и проксёй. Предлагаю желающим потренироваться в написании рул сделать пулл-реквест, в котором создать рулы, берущие на себя заботу о драйвере и прокси. Так же было бы неплохо заменить метод collectErrorMessage красивым матчером - с удовольствием приму и этот pull-request. Чтобы сделать этот тест окончательно кросс-браузерным, остаётся только добавить второй параметр (имя браузера) на вход теста и на его основе создавать экземпляр нужного браузера. И еще раз ссылка на исходники jserror-example.

comments powered by Disqus