Использование маппинга пользовательского интерфейса в Selenium RC

Карта пользовательского интерфейса (UI map) - это хранилище идентификаторов-указателей на элементы пользовательского интерфейса приложения. Карта создается чтобы тестовый скрипт через нее обращался к тестируемым элементам. UI map также хранит в себе объекты тестового скрипта, которые соответствуют элементам интерфейса тестируемого приложения.

В чем же польза UI map? Основное назначение это упрощение управлением тестовыми скриптами. Например, если вам требуеться изменить указатель, то вместо прочесывания всего кода в распоряжении имеется централизованное место хранения, где его можно легко отыскать. Большим преимуществом будет внесение изменений лишь в одном месте карты, чем в нескольких местах кода или, еще хуже, нескольких скриптах.

Суммируя, можно выделить два основных  преимущества UI Mapping: 

  • Использование централизованного места для хранения объектов пользовательского интерфейса вместо поддержки разбросанных по всему коду элементов.
  • Скрытые идентификаторы и имена HTML можно заменить более понятными, что значительно облегчит читабельность тестовых скриптов

Рассмотрим следующий пример (java) selenium тестов для сайта:

{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; } public void testNew() throws Exception { selenium.open("http://www.test.com"); selenium.type("loginForm:tbUsername", "xxxxxxxx"); selenium.click("loginForm:btnLogin"); selenium.click("adminHomeForm:_activitynew"); selenium.waitForPageToLoad("30000"); selenium.click("addEditEventForm:_IDcancel"); selenium.waitForPageToLoad("30000"); selenium.click("adminHomeForm:_activityold"); selenium.waitForPageToLoad("30000"); } {/syntaxhighlighter}

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

{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; } public void testNew() throws Exception { selenium.open("http://www.test.com"); selenium.type(admin.username, "xxxxxxxx"); selenium.click(admin.loginbutton); selenium.click(admin.events.createnewevent); selenium.waitForPageToLoad("30000"); selenium.click(admin.events.cancel); selenium.waitForPageToLoad("30000"); selenium.click(admin.events.viewoldevents); selenium.waitForPageToLoad("30000"); } {/syntaxhighlighter}

В примере выше по-прежнему отсутствуют комментарии, однако он удобочитаем за счет использования ключевых слов. (Имейте ввиду, что UI Map не является заменой комментариев! Комментарии по прежнему очень важны при разработке автоматизированных тестов.) И еще красивее будет выглядеть следующий пример:  

{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }public void testNew() throws Exception {

         // Открыть url приложения.
         selenium.open("http://www.test.com");

         // Введите имя администратора.
         selenium.type(admin.username, "xxxxxxxx");

         // Щелкните кнопку Login.
         selenium.click(admin.loginbutton);

         // Щелкните кнопку Create New Event.
         selenium.click(admin.events.createnewevent);
         selenium.waitForPageToLoad("30000");

         // Щелкните кнопку Cancel.
         selenium.click(admin.events.cancel);
         selenium.waitForPageToLoad("30000");

         // Щелкните кнопку View Old Events.
         selenium.click(admin.events.viewoldevents);
         selenium.waitForPageToLoad("30000");

}
{/syntaxhighlighter}

Основная идея состоит в использовании централизированного места для объектов и использования удобочитаемых названий для этих объектов.

Чтобы применить этот подход на практике, можно использовать java файлы, описывающие свойства (*.properties). Такие файлы содержат пары ключ/значение, где каждый ключ и значения являются строками.

Рассмотрим файл prop.properties, в котором легко понятные идентификаторы присваиваются как ‘псевдонимы’ для ранее использованных HTML объектов.

{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }admin.username = loginForm:tbUsername admin.loginbutton = loginForm:btnLogin admin.events.createnewevent = adminHomeForm:_activitynew admin.events.cancel = addEditEventForm:_IDcancel admin.events.viewoldevents = adminHomeForm:_activityold {/syntaxhighlighter}

Указатели по-прежнему ссылаются на объекты HTML, однако мы определяем слой абстракции между тестовым скриптом и элементрами пользовательского интерфейса. Значения, считываемые из файла свойств (*.properties) представляют собой карту пользовательского интерфейса, то есть UI Map. Более подробно Map файл будет рассмотрен в следующем выпуске.