Сегодня поговрим о самых базовых вещах и положениях, ясное понимание которых необходимо иметь каждому кто так или иначе собирается связать свою деятельность с автоматизацией веб приложений через #Selenium. И начнём мы с того, что большинство людей недолюбливает, а именно..
Немного истории
Как первая реализация идеи автоматического управления браузерами, Selenium появился на свет в далеком 2004 году. Сперва инструмент представлял собой запускалку JavaScript кода внутри браузера, но широкой публике Selenium предстал в концепции близкой (но всё же весьма отличающейся) к тому что мы наблюдаем сегодня. Эта концепция заключалась в наличии некоего серверного компонента, с одной стороны умеющего управлять браузерами путем запуска внутри них JavaScript кода, а с другой, предоставляющего некий протокол, через который с ним мог бы взаимодействовать код тестов, написанный на одном из поддерживаемых языков программирования общего назначения (таких как, например, Java или C#). Этот проект получил название Selenium Remote Control (RC). Кстати, набор библиотек, предоставляющих базовый функционал обращения к серверному компоненту Selenium для каждого из поддерживаемых языком иногда называют баиндингом.
Затем был Selenium Grid. Это тот же Selenium RC, только с возможность множить каждый шаг одного теста таким образом, что одновременно тест выполнялся на разных машинах и разных браузерах. Всё это, естественно, достигалось без изменения в коде теста, а только конфигурацией самого грида.
Всё это было весьма удобно, однако не было лишено недостатков. Например, производители веб браузеров (что естественно) не хотели стоять на месте. Они выпускали новые весии своих продуктов, после чего зачастую разработчикам Selenium приходилось тратить время на то, чтобы отразить эти изменения в своем продукте. Да и количество самих браузеров и их производителей стало расти. В сложивихся условиях, используемая модель интеграции фреймворка и браузеров потеряла свою эффективность.
В 2012 году, World Wide Web Consortium (W3C) - сообщество, занимащееся разработкой стандартов в области Web - представило проет спецификации WebDriver. Спецификация требовалась для того чтобы на практике реализовать новую модель, следуя которй, уже сами разработчики веб браузеров разрабатывали бы свои "серверные компоненты". Ведь луче них самих никто не знает как реализовать управление внутренними механизмами браузеров в наиболее эффективном ключе. Эти серверные компоненты стали теперь называться "веб драйверами". Тепрь разработчики Chrome разрабатывали свой веб драйвер, разработчики FireFox свой, IE - свой. При этом каждый такой компонент должен был соответсвовать спецификации от W3C, что обеспечивало безошибочное взаимодействие вебдрайверов и баиндингов поддерживаемых языков.
Что умеет Selenium
Наконец, от затянувшейся истории мы переходим непосредственно к теме поста. Что же умеет Selenium? В первую очередь это зависит от реализации вебдрайвера. Того насколько полно он соответствует спецификации. Допустив, что все положения спецификации реализованы, отметим ниже ключевые возмжоности Selenium:
-
Навигация: переход по заданному адресу, получение текущего адреса, перемещение на предыдущий адрес (Backward), перемещение на следующий адрес (Forward), обновление страницы, получение заголовка страницы (Title)
-
Оперирование так называемым командным контекстом (т.е. то, как фреймворк будет определять с чем ему неободимо сейчас работать, когда есть несколько возмоных вариантов - например, несколько открыты окон или несколько разны фреймов на странице): переключение между окнами, переключение между фреймами, изменение позиции и размеров окна, закрытие окна.
-
Поиск элементов по локаторам: поиск одного элемента или коллекции элементов при поддержке локаторов XPath, CSS и т.д.
-
Определение состояния элемента: определение выбран ли элемент, активен ли элемент (enabled/disabled), получение метаинформации атрибута (такой как, например, имя тэга, значение свойства CSS, получение внутреннего текста и области отрисовки элемента)
-
Взаимодействие с элементами: кликнуть на элемент, очистить поле, отправить на элемент последовательность нажатий клавиш
-
Взаимодействие со страницей как документом: получение исходного кода страницы, запуск кастомного JavaScript кода внутри страницы (как синхронного так и асинхронного)
-
Работа с Cookies: получение, добавление и удаление cookies
-
Работа с алертами: получение текста сообщения, подтверждение сообщения, отклонение сообщения
-
Работа со скриншотами: получение снимка всего экрана, либо конкретного элемента.
Чего Selenium не умеет
Логично было бы предположить, что Selenium не умеет того, что не входит в список его умений. Однако, опыт показывает, что среди людей бытует ряд заблуждений относительно возможностей фреймворка. И так, ниже представлен ряд функций, которыми Selenium не обладает.
-
Selenium - это не тест-фрейморк (omg, что??): Selenium - это инструмент автоматизации взаимодействия с браузерами. В самом фреймворке нет никаких инструментов по подготовке, запуску, завершению тестов, определению соответствия обозримого ожидаемому и анализу результатов. Не умеет Selenium также готовить отчеты по результатам тестирования. Для всего этого вам будет необходимо включить в код своих тестов соотвесттвующие сторонние библиотеки.
-
Selenium теряет силу на стыке фунциональности браузера и операцинной системы: например, если вам надо сохранить какой-то документ на жестком диске, Selenium не сможет управлять диалогом сохранения, потому что этот диалог не контролируется браузером. Для того чтобы реализовать подобный сценарий, вам, опять же, потребуется включать в свой тестовый код, соответствующие дополнительные библиотеки. Кстати, это же касается и распечатки веб страницы, вызова контекстного меню и т.д.
-
Selenium может быть бесполезен и в некоторых случаях взаимодействия с элементами на веб-странице: некоторые браузеры умеют рисовать в себе элементы, которые не являются элементами DOM дерева. Например, установив некоторые плагины в IE, вы будете видеть в окне браузера пользовательский интерфес, который будет невиден Селениуму. То же касается некоторых устаревших технологий, такх как Java Applets, Adobe Flash и т.д.
Это, пожалуй, и есть те базовые знания, необходимые с моей точки зрения, как для получения более четкого представления о Selenium перед началом его более глубоко изучения, так и для более граммотного планирования реализации автотестов с его использованием. Если у вас остались вопросы, задавайте их тут. Я постараюсь дополнить статью опираясь на ваши замечания.