Привет всем!
Сегодня я хочу поделится одной из возможностью тестирования функционала веб приложения из под разных IP адресов. Так как в топике много букв (и даже картинки есть!), решила я сделать содержание с навигацией.
Содержание
- Предисловие
- Формулировка задачи
- Поиски и фрагменты решений
- От теории к практики
- Техническая комплектация решения
- Настройка окружения для работы с приложением
- Запуск приложения
- Литература
Предисловие
Несколько недель назад ко мне в скайп постучался один таинственный незнакомец, и спросил меня совета, каким способом можно проверить со стороны пользовательского интерфейса то, что пользователь после
Формулировка задачи
Тест кейс по его высказываниям я набросала следующий
Название: Блокировка входа в систему по IP после неверно введенных данных
- Открываем в браузере страницу входа в систему
- Вводим логин
- Вводим неверный пароль
- Нажимаем кнопку входа
- Проверяем, что на странице отображается ошибкао неверно введенном логине/пароле
- Повторяем действия со второгопо пятыйшаг еще 2 раза
- Проверяем, что на странице отображается ошибка о превышении неудачныхпопыток входа в систему
- Меняем IP адрес
- Открываем в браузере страницу входа в систему
- Вводим логин
- Вводим верный пароль
- Нажимаем кнопку входа
- Проверяем, что мы успешновошли в систему
В распоряжении у меня небылопользовательского интерфейса, единственно, что я знала, что форма аутентификации в приложении стандартная: канал шифрованный на базе HTTPS, поле ввода логина, поле ввода пароляи собственно кнопочка войти.
Поиски и фрагменты решений
После определения задачи и неуспешного поиска готовых решений мне стало ясно, что для взаимодействия с интерфейсом можно взять Selenium Webdriver (который мне больше знаком, чем другие подобные решения), который, кроме всего прочего, может помочь закрыть вопросы с возможным изменением DOMмодели после загрузки странички или в результате взаимодействия с UI (посредством JavaScript’а например).
В результате поиска средств по смене IPдля тестирования веб приложения я остановилась на решении под названием TOR. По сути этот инструмент решает вопросы сохранение анонимности пользователей в сети за счет того, что запрос от клиента к серверу проходит через сеть проксирующих узловв результате оставляя наш реальный IPневидимым для конечного сервера. Для более наглядного восприятия я постаралась это изобразить на рисунке ниже:
В теории, каждый новый запрос может пойти через другие мостовые узлы (relay), но на практике я этого так и не увидела. Проверяла я таким образом: выполняла запрос за определением своего внешнего IPадреса к разным веб ресурсам, и все они показывали мне один и тот же TOR’овскийIP адрес, полученный в начале. Может быть переключение между мостовыми узлами (relay) срабатывает в аварийном случае, например, когда мостовой узел (relay) не отвечает, например из рисунка выше, если б узел в Германииупал, и Украинапересоединилась с США, как я показала на рисунке ниже:
Названия странна моих рисунках — это лишь условности, которые подчеркивают, что сервера (узлы) могут находится в любомуголке нашей планеты.
От теории к практики
Реализовывать решение по тест кейсу я не стала, так как думаю, что многие знакомы с APISelenium Webdriver’а, а если нет, то существует многоклассных статей на эту тему, что не составит большого труда найти то, что вам будет по душе. Из задачи таинственного незнакомца, описанной в начале топика, я взяла лишь интересный для себя кусочек (так как мой ответ незнаюна решение его проблемы, его устроил быстрей, чем я даже ожидала ...). Этот сладкий кусочекотносится к автоматизациивзаимодействия с браузером от именидругого хоста (компьютера). В результате я написала приложение с консольныминтерфейсом. Все, что приложение умеет делать, это посещать разные источники по HTTP/HTTPS, переданные в него в качестве аргумента. Если будет желание к приложению приделать хвост (образно), то исходники есть в открытом доступе. Выкачать исходники приложения можно с помощью команды:
git clone git@github.com:irinkav/anonymous-lover.git. Финальную версию своего решения я изобразила следующим образом:
Техническая комплектация решения
Написала приложение на следующих технологиях:
- Apache Maven (maven.apache.org) — для придания формы приложению (помогает в сборке, управлению зависимостями ...)
- Selenium Webdriver (docs.seleniumhq.org/...ects/webdriver) — для взаимодействия с веб страничками при помощью реальногобраузера
- Jsoup (jsoup.org) — наследие, которое осталось в коде, и довольно неплохо себя там чувствует. Использовала его для выполнения запросов за контентом для быстрого получения информации о своем внешнем IP. Это решение гораздо легче Selenium Webdriver’аиз-за того, что никакихбраузеров не нужно подымать, а всего лишь строить запрос (GET/POST...) к веб серверу за контентом, и работать с DOMмоделью контента при помощи удобного API на базе CSS selector’ов...
- commons-exec (commons.apache.org/...r/commons-exec) — для запуска внешних программ. Я запускаю консольный TOR Socks прокси серверс помощью этой библиотеки. Почемувыбрала ее? Потому что она умеет порождать дочерний процессот основного (процесса приложения) и управлятьего жизненным циклом. Например, по завершению основного процесса тушатся все его подпроцессы порожденные им (с помощью ShutdownHookProcessDestroyerхука). Это нужно мне для того, чтоб по каждому новому запуску приложения стартовал TOR Socks прокси серверкак дочерний процесс, цеплял IP, и я его могла использовать для серфинга просторов интернета. О консольном TOR Socks прокси серверепоговорю немного и ниже в статье
- commons-cli (commons.apache.org/...er/commons-cli) — для упрощения работы с приходящими аргументами из командной строки
- консольный TOR Socks прокси сервер (www.torproject.org/index.html.en) — собственно для проксирования траффика между браузероми веб сервером. Использую Torprojectреализацию TORклиента.
Свое приложение проверяла на двухплатформах: Linuxи Windows и, конечно же, у меня все работало ;-)
Настройка окружения для работы с приложением
Для настройки окружение на работу через TORсеть с помощью моей программки нужно:
- Скачать и установить Tor Browser Bundle (www.torproject.org/...ad-easy.html.en). Он подается в разном виде, то есть у него сборкиесть под разные платформы Windows/Mac/Linux.
- Скачать и установить Java SE 7+ (www.oracle.com/...ds-1880260.html). Я проверялаприложение на 7 версии, поэтому за младшие версии сказать ничего не могу, собственно, как и за старшие
- Скачать и установить Apache Maven 3+ (maven.apache.org/download.cgi)
Запуск приложения
Для того, чтоб запустить программу нам нужно найтиместо, куда мы установили Tor Browser Bundle, и скопировать полные пути (желательно) к исполняемому файлу Tor\tor.exe (Tor/torв случае с Linux, и, подозреваю, на Mac’етакже...) и к директории Data. Они нам пригодятся на следующем шаге.
- tor.exe — собственно консольный TOR Socks прокси сервер
- Data — директория, где TOR Socks прокси серверхранит свои конфигурации
Итак,
- Заходим в директории с программой
- Запускаем командную строку (консоль, терминал, cmd...)
- Выполняем в директории команду на сборку приложения: mvn clean install
- Из target/anonymous-lover-1.0-dist.zipкопируем архив куда душе угодно (почему так я назвала приложение, напишу в конце статьи, дабы суть чище держать)
- Распаковываем архив anonymous-lover-1.0-dist.zip
- Заходим в распакованных архив
- Выполняем из командной строки (в моем примере пусть будет такая команда):
java -jar anonymous-lover-1.0.jar --url 'http://dou.ua/forums/topic/9914/' --use-proxy --check-ip --tor-proxy-path 'c:\_tools\torBrowser\Tor\tor.exe' --tor-proxy-data-directory-path 'C:\_tools\torBrowser\Data'
, где- anonymous-lover-1.0.jar — исполняемый Javaархив
- —url — страничка, которую мы хотим посетить. Результат странички сохраняется в директорию outputкорневой директориипрограммы
- —use-proxy — сделать посещение безопасным (в теории для этого был разработан TOR), то есть использовать режим проксирования траффика с помощью TORсети
- —check-ip — проверить IPи записать его в файл для потомков (шутка). Файл ложится в директорию outputкорневой директориипрограммы. Если не хотите проверять внешний IP, то просто опускайте этот аргумент при общении с приложением
- —tor-proxy-path — путь к файлу запуска TOR Socks прокси сервера
- —tor-proxy-data-directory-path — путь к файлу конфигурации TOR Socks прокси сервера
В команде подразумевалось, что браузер Firefoxбыл установлен в известноедля Selenium Webdriver’аместо. Однако если это не так, то всегда можно воспользоваться еще одним аргументом: —firefox-binary-path — указывает на путьк файлу запуска Firefoxбраузера. Например, значениемэтого аргумента может быть: c:\_tools\firefox\firefox.exe.
Также нужно иметь ввиду, что по умолчаниюTOR Socks прокси сервероткрывает и слушает Socksпорт под номером 9150, но это можно изменить правкой в файл конфигурации в Data/Tor/torrc-defaultsв строку с SocksPort 9150. После изменения может понадобитсядать моему приложению понять, на каком портекрутится (слушает) прокси. Сделать это можно с помощью аргумента —proxy-port — порт TOR Socks прокси сервера (SocksPortпараметр из Data/Tor/torrc-defaults).
Другую полезную информацию по TOR Socks прокси серверуможно черпнуть по ссылке: www.torproject.org/...-manual.html.en.
PS: Приложение назвала anonymous-lover, так как дома скучно что-то писать без изюминки. А тут, вроде как, и из названия понятно, чем приложение является для страничек.
Вообщем-то на этом и окончилась моя игра с TOR’ом.
Мне было бы интересно узнать из комментариев к топику, есть ли любой другой способсделать тоже самое, и чем это могло бы быть лучше/хужепредложенного мной способа в контексте тестирования веб приложений.
Спасибо за внимание.
Литература
За время решения проблемы пользоваласьследующими источниками:
- docs.seleniumhq.org/...ects/webdriver — здесь разнообразная документация на APISelenium Webdriver’а
- www.guru99.com/...elenium-rc.html — дружелюбная статьяпо сравнению WebDriverи Selenium RC решений
- aosabook.org/...n/selenium.html — здесь черпнула знаний по поводу внутренней кухни Selenium WebDriver
- en.wikipedia.org/...nymity_network — обрела понимание того, зачем и как устроена TORсеть
- www.torproject.org/...manual_en.xhtml — здесь посмотрела, как работает TOR Socks прокси серверв приближении к Torprojectреализации
- www.torproject.org/...ervices.html.en — здесь наглядно показан процесс внутренней луковой маршрутизациив TORсети
- www.torproject.org/...-manual.html.en — документация по тому, как можно использовать консольный TOR Socks прокси сервер
- blog.sanaulla.info/...s-exec-library — этот туториал по использованию Apache Commons Execбиблиотеки мне больше понравился, чем официальный — commons.apache.org/...c/tutorial.html
- Примеры использования библиотеки Apache Commons Exec:
- commons.apache.org/...-cli/usage.html — этот туториал по использованию Apache Commons CLIбиблиотеки
- Остальное, как и все предыдущее, собственно, — через Google