Pull to refresh

HtmlUnit- Инструмент для автоматизации тестирования веб-сайтов

  HtmlUnit- Инструмент для автоматизации тестирования веб-сайтов
Последнее время занимаюсь тестированием сайтов, используя связку python+ mechanize. Методика уже отработана и удобна, но есть и недостатки — нет поддержки javascript-а, и, следовательно, нет и AJAX, что уже неприемлемо для современного динамичного сайта.После продолжительный поисков была найдена альтернатива — HtmlUnit, работающая на Java-платформе.

  HtmlUnit — инструмент с открытым исходным кодом для тестирования или получения информации с веб-сайтов. По сути, это браузер без графической оболочки, написанный на Java. Представляет собой библиотеку со своим API, которая позволяет открывать ссылки, заполнять формы, нажимать кнопки, и.т.д, так же, как это делает нормальной браузер.   Также HtmlUnit имеет хорошую поддержку JavaScript и способен работать даже с довольно сложными библиотеками AJAX, и в зависимости от настроек может имитировать либо Firefox, либо Internet Explorer. Для работы с JavaScript используется движок Rhino, плюс дополнительные надстройки для устранения некоторых ошибок Rhino.

Особенности:

  • Поддержка HTTP и HTTPS протоколов
  • Поддержка cookies
  • Возможность отправки данных методами POST и GET (как и HEAD, DELETE,...)
  • Возможность настройки заголовков, отправляемых серверу
  • Встроенный парсер HTML обеспечивает легкий доступ ко всей информации содержащийся в документе.
  • Поддержка отправки форм
  • Может кликать по ссылкам
  • Обход DOM модели в HTML документе
  • Поддерживает работу с прокси- сервером
  • Поддержка базовой и NTLM аутентификации
  • Понимает JavaScript

Тесты некоторых JavaScript библиотек показали следующий результаты:

  • JQuery 1.2.6: Полная поддержка
  • MochiKit 1.4.1: Полная поддержка
  • GWT 2.0.0: Полная поддержка
  • Sarissa 0.9.9.3: Полная поддержка
  • MooTools 1.2.1: Полная поддержка
  • Prototype 1.6.0: Очень хорошую поддержку
  • Ext JS 2.2: Очень хорошую поддержку
  • Dojo 1.0.2: Хорошая поддержка
  • YUI 2.3.0: Хорошая поддержка

  JavaScript код выполняется так же, как в нормальных браузерах: при загрузке страницы, или при срабатывании обработчика. Кроме того, HtmlUnit предоставляет возможность внедрить свой код в существующую страницу через HtmlPage.executeJavascript (String yourJsCode).

Использование:

Маскировка под конкретный браузер:

  Зачастую нужно замаскироваться под настоящий браузер. Это делается путем передачи конструктору класса нужного параметра BrowserVersion
public void homePage_Firefox() throws Exception {
  final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2);
  final HtmlPage page = webClient.getPage("http://habrahabr.ru");
  assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText());
  webClient.closeAllWindows();
}



Поиск нужного элемента:

  Если у вас есть ссылка на на нужную html страницу, вы можете найти в ней нужные данные несколькими способами: методом 'get' или с помощью Xpath. Ниже приведен пример поиска 'DIV' по известному 'ID', а также получение якоря по имени.
public void getElements() throws Exception {
  final WebClient webClient = new WebClient();
  final HtmlPage page = webClient.getPage("http://some_url");
  final HtmlDivision div = page.getHtmlElementById("some_div_id");
  final HtmlAnchor anchor = page.getAnchorByName("anchor_name");
  webClient.closeAllWindows();
}



С помощью Xpath:

public void xpath() throws Exception {
  final WebClient webClient = new WebClient();
  final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
  //берем все DIV-ы
  final List<?> divs = page.getByXPath("//div");
  //берем DIV с атрибумтом 'name' и значением 'John'
  final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@name='John']").get(0);
  webClient.closeAllWindows();
}



Использование прокси- сервера:

public void homePage_proxy() throws Exception {
  final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2, "http://myproxyserver", myProxyPort);
  //указываем логин и пароль для прокси-сервера
  final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
  credentialsProvider.addProxyCredentials("username", "password");
  final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
  assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText());
  webClient.closeAllWindows();
}



Отправка формы:

  Часто нужно отправить данные обратно на сервер, в данном примере показано как это сделать.
public void submittingForm() throws Exception {
  final WebClient webClient = new WebClient();
  //Загружаем нужную страницу
  final HtmlPage page1 = webClient.getPage("http://some_url");
  // Выбираем нужную форму,
  // находим кнопку отправки и поле, которое нужно заполнить.
  final HtmlForm form = page1.getFormByName("myform");
  final HtmlSubmitInput button = form.getInputByName("submitbutton");
  final HtmlTextInput textField = form.getInputByName("userid");
  // Записывает в найденное поле нужное значение.
  textField.setValueAttribute("Привет");
  // Теперь «кликаем» на кнопку и переходим на новую страницу.
  final HtmlPage page2 = button.click();
  webClient.closeAllWindows();
}




  Вот пока все, что я хотел рассказать об этой замечательной библиотеке, которая может сильно облегчить жизнь тестировщикам. Более подробно с ней можно ознакомиться на сайте проекта http://htmlunit.sourceforge.net/.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.