Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Проект Selenium WebDriver

Глава 16 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: "Selenium WebDriver", глава 16 из книги "The Architecture of Open Source Applications"
Автор:Simon Stewart
Дата публикации: 2012 г.
Перевод: Н.Ромоданов
Дата перевода: февраль 2013 г.

Selenium является инструментом автоматизации браузера, обычно используемым для написания сквозных тестов веб-приложений. Инструмент автоматизации браузера делает именно то, что вы могли бы от него ожидать: автоматизирует управление браузером так, чтобы можно было автоматизировать повторяющиеся задачи. На первый взгляд эта проблема кажется простой, но, как мы увидим, для того, чтобы ее решить, за кулисами должно произойти многое.

Прежде, чем описывать архитектуру Selenium, полезно понять, как различные части проекта соотносятся друг с другом. На очень высоком уровне Selenium представляет собой набор из трех инструментов. Первый из этих инструментов, Selenium IDE, это расширение для Firefox, которое позволяет пользователям писать и выполнять тесты. Парадигмы написания/выполнения тестов может для некоторых пользователей оказаться недостаточно, поэтому в наборе есть второй инструмент, Selenium WebDriver, предоставляющий интерфейсы API на различных языках, которые предназначены для реализации большего контроля и применения стандартных приемов разработки программ. Последний инструмент, Selenium Grid, позволяет использовать интерфейсы Selenium API для управления отдельными экземплярами браузеров, работающими на разных машинах, образующих сетку, что дает возможность параллельно запускать большее количество тестов. В проекте, они называются - «IDE», «WebDriver» и «Grid». В этой главе рассматривается архитектура Selenium WebDriver.

Эта глава была написана в конце 2010 года, когда была реализована бета-версия Selenium 2.0. Если вы читаете эту книгу позже, то проект продвинется дальше и вы сможете увидеть, как были реализованы описанные здесь архитектурные решения. Если вы читаете ее раньше: Поздравляем! У вас есть машина времени. Можете ли вы сказать мне несколько выигрышных номеров лотереи?

16.1. История

Джейсон Хогинс (Jason Huggins) приступил к проекту Selenium в 2004 году, когда он работал в ThoughtWorks над внутренним проектом компании — системой Time and Expenses (T&E), в которой широко использовался Javascript. Хотя в то время доминирующим браузером был Internet Explorer, в ThoughtWorks использовали ряд альтернативных браузеров (в частности, варианты Mozilla) и в случаях, когда приложение T&E не работало с выбранным браузером, требовалось собирать сообщения об ошибках. Инструменты тестирования с открытым исходным кодом, которые были на тот момент, либо предназначались только для одного браузера (обычно - для IE), либо моделировали работу браузера (например, HttpUnit). Стоимость лицензии на коммерческий инструмент могла оказаться разорительной для ограниченного бюджета небольшого внутреннего проекта, поэтому это даже не рассматривались в качестве допустимого варианта решения.

Там, где трудно автоматизировать, обычно полагаются на ручное тестирование. Такой подход не годится в ситуациях, когда команда разработчиков очень маленькая или когда релизы выходят очень часто. Также зря растрачиваются человеческие ресурсы, когда просят использовать скрипт, который может быть автоматизирован. Более прозаично то, люди медленнее, чем машина, выполняют скучные повторяющиеся задачи и оно при этом более подвержены ошибкам. Ручное тестирование не могло быть вариантом решения.

К счастью, во всех браузерах, в которых выполняется тестирование, поддерживают язык Javascript. Это привело Джейсона и его команду к мысли написать на этом языке инструмент тестирования, который можно было бы использовать для проверки поведения приложения. Вдохновленные работой, которая была проведена в рамках проекта FIT [1], они создали поверх языка Javascript синтаксические конструкции, имеющие вид таблиц, которые позволили тем, кто имел мало опыта в программировании, писать в файлах HTML тесты, в которых использовались ключи. Этот инструмент, первоначально называвшейся «Selenium», но позже переименованный в «Selenium Core», был выпущен в 2004 году под лицензией Apache 2.

Табличный формат в Selenium аналогичен по структуре формату ActionFixture из FIT. Каждая строка таблицы разделена на три столбца. В первом столбце указывается имя команды, которая должна быть выполнена, во втором столбце обычно находится идентификатор элемента, а в третьем столбце указывается дополнительное значение. Например, присваивание строки «Selenium WebDriver» элементу, идентифицируемому именем «q», осуществляется следующим образом:

type       name=q       Selenium WebDriver

Поскольку Selenium был написан на чистом языке Javascript, его первоначальный вариант для того, чтобы не нарушать правил политики безопасности браузера и не выходить за границы песочницы Javascript, требовал от разработчиков размещать пакет Core и его тесты на том же самом сервере, что и тестируемое приложение AUT (the application under test). Это не всегда было удобно или возможно. Еще хуже было то, что хотя оболочка IDE, имеющяася у разработчиков, предоставляла им возможность оперативно управлять кодом и ориентироваться в коде большого размера, для HTML такого инструмента не было. Быстро стало ясно, что поддержка наборов тестов даже средних размеров, громоздко и болезненно [2].

Для решения этого и других вопросов был написан HTTP прокси-сервер, который в Selenium мог перехватывать каждый запрос HTTP. Использование такого прокси-сервера позволило обойти многие из ограничений политики «только одного хоста», когда браузер не позволяет языку Javascript обращаться куда либо, кроме сервера, с которого была взята текущая страница, и это позволило смягчить первые недостатки. Такая схема дала возможность написать привязки Selenium для нескольких языков: в них было просто необходимо иметь возможность отправлять запросы HTTP на конкретный URL. Этот сетевой формат был тщательно промоделирован с помощью табличного синтаксиса Selenium Core, и стал, вместе с табличным синтаксисом, называться «Selenese». Поскольку языковыми привязками можно было управлять из браузерам на расстоянии, этот инструмент был назван «Selenium Remote Control» (механизмом дистанционного управления Selenium) или «Selenium RC».

Когда разрабатывался проект Selenium, в ThoughtWorks зарождался еще один фреймворк автоматизации браузеров: WebDriver. Исходный код для него был создан в начале 2007 года. WebDriver был создан в результате работы над проектами, в которых было необходимо изолировать всю линейку тестов, выполнявшимися на проектами так, чтобы используемые для тестов инструменты не влияли на проекты. Как правило, подобная изоляция выполняется с помощью шаблона Adapter. WebDriver появился в результате практического опыта, полученного при последовательном применении данного подхода в многочисленных проектах, и первоначально он представлял собой обертку вокруг HtmlUnit. Вскоре после его выпуска последовала поддержка для Internet Explorer и Firefox.

Когда WebDriver был реализован, он существенно отличался от Selenium RC, хотя оба пакета относились к одной и той же нише интерфейсов API, предназначенных для автоматизации браузеров. Самым очевидным различием для пользователя было то, что в Selenium RC был интерфейс API, в котором использовался словарь и в котором все методы были доступны из одного класса, тогда как в WebDriver был более объектно-ориентированный интерфейс API. Кроме того, в WebDriver поддерживалась работа только с языком Java, в то время как в Selenium RC предлагалась поддержка широкого спектра языков. Были также существенные технические различия: пакет Selenium Core (на основе которого был создан RC) был, по существу, приложением на JavaScript, работающим внутри изолированной среды браузера. В WebDriver за счет существенных затрат, вложенных в разработку самого фреймворка, была сделана попытка связать его с самим браузером с тем, чтобы можно было обойти модель безопасности, используемую в браузере.

В августе 2009 года было объявлено, что эти два проекта будут объединяться, и результатом этого объединения стал проект Selenium WebDriver. На момент написания данной главы, в WebDriver поддерживается привязка к таким языкам, как Java, C#, Python и Ruby. В нем предлагается поддержка для браузеров Chrome, Firefox, Internet Explorer, Opera и браузеров, используемых в Android и в iPhone. Есть дочерние проекты, которые не хранятся в этом репозитории исходного кода, но тесно взаимосвязаны с основным проектом и обеспечивают привязку к языку Perl, реализацию для браузера в BlackBerry и для "безоконного варианта" WebKit, что удобно в тех случаях, когда тесты нужно запускать с постоянным взаимодействием с сервером, но отображение не требуется. Продолжается поддержка исходного механизма Selenium RC и обеспечивается поддержка WebDriver для тех браузеров, работа с которыми по иному не поддерживается.

Продолжение статьи - Пару слов о жаргоне.