XML2Selenium (v.1.39.2) user manual

Current version of xml2selenium is 1.39.2

1. Что необходимо знать и уметь, чтобы пользоваться фреймворком

1.1 Переход на новую версию фреймворка

1.2 Что делать, если появились проблемы с фреймворком

1.3 Запуск фреймворка в разных режимах

1.3.1 Интеграция с BrowserStack в remote режиме

1.4 Запуск фреймворка с разными браузерами

1.5 JVM-параметры

2. Как создавать тесты

2.1 Создание простого теста

2.2 Добавление шагов теста

2.3 Основные возможности фреймворка

3. Терминология

3.1 Scope/Context

3.2 Frame/Include

3.3 Placeholder

4. Рекомендации и Best practices

4.1 Рекомендации по написанию простых тестов

4.1.1 Именование шагов теста

4.1.2 Наследование

4.1.3 Переопределение

4.1.4 Использование фреймов (frame)

4.1.5 Вынесение общих частей кода в отдельные файлы (import)

4.1.6 Использование переменных

4.1.7 Получение текста из браузера

4.1.8 Передача переменных через java-параметры

4.1.9 Использование property-файлов

4.1.10 Использование Groovy Scripting

4.1.11 Служебные переменные

4.1.12 Создание динамических переменных

4.1.13 Задание имен тестам и формирование удобных репортов

4.1.14 Скачать файл во время выполнения теста

4.1.15 Работа с окнами браузера

4.1.16 Указание причины, почему не отработал тег

4.1.17 Тестирование страниц с Basic HTTP Authentication

4.2 Лучшие практики написания сложных тестов

4.2.1 Наследование элементов и фреймов.

4.2.2 Вставки в тесты javascript-кода

4.2.3 Использования before/after для описания предусловий и постусловий выполнения тестов

4.2.4 Библиотеки повторно-используемых фрагментов теста

4.3 Лучшие практики по работе с технологиями

4.3.1 XPath

5. Документация к тегам

5.1 Веб-тестирование

5.1.1 Работа с dom-элементами веб-страницы

5.1.1.1 <webelement>

5.1.1.2 <button>

5.1.1.3 <checkbox>

5.1.1.4 <combobox>

5.1.1.5 <field>

5.1.1.5 <radio>

5.1.2 Поведение браузера

5.1.2.1 <navigate>

5.1.2.2 <upload>

5.1.2.3 <script>

5.1.2.4 <window>

5.1.2.5 <dialog>

5.1.3 Задержки, ожидания

5.1.3.1 <defaultdelay>

5.1.3.2 <pause>

5.1.4 Теги для получения артефактов

5.1.4.1 <screenshot>

5.1.4.2 <snapshot>

5.1.4.3 <video>

5.2 Тестирование веб-сервисов

5.2.1 Работа с Rest-сервисами

5.2.1.1 <rest>

5.2.1.2 <restassert>

5.3 Базовые теги тестов

5.3.1 Контейнеры

5.3.1.1 Логическая организация тестов

5.3.1.1.1 <testcase>

5.3.1.1.2 <before>/<after>

5.3.1.1.3 <test>

5.3.1.2 Повторное использование, процедуры

5.3.1.2.1 <frame>

5.3.1.3 Работа с импортами

5.3.1.3.1 <imports>

5.3.1.3.2 <import>

5.3.2 Работа с данными теста

5.3.2.1 <property>

5.3.2.2 <variable>

5.3.3 Организация логики теста

5.3.3.1 <assert>

5.3.3.2 <iterate>

5.3.3.3 <condition>

5.3.3.4 <failure>

5.3.4 Маркеры

5.3.4.1 <bdd>

5.3.4.2 <echo>

6. Виды отчётов

6.1 Index page (индекс страница)

6.2 Behavior report (поведенческий отчет)

6.3 Business report (бизнес отчет)

6.4 Technical report (технический отчёт)

6.5 Общая информация для отчетов

1. Что необходимо знать и уметь, чтобы пользоваться фреймворком

1.1 Переход на новую версию фреймворка

  1. Необходимо уточнить, на какую именно версию нужно переходить.
  2. Проверить в nexus, что такая версия доступна.
  3. В файле pom.xml проекта изменить версию xml2selenium на нужную

<xml2selenium.version>

1.39.1

</xml2selenium.version>

  1. В случае если в eclipse нет плагина m2e: выполнить из консоли в папке проекта mvn clean install и затем  mvn eclipse:eclipse.Пробуем запустить тесты локально  в eclipse.
  2. Закоммитать.
  3. Проверить, что билд на jenkins отработал успешно.
  4. В случае проблем с обратной совместимостью (к примеру, когда фреймворк претерпел большие изменения, и тесты больше невалидные) - связаться срочно с разработчиками.

1.2 Что делать, если появились проблемы с фреймворком

При появлении каких-либо проблем необходимо сообщить об этом в техподдержку, подробно описав проблему и прикрепив все необходимые артефакты для воспроизведения ситуации, логи и exception traces.

Связаться с техподдержкой можно при помощи контактов:

Email:   xml2selenium@jazzteam.org 

Skype:  xml2selenium

1.3 Запуск фреймворка в разных режимах

Фреймворк может работать в двух режимах: 

  1. local - фреймворк и браузер запускаются на одной и той же машине (локально)
  2. remote - фреймворк запускается на одной, а браузер на другой машине. Это позволяет запускать тесты с браузерами, недоступными для текущей установленной ОС.

Для работы фреймворка в разных режимах существуют специальные параметры. Если не передавать никаких параметров, то по умолчанию фреймворк запустится в локальном режиме.

Параметры для настройки режима запуска фреймворка:

xml2selenium.webDriverRunMode

local

remote

режим запуска фреймворка, локальный или на сервере

Для работы в локальном режиме не нужно ничего устанавливать. Локальный режим по умолчанию работает с браузером FireFox. Вы можете использовать другой браузер, для этого Вам нужно использовать параметры описанные здесь.

Для использования remote режима необходимо обязательно установить selenium RC сервер и передать следующий параметр:

xml2selenium.serverUrl

http://{адрес_хоста}:{порт}/wd/hub

К примеру:  http://127.0.0.1:4444/wd/hub 

обязательный параметр для remote режима, означает url адрес selenium RC сервера

Selenium RC Server поставляется jar архивом. Запускается командой:

java -jar {название jar файла}.jar

к примеру, java -jar selenium-server-standalone-2.53.0.jar

Последнюю версию selenium-server-standalone можно скачать здесь. Пакет selenium-server-standalone включает в себя хаб (центральный узел, который получает все запросы тестов), Selenium WebDriver и старый Selenium RC. По-умолчанию хаб запускается на 4444 порту. Для изменения порта можно добавить к команде необязательный параметр -port.

java -jar {название jar файла}.jar -port 5555

Remote режим по умолчанию работает с браузером FireFox. Вы можете использовать другой браузер, для этого Вам нужно использовать параметры описанные здесь.

При запуске фреймворка в remote режиме и браузерами Chrome или IE необходимо при старте Selenium RC Server указывать пути к драйверам Chrome и IE через параметры:

webdriver.chrome.driver

Параметр для драйвера Chrome

webdriver.ie.driver

Параметр для драйвера IE

webdriver.edge.driver

Параметр для драйвера Edge

К примеру:

java -jar selenium-server-standalone-2.53.0.jar -Dwebdriver.chrome.driver=”c:\chromedriver.exe” -Dwebdriver.ie.driver=”c:\IEDriverServer.exe”

1.3.1 Интеграция с BrowserStack в remote режиме

Сервис BrowserStack предоставляет удаленный SeleniumRC сервер с возможностью использования различных комбинаций браузеров и операционных систем.

Для использования BrowserStack необходимо при запуске тестов использовать след. обязательные JVM-параметры:

xml2selenium.webDriverRunMode

remote

xml2selenium.serverUrl

http://%username%:%key%@hub.browserstack.com/wd/hub

Также можно пользоваться и другими JVM-параметрами описанными в специальном разделе

Необходимо отметить некоторые функции, не работающие в удаленном режиме:

        - Видео с браузера не записывается

        - Не загружаются файлы с помощью тега upload в Opera

        - Не скачиваются файлы с помощью браузеров Opera и Internet Explorer

1.4 Запуск фреймворка с разными браузерами

Для работы фреймворка с разными браузерами были введены новые параметры. Если не передавать никаких параметров, то по умолчанию фреймворк запустится с браузером FireFox. Параметры для запуска браузеров:

xml2selenium.browserType

firefox

chrome

opera

ie

edge

Тип браузера, который вы хотите использовать

При использовании разных браузеров необходимо учесть что:

Драйвера для IE - http://www.seleniumhq.org/download/ 

Драйвера для Сhrome - http://chromedriver.storage.googleapis.com/index.html 

Драйвера для Edge - https://www.microsoft.com/en-us/download/details.aspx?id=48212

xml2selenium.browserPath

Путь до исполняемого файла используемого браузера, параметр передается если исполняемый файл браузера был размещён в другой директории, не по умолчанию. Путь не должен содержать русских символов и должен быть заключен в двойные кавычки.

1.5 JVM-параметры

Важно: При использовании перед каждым параметром нужно указывать ‘-D’

Фреймворк поддерживает следующие jvm-параметры:

Параметры для настройки фреймворка

xml2selenium.expectedConditionsChecking

true

false

Разрешить/запретить сверку ожидаемых (expected) результатов тестов с реально получаемыми.

xml2selenium.mode

user

dev

Режим пользователя/разработчика (в режиме разработчика выводятся полные стектрейсы)

xml2selenium.timeout

Number

Время за которое должен быть найден элемент страницы. В противном случае произойдет исключение с сообщением “can not find element”.

xml2selenium.useUniqueOutputDir

true

false

Разрешить/запретить сохранение результатов фреймворка в отдельную папку для каждого запуска. Когда параметр включен, путь сохранения результатов фреймворка - target/xml2selenium/run_%suiteId%, иначе по умолчанию - target/xml2selenium.

xml2selenium.outputDir

String

Путь для сохранения результатов фреймворка. По умолчанию сохранется в target/xml2selenium

xml2selenium.useWebActionVisualizer

true

false

Который разрешает/запрещает подсветку текущего выполняемого  элемента в браузера. По умолчанию подсветка элемента выключена.

xml2selenium.testPath

String

Путь для запускаемых тесткейсов.

Параметры для настройки webdriver

xml2selenium.webDriverRunMode

local

remote

Режим запуска фреймворка, локальный или на сервере.

xml2selenium.serverUrl

http://{адрес_хоста}:{порт}/wd/hub

Обязательный параметр для remote режима, указывает url адрес selenium RC сервера.

xml2selenium.browserType

firefox

chrome

opera

ie

Тип браузера, который вы хотите использовать.

xml2selenium.driverPath

String

Путь к драйверу (включая файл с расширением .exe или .sh), необходим для запуска браузеров Chrome и IE.

xml2selenium.browserPath

String

Путь до исполняемого файла (включая файл с расширением .exe или .sh) используемого браузера, параметр передается, если исполняемый файл браузера был размещён в другой директории, не по умолчанию.

xml2selenium.browserProfilePath

String

Путь до папки с профилем (включая папку) используемого браузера, параметр передается, если нужно использовать браузер с различными настройками: специальные плагины (firebug, firepath), proxy - авторизация и др. Использование профилей поддержано для браузера FireFox.

О том как  настраивать профили можно узнать на официальном сайте FireFox: https://support.mozilla.org/en-US/kb/profile-manager-create-and-remove-firefox-profiles

xml2selenium.testPath

String

Путь для запускаемых тесткейсов.

xml2selenium.webDriverCheck

true

false

Разрешить/запретить тестовый запуск браузера для проверки валидности входных параметров, и соответствия версии браузера и версии селениума

xml2selenium.browserVersion

String

Указывает, какую версию браузера мы хотим использовать. Используется с BrowserStack.

xml2selenium.osName

String

Указывает, какую операционную систему мы хотим использовать. Используется с BrowserStack.

xml2selenium.osVersion

String

Указывает, какую версию операционной системы мы хотим использовать. Используется с BrowserStack.

xml2selenium.browserWidth

Number

Указывает ширину браузера, которую необходимо установить. По умолчанию выставляется текущая ширина экрана. Выставление ширины браузера поддержано для браузеров FireFox, Chrome, Internet Explorer

xml2selenium.browserHeight

Number

Указывает высоту браузера, которую необходимо установить. По умолчанию выставляется текущая высота экрана. Выставление высоты браузера поддержано для браузеров FireFox, Chrome, Internet Explorer

xml2selenium.turnOnSmartWaitFor

String

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

  • timeout - максимальное время, за которое должен появиться элемент, в миллисекундах
  • step - шаг ожидания, в миллисекундах
  • id, xpath, cssSelector или tagName - селектор (идентификатор) обязательного элемента, который появляется после полной загрузки страницы

 

TREE parameters, проверяют последовательность исполнения фреймворка, используется  разработчиками

xml2selenium.treeRecording

true

false

Разрешить/запретить запись деревьев разбора фреймворка во время исполнения.

xml2selenium.treeChecking

true

false

Разрешить/запретить сверку записанных во время выполнения деревьев разбора фреймворка с эталонными.

Параметры для интеграции с BrowserStack

xml2selenium.browserstack.tunnel

true

false

Включает/выключает использование функции туннелинга.

xml2selenium.browserstack.debug

true

false

Включает/выключает ведение визуального лога теста.

2. Как создавать тесты

2.1 Создание простого теста

Для создания тестов вы можете загрузить шаблон проекта с github. Каждый тест должен содержаться в файле xml. Файл нужно поместить в проект в папку resouces. Файл не должен содержать символов запрещённых операционной системой  / \ : * ? “ < > | и символов, не поддерживаемых фреймворком  # . (  )

В этом файле должны быть следующие теги:

<testcase> - содержит внутри набор тестов (обязательный тег)

<test> - содержит внутри шаги теста. Таких тестов может быть несколько в одном теге <testcase>

Минимальный для запуска одного теста файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

    <test>

            <!-- Шаги теста-->

    </test>

</testcase>

Как видно, в теге <testcase> необходимо описать 3 атрибута:

  1. xmlns="http://www.jazzteam.org/Routines" - пространство имен по умолчанию
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - пространство имен экземпляра схемы, одним из имен в котором является атрибут schemaLocation
  3. xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd"  -  определяет какой схеме (пространству имен) соответствует данный XML и где находится схема для валидации данного XML

Данные атрибуты просто необходимо вставить в тег, они не изменяются в разных тестах.

Перед тегом <testcase> обязательно должна быть указана кодировка UTF-8:

<?xml version="1.0" encoding="UTF-8"?>

Для того, чтобы запустить этот тест, нужно задать путь к нему в java файле. Этот файл необходимо поместить в каталог src/test/java. Назовите файл TestMain.java. В файле должно быть cледующее:

package org.jazzteam.xml2selenium;

import org.jazzteam.xml2selenium.core.annotations.TestPath;

import org.jazzteam.xml2selenium.core.runner.junit.Xml2SeleniumJUnitRunner;

import org.junit.runner.RunWith;

@RunWith(Xml2SeleniumJUnitRunner.class)

@TestPath(paths = { "" })

public class TestMain {

}

Структура файловой системы будет выглядеть следующим образом:

                

Имя java-класса и файла должны совпадать (TestMain.java и класс TestMain).

@TestPath(paths = { "" }) строчка указывает тесты, которые нужно запускать. Указывается путь относительно папки resources. При таком указании пути будут запущены все xml файлы из папки recources.

Если файл с тестом Mytest.xml находится в подкаталоге  resources/tests: 

@TestPath(paths = { "tests" }) - в этом случае запустятся все тесты из каталога tests

@TestPath(paths = { "tests/Mytest.xml" }) - в этом случае запустится только один, конкретный тест Mytest.xml.

Можно создать любое количество java-файлов, из которых будут запускаться тесты. Файлам можно задавать практически любые имена, главное чтобы они не нарушали ограничения java на именование классов и начинались или заканчивались словом “Test”. Каждый файл - стартовая точка для запуска теста либо группы тестов. Тесты будут запускаться по порядку, в котором их найдёт фреймворк - сначала из одного файла, затем из следующего и так далее. При каждом запуске будут запускаться только те тесты, которые указаны в конкретном файле.

2.2 Добавление шагов теста

После создания файла с тестом необходимо добавить шаги.

Для совершения каких-либо действий в браузере пользуетесь следующими тегами:

  1. <navigate to=”https://www.google.by/”/> - открывает в браузере страницу с указанным url (в нашем случае страницу https://www.google.by).
  2. <button id=”button_id”> - нажатие на кпнопку с указанным id (в нашем случаем с id=”button_id”)
  3. <checkbox xpath="//[@id=’checkbox’/td" /> - кликнуть на указанный чекбокс. В этом примере чекбокс задается по xPath.
  4. <combobox cssSelector=".b-form-button__input" by="number" value="1" /> - выбрать из комбобокса определенное значение. В этом примере комбобокс выбирается по css селектору, ему указывается что нужно выбрать значение по порядковому номеру в списке и это значение - номер 1 в списке.
  5. <field subId="fieldIndex" textToType="Input text"/> - заполнить текстовое поле значением. В этом примере в текстовое поле будет введено значение Input text. Поле для ввода будет найдено по части из его полного id.
  6. <webelement xpath="jd406_1:menu_system_logout_link" action="isExists"/> - проверить, присутствует ли указанный элемент на странице. В нашем случае элемент ищется по xPath. 

Более подробно обо всех тегах фреймворка можно узнать из главы “Документация к тегам”.
После добавления в тест шагов, он выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

    <test name="test yandex">

           <!-- Открываем страницу поиска yandex -->            

        <navigate to="http://www.yandex.by/"/>

       

           <!-- Вводим запрос "jazzteam" -->            

            <field id="text" textToType="jazzteam"/>

           

            <!-- Нажимаем на кнопку "Yandex Search" -->

            <button cssSelector=".b-form-button__input"/>

           

            <!-- Проверяем что отобразились результаты поиска -->

            <webelement cssSelector=".b-body-items" action="isExists"/>

           

            <!-- Проверяем что в результатах поиска есть текст "jazzteam.org" -->

            <webelement cssSelector=".b-body-items" action="isContainsText" text="jazzteam.org"/>

    </test>

</testcase>

Данный тест заходит на сайт yandex.by и проверяет что поиск по запросу jazzteam работает.

2.3 Основные возможности фреймворка

С помощью фреймворка можно совершать различные действия с элементами на web-странице:

<webelement> - основной тег фреймворка для работы с содержимым web-страницы. Теги <checkbox>, <button>, <field>, <combobox> могут делать в дополнение к своим действиям также и действия тега <webelement>, и также они имеют все атрибуты, какие имеет тег <webelement>.

У тегов <webelement>, <checkbox>, <button>, <field>, <combobox> обязательно должен быть указан селектор, по которому можно найти нужный элемент на странице. Селектор можно задать в одном из следующих аттрибутов: id, subId, xpath, ccsSelector, tagName. Подробнее о них можно прочитать тут.

Во фреймворке есть ряд других полезных тегов:

Пример сохранения скриншотов после каждого действия в тесте:

 

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

    <test name="test yandex">

           <!-- Открываем страницу поиска yandex -->            

        <navigate to="http://www.yandex.by/"/>

       <-- Сохранить скриншот текущей страницы -->

<screenshot/>

           <!-- Вводим запрос "antalika" -->            

            <field id="text" textToType="jazzteam"/>

        <screenshot/>

           

            <!-- Нажимаем на кнопку "Yandex Search" -->

            <button cssSelector=".b-form-button__input"/>

<screenshot/>

           

            <!-- Проверяем что отобразились результаты поиска -->

            <webelement cssSelector=".b-body-items" action="isExists"/>

           <screenshot/>        

            <!-- Проверяем что в результатах поиска есть текст "mobile.antalika.com" -->

            <webelement cssSelector=".b-body-items" action="isContainsText" text="mobile.antalika.com"/>

        <screenshot/>

    </test>

</testcase>

Все скриншоты будут помещены в папку target/xml2selenium/test/... относительно корневого каталога проекта. Для каждого теста создаётся отдельный подкаталог. В каждом таком подкаталоге лежат артефакты данного теста. Артефакты - это файлы, которые генерирует фреймворк для лучшего понимания теста: различные отчёты, скриншоты, и так далее.

Чтобы поместить 2 и более теста в один тест-кейс, нужно просто после первого теста объявить следующий и т.д.:

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

    <test name="test yandex">

           <navigate to="http://www.yandex.by/"/>        

            <field id="text" textToType="jazzteam"/>

            <button cssSelector=".b-form-button__input"/>

       <webelement cssSelector=".b-body-items" action="isExists"/>

       <webelement cssSelector=".b-body-items" action="isContainsText" text="mobile.antalika.com"/>

    </test>

    <test name="test yandex 2">

           <!-- шаги следующего теста -->

    </test>

    <test name="test yandes 3">

           <!-- шаги третьего теста -->

    </test>

</testcase>

Стоит обратить внимание на то, что имена у тестов не должны совпадать!

3. Терминология

3.1 Scope/Context

Все теги (за исключением <testcase>) в фреймворке помещаются в родительские контейнерные теги. Можно провести аналогию с языками программирования, где каждое выражение, оператор принадлежит какой-то блочной конструкции, например, циклу, условию, процедуре, определению класса. Также дело обстоит и с областью видимости (доступностью) объявленных тегов в разных местах. Это означает, что если вы объявили тег в одном теге <test>, то он не станет автоматически виден в другом теге <test> по аналогии и со фреймами - если во фрейме объявлен тег - то он виден только внутри этого фрейма. Если тег виден внутри какого-то другого контейнерного тега, то есть его можно использовать внутри его каким-то образом, то говорят, что он находится в скоупе (scope), или в контексте (context) этого контейнерного тега.

3.2 Frame/Include

Когда далее по тексту мы будем использовать термин "фрейм" - имеется в виду контейнерный тег, плагин фреймворка <frame>, обеспечивающий возможность разбиения тестов на повторно-используемые части, в некоторых случаях их можно использовать даже между различными проектами. Фреймы также можно называть термином "инклюд" (include), ведь по сути, через механизм наследования тегов мы имеем возможность объявить фрейм с определёнными тегами, а потом в нашем тесте его использовать. Давайте договоримся, что термины "фрейм" и "инклюд" для нас будут равноправны.

3.3 Placeholder

Тег <variable> можно использовать для параметризации фреймов <frame>. Мы можем определить во фрейме переменные, возможно, с какими-то значениями, а возможно, и пустые, потом использовать эти переменные в атрибутах, выражениях других тегов данного фрейма (к примеру, для того, чтобы перейти к определённой странице, можно использовать переменную url). Далее при использовании такого фрейма мы можем переопределять значения данных переменных, что позволяет нам создавать повторно-используемые инклюды = фреймы. Стоит добавить возможность публиковать инклюды в репозиториях, очевидно, что для этого они должны быть параметризованы, то есть будут являться параметризованными инклюдами. Переменные <variable> можно называть параметрами инклюдов, или параметрами фреймов. Если в изначальном, родительском фрейме, переменная объявлена без значения, то такую переменную можно назвать плейсхолдер (placeholder, держатель места) - по сути она является параметром инклюда без значения по умолчанию.

Вообще, мы имеем возможность параметризовывать, и перегружать при наследовании фреймов переменные, теги, фреймы, включая пустые плейсхолдеры, которые могут быть переменными и фреймами.

4. Рекомендации и Best practices

4.1 Рекомендации по написанию простых тестов

4.1.1 Именование шагов теста

На каждый тег может быть указана ссылка (аттрибут ref). По ней можно впоследствии обращаться к данному тегу. В первую очередь это нужно для наследования от тега. Пример добавления ref в тег:

 

<field ref="loginField" subId="login"/> 

Ref должен быть уникальным для каждого тега.

4.1.2 Наследование

Наследование - это включение всего содержимого из родительского тега в потомка. При наследовании можно добавлять в потомке новые атрибуты или заменять уже существующие на другие (действия можно включать во фреймы). Чтобы реализовать наследование нужно использовать атрибут extends у тега. В этом атрибуте следует указать значение атрибута ref родительского тега. То есть потомок будет содержать все то, что есть у родителя и то, что он добавляет. Чтобы наследоваться, в потомке нужно указать атрибут extends и в нем указать значение из ref родителя.

Пример:

<!-- Добавляем ref для тега, но не указываем  текст, который можно ввести -->

<field ref="loginField" subId="login"/>

<!-- Наследуем тег от родителя с ref=”loginField”и добавляем новый атрибут -->

<field extends="loginField" textToType="LoginName" />

4.1.3 Переопределение

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

Пример:

<!-- Контейнер, который содержит тег с аттрибутом ref -->

<frame ref=”f1”>

        <field ref=”login” id=”loginInput” textToType=”some_login”/>

</frame>

<!-- Контейнер, который наследуется от другого контейнера и внутри переопределяет тег -->

<frame extends=”f1”>

<!-- Здесь используется переопределение тега с ref=”login”. Все аттрибуты тега login из фрейма f1 будут заменены аттрибутами, указанными в этом теге. Это значит, что аттрибут textToType из родительского тега не будет содержаться в переопределяемом теге.-->

        <field ref=”login” id=”loginInput” />

</frame>

4.1.4 Использование фреймов (frame)

Чтобы избегать частого дублирования кода в тесте можно воспользоваться тегом <frame>. Внутри этого тега просто перечисляются действия, которые нужно выполнить. Когда происходит вызов фрейма, выполняются все указанные внутри него действия. Изменим тест, проверяющий поиск на  yandex.by, добавив фрейм:

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

    <test name="test google">

        <navigate to="http://www.yandex.by/"/>                

        <!-- Нужные действия описываем во фрейме -->

        <frame ref="actions">

            <field id="text" textToType="jazzteam"/>

            <button cssSelector=".b-form-button__input"/>

            <webelement cssSelector=".b-body-items" action="isExists"/>

           <webelement cssSelector=".b-body-items" action="isContainsText" text="mobile.antalika.com"/>

        </frame>

    </test>

</testcase>

Принципиально тест не изменился, но все действия стали указываться внутри фрейма. Далее этот фрейм можно вынести в import-файл, параметризировать и использовать для других тестов: тестирование в google, тестирование по другим запросам и так далее.

4.1.5 Вынесение общих частей кода в отдельные файлы (import)

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

  1. <imports> - корневой тег в import-файле
  2. <import> - тег в файле теста для подключения import-файла

Файл с импортом должен содержать корневой тег <imports>, в который следует поместить все теги. Файл с импортами должен обязательно находится в каталоге resources и иметь расширение xml. Чтобы было возможным использование этих импортов, необходимо в файле с тестами подключить файл с импортами с помощью тега <import>. В приведённом ниже примере будут описаны те теги и фреймы, которые нужно использовать несколько раз в разных тестах.

Содержимое импорт-файла для предыдущего теста:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Файл-импорт начинается с тега imports  -->

<imports  xmlns="http://www.jazzteam.org/Routines" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">        

    <!-- Описание нужных действий, которые нужно использовать в разных тестах -->

    <frame ref="actions">

        <field id="text" textToType="jazzteam"/>

        <button cssSelector=".b-form-button__input"/>

        <webelement cssSelector=".b-body-items" action="isExists"/>

        <webelement cssSelector=".b-body-items" action="isContainsText" text="mobile.antalika.com"/>

    </frame>

</imports>

Назовём этот файл ImportFrame.xml и поместим в подкаталог imports папки resources:

resources/imports/ImportFrame.xml.

Теперь, чтобы вызвать этот фрейм, необходимо в тесте воспользоваться тегом <import>.

В тесте появится новая строчка:

        <import resource="imports/ImportFrame.xml" name="frames" />

Мы указываем путь к файлу с импортом: resource="imports/ImportFrame.xml" (на данный момент поддерживаются 3 типа путей: абсолютный, относительный самого файла и относительный папки resources) и задаем имя для этого импорта, по которому мы можем к нему обращаться name="frames". Чтобы вызвать фрейм из этого импорта нужно указать атрибут extends и в нем указать в начале имя самого импорта и через двоеточие имя того фрейма, который нам нужен.

<frame extends="frames:actions">

Пример станет выглядеть следующим образом:

Файл:  resources/imports/ImportFrame.xml

<?xml version="1.0" encoding="UTF-8"?>

<imports xmlns="http://www.jazzteam.org/Routines"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

    <!-- Описание нужных действий -->

    <frame ref="actions">

        <field id="text" textToType="jazzteam"/>

        <button cssSelector=".b-form-button__input"/>

        <webelement cssSelector=".b-body-items" action="isExists"/>

        <webelement cssSelector=".b-body-items" action="isContainsText" text="mobile.antalika.com"/>

    </frame>

</imports>

Файл: resources/testYandexExample.xml

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines” xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

        <import resource="imports/ImportFrame.xml" name="frames" />        

        <test name="test yandex">

                <navigate to="http://www.yandex.by/"/>

                <!-- Вызов фрейма из другого файла -->

                <frame extends="frames:actions"/>

        </test>

</testcase>

В месте, где происходит вызов фрейма, на самом деле создаем новый фрейм <frame extends="frames:actions"/>. В этом фрейме нет аттрибута ref, и в нём мы расширяем все действия родительского фрейма:

<frame ref="actions">

        <field id="text" textToType="antalika"/>

        <button cssSelector=".b-form-button__input"/>

        <webelement cssSelector=".b-body-items" action="isExists"/>

        <webelement cssSelector=".b-body-items" action="isContainsText" text="mobile.antalika.com"/>

</frame>

Cоздается новый фрейм, который получает все действия родительского фрейма.

Чтобы избегать дублирования кода, нужно активно использовать фреймы и импорты. Пример: нужно написать 2 теста, для поиска в российском и белорусском яндексе. Разница в тестах будет всего лишь заключаться в том, что нам нужно указать нужный url. Остальные шаги буду идентичными. Значит все идентичные шаги можно вынести в отдельный фрейм.

Файл: resources/imports/ImportFrame.xml

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">        

        <!-- Описание нужных действий, которые будут в обоих тестах -->

        <frame ref="actions">

                <field id="text" textToType="antalika"/>

                <button cssSelector=".b-form-button__input"/>

                <webelement cssSelector=".b-body-items" action="isExists"/>

                <webelement cssSelector=".b-body-items" action="isContainsText"

text="mobile.antalika.com"/>

        </frame>

</imports>

Файл resources/testYandexExample.xml можно изменить следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

        <!-- Получаем импорт -->

        <import resource="imports/ImportFrame.xml" name="frames" />

        

        <!-- Тестируем белорусский яндекс -->

        <test name="test yandex.by">

                <navigate to="http://www.yandex.by/"/>

                <frame extends="frames:actions"/>

        </test>

        

        <!-- Тестируем российский яндекс, действия те же, но url другой -->

        <test name="test yandex.ru">

                <navigate to="http://www.yandex.ru/"/>

                <frame extends="frames:actions"/>

        </test>

</testcase>

Без использование фреймов и импортов нам бы пришлось делать копи-паст.

4.1.6 Использование переменных

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

Тег <variable> стоит активно использовать, чтобы избежать дублирования текстовой информации, xpath, селекторов и id-шек. Стоит выносить переменные в отдельный импорт, или даже использовать тег <property>, который позволяет загрузить все переменные из проперти-файла одной командой. Это позволяет сократить время на последующую поддержку данных для тестов, и в будущем позволит использовать такие тесты для различных инсталяций и версий тестируемого приложения.

Чтобы использовать переменные существует специальный тег <variable>

<variable ref="url" value="http://www.yandex.by/"/>

Атрибуты

ref 

string

имя, по которому к переменной можно обращаться

value

string

значение, которое присваивается переменной

Чтобы использовать переменную необходимо в том месте, где она нужна, указать name этой переменной, помещенное в фигурные скобки со знаком доллара: ${}

<navigate to="${url}"/>

Пример:

<?xml version="1.0" encoding="UTF-8"?>

<testcase xmlns="http://www.jazzteam.org/Routines" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">

<!-- Объявляем переменную -->

<variable ref=”url” value=”http://www.yandex.by/” />

<test name="test yandex">

        <!-- Использование переменной в первом тесте-->

       <navigate to="${url}"/>

        <!-- Другие шаги теста -->

            <field id="text" textToType="jazzteam"/>

        <button cssSelector=".b-form-button__input"/>

           <webelement cssSelector=".b-body-items" action="isExists"/>

       <webelement cssSelector=".b-body-items" action="isContainsText" text="mobile.antalika.com"/>

    </test>

    <test name="test yandex 2">

<!-- Использование переменной во втором тесте-->

            <navigate to="${url}"/>

           <!-- шаги следующего теста -->

    </test>

    <test name="test yandes 3">

<!-- Использование переменной в третьем тесте-->

       <navigate to="${url}"/>

           <!-- шаги третьего теста -->

    </test>

</testcase>

4.1.7 Получение текста из браузера

        Из браузера можно получить значения текста, находящееся внутри любого HTML-тега. Текст можно получить из поля, кнопки и так далее. Для получения текста необходимо использовать тег <webelement> и в нем action=“getText”. Текст будет взят из элемента, на который указывает наш селектор (id, subId, cssSelector, xpath). Текст, полученный таким способом, будет автоматически помещен в переменную. Имя переменной указывается также в <webelement>. Для указания этой переменной необходимо написать это имя в атрибуте returnValueName. С этой переменной можно будет работать точно также как с другой переменной.

Пример:

        

<webelement id="search" action="getText" returnValueName="savedText"/>

В приведенном примере будет получен текст из элемента с id=”search”.

        Чтобы использовать полученный текст, нужно в фигурных скобках обратиться по имени, описанном в атрибуте returnValueName.

        <field id="maxWeight" textToType="${savedText}"/>

        Здесь полученный ранее текст будет записан в элемент с id = “maxWeight”.

4.1.8 Передача переменных через java-параметры

Кроме <variable> можно передавать параметры извне файла xml. Первый способ, который позволяет это сделать - это передача параметров через java-параметры, при запуске тестов.

Делается это так:

В тесте, где нужно использовать параметры нужно указать их имена, чтобы по этим именам их можно было получить. Например назовем такой параметр base_url. По этому имени нужно передавать параметр из командной строки и использовать его в тесте. Применять параметр можно также как и с тегом <variable>. Имя параметра помещается в  ${}, в нашем случае: ${base_url}. Теперь, чтобы передать параметр, нужно его явно указать в командной строке при запуске теста. Указывается в формате -Dимя_параметра=значение.

Например  -Dbase_url=http://www.yandex.by/ 

Чтобы передать его в тест нужно:

        после указания строчки запуска добавить нужный параметр:

mvn clean install -Dbase_url=http://www.yandex.by/ 

Введенная информация сохраняется в eclipse, в следующий раз при запуске теста, нужно только сделать цепочку Run As -> Run configurations... -> Run и тесты запустятся. При необходимости передаваемые параметры можно заменять.

4.1.9 Использование property-файлов

        Вторым способом задания параметров и значений для теста является получение их из property-файлов (проперти-файлы). Проперти-файл - это файл, в котором можно задавать пары ключ-значение, чтобы потом по этому ключу значение можно было получить. Каждая новая пара должна быть на новой строке. Чтобы получить значения из этих файлов используйте тег <property>. Файл property может содержать, например, такую информацию:

url.general=http://www.yandex.by/

url.secondary=http://www.yandex.ru/

где url.general и url.secondary - ключи, по которым можно обращаться к значениям: http://www.yandex.by/ и http://www.yandex.ru/.

Пример использования тега <property> в тесте:

<property resource="properties/params.properties" name="params"/>

Name здесь имеет тот же смысл, что и у тега <variable>. С помощью name можно будет получать значение из проперти-файла. Для этого нужно в ${} указать имя переменной в следующем формате: ${имя_проперти_файла.имя_переменной}.

Пример:

<navigate to="${params.url.general}"/>

Проперти-файлы можно класть в дочерний каталог src/test/resources.

4.1.10 Использование Groovy Scripting

В xml коде в атрибутах тегов можно использовать язык Groovy. Для этого необходимо код на Groovy поместить в фигурные скобки со знаком доллара: ${}

Пример:

<variable ref="url" value=" http://google.com/" />

<navigate to="${url}"/> - мы вызвали ранее объявленную переменную.

С помощью groovy можно вызывать все переменные используемые в контексте приложения, java-параметры, jvm-параметры и так далее.

Пример:

${os.name} – вызовет имя используемой операционной системы.

${file.separator} - в зависимости от используемой OC вызовет либо ‘\’ – для Windows, либо ‘/’ – для Linux.

Через Groovy можно работать со всеми java-функциями работы со строками, а так же с regExp'ом в тех функциях, которые это позволяют: matches, replaceAll, replaceFirst, split.

Примеры:

${('razz').replace('r', 'j')} – заменяем в слове "razz" букву "r" на "j".

<variable value="${('razz').replace('r', 'j')}" ref="jazz"/>

<variable ref="example" value="localhost" />

<assert action="equals" first="${example.substring(example.indexOf('h'))}" second="host"/>

Обрезаем строку, объявленную в переменной "example" от начала строки до символа "h".

<variable value="abrakadabra" ref="one"/>

<variable value="${one.replaceAll('[ad]', 'W')}" ref="two"/>

Заменяем в слове ‘abracadabra’ все буквы ‘a’ и ‘d’ на ‘W’, получаем 'WbrWkWWWbrW'

<assert action="equals" first='true' second="

${(('123-qwerty-456').matches('^\\d23-\\Dwerty-456$')).toString()}"/>

${(('123-qwerty-456').matches('^\\d23-\\Dwerty-456$')).toString()} – вернет true, если переменная со значением'123-qwerty-456' соответствует данному регулярному выражению '^\\d23-\\Dwerty-456$’

<assert first="${(4>1).toString()}" action="isTrue" />

${(4>1).toString()} – возвращает true, так как 4 больше 1. Так как переменная со значение «true» имеет тип  boolean, то мы переводим ее в тип string.

Переменная на выходе groovy выражения всегда должна быть типа string.

        

Также через groovy можно вызывать java методы.

Пример:

/ Проверяем размер скачанного файла. Groovy выражение ${x2s.util.FileUtil.getSize(path)} - позволяет вызвать статический метод java класса, и результат метода поместить в переменную, после чего значение этой переменной сравнивается с эталонным значением.

<assert first="${x2s.util.FileUtil.getSize(path)}" second="22" action="equals"/>

4.1.11 Служебные переменные

Во фреймворке существует ряд служебных переменных, которые можно использовать в тесте через groovy:

${xml2selenium.suiteId}

Уникальный id для каждого запуска тестов фреймворком. Этот id содержится в имени каталога с репортами. Задается автоматически в начале выполнения тестов на базе текущего времени  в миллисекундах. Каждый Java suite файл, из которого запускаются тесты,  имеет свой suiteId.

${xml2selenium.testCaseName}

Возвращает полное имя тесткейса (включая пакеты)

${xml2selenium.date}

Возвращает текущую дату в формате ДД.ММ.ГГГГ

${xml2selenium.testName}

Возвращает имя теста.

${xml2selenium.timeStamp}

Возвращает текущее время в миллисекундах (ms).

4.1.12 Создание динамических переменных

Под динамической переменной понимается переменная в значении которой может использоваться одна или несколько служебных переменных. Динамическая переменная зависит от той служебной переменной, которую она использует.

К примеру для создания уникальной переменной можно воспользоваться служебной переменной ${xml2selenium.timeStamp}, которая равна текущему времени в миллисекундахх:

<variable ref=”name” value=”name-${xml2selenium.timeStamp}”/>

Также можно создать переменную, которая будет уникальна для каждого теста, и внутри теста будет неизменяемой. Для этого можно использовать выражение ${xml2selenium.testName}. Такая переменная будет неизменна на протяжении всего теста, а при вынесении этой переменной в импорт файл и использовании в другом тесте, переменная будет иметь другое значение, зависящее от имени теста, в котором используется. Таким образом для создания переменных можно использовать различные способы.

4.1.13 Задание имен тестам и формирование удобных репортов

Именование тестов

Чтобы было удобно анализировать результаты работы тестов, для каждого теста и для всего тест-кейса, можно задавать атрибуты tags и description. Они задаются в тегах <test> или <testcase>.

tags - для добавления тега для бизнес-репортов. По этим тегам можно потом сортировать результаты работы тестов. Если нужно указать несколько тегов, то они задаются через запятую.

description - вставить описание для теста. Оно также будет отображено в бизнес репорте.

<test name="test yandex.by" tags="yandex, by"

description="test for check search resilt for belorussian yandex">

То как это будет отображено в репорте:

Разбиение теста на use cases

        Для того чтобы было удобно анализировать поведение и результаты теста можно разбить тест на use cases и отобразить их в Behavior-репорте. Для именования шагов теста следует воспользоваться специальным тегом <bdd>. Каждый <bdd> тег реагирует на ошибки в тесте и в случае проблемы будет подсвечен красным цветом.

        Для большей наглядности и анализа можно в теге <bdd> использовать переменные. Это позволит увидеть содержимое переменной в Behavior репорте.

        

4.1.14 Скачать файл во время выполнения теста

        На текущий момент существует два способа скачивания файлов:

 

Содержимое данной переменной можно проверить в теге assert,  или через Groovy-выражение.

Для того чтобы проверить загрузился ли файл можно воспользоваться тегом <assert>  и action="fileDownloaded", а абсолютный путь к файлу поместиться в переменную указанную в атрибуте first. Тег assert  и action="fileDownloaded" нужно следует устанавливать сразу после тега со скачиванием, и обязательно у тега для скачивания должен быть атрибут  expectedDownload=”true”.

Разные браузеры по разному себя ведут при скачивании файлов.  

Самый оптимальный браузер для скачивания - FireFox.

4.1.15 Работа с окнами браузера

При тестировании web-приложений нередко возникает потребность в переключении между вкладками, окнами браузера и модальными окнами.

Работа с вкладками и обычными окнами браузера

Во время выполнения теста вкладки открываются как окна браузера. Для переключения между окнами служит специальный тег <window>. С его помощью можно перейти в открытое окно браузера, закрыть окно, проверить в каком режиме открыто окно.

Работа с модальным окном

        Модальным называется окно, которое блокирует работу пользователя с родительским приложением до тех пор, пока пользователь не закроет  это окно.

Открытие и закрытие модального окна может осуществляется нажатием на любой элемент на странице.

Для открытия модального окна у тега <webelement> предусмотрен специальный атрибут: showModalDialog -  этот атрибут указывает, что, кликая по элементу, мы открываем модальное диалоговое окно и автоматически переходим к работе с элементами данного окна. По умолчанию атрибут равен false.

Для закрытия модального окна у тега <webelement> также предусмотрен специальный атрибут: closeModalDialog -  этот атрибут указывает, что, кликая по элементу, мы закрываем модальное диалоговое окно и возвращаемся на предыдущее окно. По умолчанию атрибут равен false.

 Данные атрибуты можно использовать только с action=’click’. При работе с модальными окнами окно браузера должно быть активным.

Примеры:

  1. <webelement id="inNewModal" action="click" showModalDialog="true"/>  - нажимаем на ссылку с id="inNewModal", открываем модальное окно и переходим в него. Далее все действия будут проводится в этом модальном окне. До тех пор пока это окно не будет закрыто.
  2. <webelement id="closeBtn" action="click" closeModalDialog="true"/> - нажимаем на кнопку, которая закрывает модальное окно и возвращаемся в родительское окно

        

При работе с модальным окном запрещается использовать тег <window>.

4.1.16 Указание причины, почему не отработал тег

        Если тест не прошел, то чтобы сделать ошибку более понятной во фреймворке есть специальный механизм. Можно задать для тега специальное сообщение, которое будет отображаться в случае неудачи на этом теге. Для этого предусмотрен атрибут message. Он может присутствовать во всех элементах, и текст, указанный в нем, будет отображаться в сообщении ошибки.

4.1.17 Тестирование страниц с Basic HTTP Authentication

Basic авторизация и аутентификация - это самый простой способ ограничения доступа к веб-приложениям и документам, предусмотренный стандартом протокола HTTP. При попытке обращения к таким ресурсам браузер формирует диалоговое окно, в котором предлагается ввести свой логин и пароль, после чего запрос выполняется повторно с предоставлением серверу данных для идентификации.

Пример окна с Basic Http аутентификацией в firefox:

 

Пример окна в chrome:

Для того чтобы избежать появления данного диалогового окна во время запуска тестов можно использовать специальный URL формата http://username:password@example.com/ для передачи учетных данных в теге <navigate>.        

4.2 Лучшие практики написания сложных тестов

4.2.1 Наследование элементов и фреймов.

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

Вообще, при наследовании фреймов запрещается в дочернем фрейме определять элементы с ref, отличным от ref элементов родительского фрейма, а также иметь элементы без ref, так как иначе при наличии новых элементов непонятно, в каком порядке их выполнять.

Таким образом, при наследовании фреймов мы имеем возможность переопределить любые элементы родительского фрейма (то есть всей родительской иерархии), включая внутренние фреймы, которые могут быть у родительского фрейма. Это позволяет в дочернем фрейме вставлять фреймы с определённым набором элементов вместо фреймов с другим набором элементов, а также даёт возможность в родительском фрейме вводить пустые фреймы, которые имеют смысл placeholder-ов - они являются метками, на место которых можно помещать логику при наследовании. Это - ещё один способ параметризации инклюдов. Пустые фреймы в родительском инклюде, фрейме назовём плейсхолдерами (placeholder). Резюмируя, мы имеем возможность параметризовывать, и перегружать при наследовании фреймов переменные, элементы, фреймы, включая пустые плейсхолдеры, которые могут быть переменными и фреймами.

4.2.2 Вставки в тесты javascript-кода

Иногда средствами фреймворка не удаётся выполнить какие-либо “тонкие” операции, что-то вычислить, сгенерировать случайное значение и так далее. Для этих нужд во фреймворке предусмотрены вставки на языке JavaScript. Вставки JavaScript-кода исполняются на открытой фреймворком в данный момент странице браузера. Передавать переменные можно как в JavaScript-код, так и из него далее в тест-кейс. Подробнее о вставках java script-кода и передаче переменных можно почитать в описании тега <script>.

4.2.3 Использования before/after для описания предусловий и постусловий выполнения тестов

Зачастую у тестов бывают предусловия и постусловия. Например перед выполнением теста нужно залогиниться, а после выполнения теста разлогиниться. Причём если тест упал, то разлогиниться нужно всё равно. Для этого во фреймворке предусмотрены теги <before> и <after>. Подробнее о их использовании можно почитать в документации тегов.

4.2.4 Библиотеки повторно-используемых фрагментов теста

Фреймворк позволяет сохранять фрагменты тестов в библиотеках и подключать эти библиотеки в тестовом проекте. На данный момент существует одна библиотека от разработчиков фреймворка xml2selenium-helper-lib, сейчас в ней есть функционал по работе с tinyMce, alert, confirm. На текущий момент библиотека xml2selenium-helper-lib имеет такую же версию как и сам фреймворк.

1. Как подключить библиотеку к проекту

В maven-проекте с тест-кейсами добавить зависимость в соответствующий блок

<dependencies>

        <!-- … другие зависимости … -->

<dependency>

   <groupId>org.jazzteam</groupId>

   <artifactId>xml2selenium-helper-lib</artifactId>

   <version>${xml2selenium.version}</version>

</dependency>

<!-- … другие зависимости … -->

</dependencies>

2. Как использовать библиотеку

2.1. Компонент для TinyMCE-редактора

2.1.1. Ввести текст в редактор tinymce:

<testcase>

<import name="tinymce" resource="tinymce/TinyMceTextPrint.xml" />

        <test>

                <!-- Заходим на страничку с редактором tiny mce -- >

                

                <!-- Для ввода в tiny mce используем фрейм из библиотеки -->

<frame extends="tinymce:tinyMceTextPrint">

   <!-- Текст, который хотим ввести -->

   <variable ref="text" value="some text 1" />

  <!-- ID редактора, в который хотим ввести. Берётся из html-кода страницы  <textarea name="text" style="width: 100%; height: 400px; overflow-y: auto;" id="terms"></textarea> -->

   <variable ref="instance" value="terms" />

</frame>

        </test>

</testcase>

2.1.2. Получить текст из редактора tinymce:

<testcase>

<import name="tinymce" resource="tinymce/TinyMceTextRead.xml" />

        <test>

                <!-- Заходим на страничку с редактором tiny mce -- >

                

                <!-- Для получения текста из tiny mce используем фрейм из библиотеки -->

<frame extends="tinymce:tinyMceTextRead">  

  <!-- ID редактора, в который хотим ввести. Берётся из html-кода страницы  <textarea name="text" style="width: 100%; height: 400px; overflow-y: auto;" id="terms"></textarea> -->

   <variable ref="instance" value="terms" />

</frame>

                <!-- В результате текст будет помещен в переменную с именем textFromTinyMce, которую можно будет в дальнейшем использовать в тесте→

        <assert first="${textFromTinyMce}" second="some text" action="equals"/>

        </test>

</testcase>

2.1.3. Получить HTML содержимое редактора tinymce:

<testcase>

<import name="tinymce" resource="tinymce/TinyMceTextRead.xml" />

        <test>

                <!-- Заходим на страничку с редактором tiny mce -- >

                

                <!-- Для получения HTML-содержимого редактора tiny mce используем фрейм из библиотеки -->

<frame extends="tinymce:tinyMceContentRead">

<!-- ID редактора, в который хотим ввести. Берётся из html-кода страницы  <textarea name="text" style="width: 100%; height: 400px; overflow-y: auto;" id="terms"></textarea> -->

   <variable ref="instance" value="terms" />

</frame>

                <!-- В результате текст будет помещен в переменную с именем contentFromTinyMce, которую можно будет в дальнейшем использовать в тесте-->

<assert first="${contentFromTinyMce}" second="&lt;p&gt;some text&lt;/p&gt;" action="equals"/>

        </test>

</testcase>

2.2 Компонеты для работы с диалоговыми окнами

2.2.1 для alert - переопределяем функцию alert:

<testcase>

<import name="alert" resource="systemDialog/Alert.xml" />

        <test>

                <!-- Заходим на страничку с вызовом alert -- >

                <!-- Переопределяем функцию alert -->

                <!-- Для вызова alert используем фрейм из библиотеки -->

<frame extends="alert:alertResult">

<!-- Результат возвращаемый функцией alert, true - нажимаем Да, false - нажимаем Нет -->

<variable ref="result" value="true"/>

</frame>

        </test>

</testcase>

2.2.2. для confirm - переопределяем функцию confirm:

<testcase>

<import name="confirm" resource="systemDialog/Confirm.xml" />

        <test>

                <!-- Заходим на страничку с вызовом confirm -- >

                

                <!-- Для вызова confirm используем фрейм из библиотеки -->

                <frame extends="confirm:confirmResult">

<!-- Результат возвращаемый функцией confirm, true - нажимаем Да, false - нажимаем Нет -->

<variable ref="result" value="true"/>

</frame>  

            </test>

</testcase>

2.3. Компоненты, позволяющие переходить на предыдущие и следующие страницы в history браузера, программным образом эмулируя кнопки Back/Forward.

2.3.1. Перейти на предыдущую страницу, как если бы пользователь нажал на кнопку браузера "Назад".

Если предыдущей страницы нет, то вызов этого метода ничего не даст, но и не приведет к генерации исключения.

<testcase>

<import resource="navigation/History.xml" name="history"/>

        <test>

                <!-- Заходим на страничку выполняем необходимые действия-- >

                <!-- Для вызова функиии перехода на предыдущую страницу используем фрейм из библиотеки -->

                <frame extends="history:back"/>    

            </test>

</testcase>

2.3.2. Перейти на следующую страницу, как если бы пользователь нажал на кнопку браузера "Вперед".

Вызов этого метода на последней странице не приведет к какому-либо результату и не сгенерирует исключение.

<testcase>

<import resource="navigation/History.xml" name="history"/>

        <test>

                <!-- Заходим на страничку выполняем необходимые действия-- >

                <!-- Для вызова функиии перехода на следующую страницу используем фрейм из библиотеки -->

                <frame extends="history:forward"/>

            </test>

</testcase>

2.3.3. Перейти на страницу истории посещений, находящуюся на позиции delta относительно текущей. Если delta лежит за границами истории посещений (например -1 для первой страницы), то метод ничего не сделает и не вызовет исключение.

<testcase>

<import resource="navigation/History.xml" name="history"/>

        <test>

                <!-- Заходим на страничку выполняем необходимые действия-- >

                

        <!-- Для вызова функиии перехода на определенную страницу используем фрейм из библиотеки -->

                <frame extends="history:go">

                        <!-- Позиция относительно текущей страницы, на которую необходимо перейти-->

                        <variable ref="delta" value="-1"/>

                </frame>    

            </test>

</testcase>

2.4. Компонент, позволяющие прокрутить содержимое элемента на странице по вертикали. Доступ к элементу осуществляется по CSS селектору.

2.4.1. Прокрутить содержимое элемента на странице вниз или вверх (если указывать в переменной position положительное значение - прокручивать вниз, если отрицательное число - вверх)

<testcase>

<import resource="scrolling/ScrollElement.xml" name="scroll"/>

        <test>

<!-- Заходим на страничку выполняем необходимые действия -->  

<!-- Для вызова функиии перехода на предыдущую страницу используем фрейм из библиотеки -->  

<frame extends="scroll:scrollTopByCSSSelector">

<!-- CSS селектор для доступа к элементу -- >

<variable ref="cssSelector" value="#scrollingElement"/>

<!-- Позиция относительно текущей позиции содержимого элемента, на которую необходимо прокрутить --> 

<variable ref="position" value="1000"/>

</frame>

</test>

</testcase>

        

4.3 Лучшие практики по работе с технологиями

4.3.1 XPath

Старайтесь при работе с xpath выражениями составлять такой xpath, который не будет изменяться при дальнейшей разработке приложения. Заранее смотрите по своему xpath, не станет ли он неактуальным в будущем. К примеру, вот такой xpath скорее всего, в будущем будет неактуальнымю.

//form[@id='regist_form' and @class='reg_info']/div[@class='registr_block']/p[1][@class='yellow_but']/input[2][@class='regbut']

5. Документация к тегам

5.1 Веб-тестирование

5.1.1 Работа с dom-элементами веб-страницы

5.1.1.1 <webelement>

Описание

Базовый тег для описания действий с любым dom-элементом страницы. Содержит в себе селектор веб-элемента и действия над ним. Для того, чтобы тег успешно мог отработать, необходимо указать как минимум 2 атрибута: один для задания селектора, это один из атрибутов: id, subId, xpath, tagName, cssSelector, второй для указания действия, это атрибут: action.

Атрибуты

Обязательные:

id

string

выбор элемента по его полному id

subId

string

выбор элемента по части id (будет найден первый элемент на странице, id которого будет содержать указанный subId)

xpath

string

выбор элемента по xpath

tagName

string

выбор элемента по названию тега, если элементов несколько, то выберется первый элемент с таким тегом в dom модели

cssSelector

string

выбор элемента по css

action

string

для задания действия элементу. Может принимать только значения из определенного списка, приведенного ниже

Необязательные:

ref

string

Указывает имя тега, используя которое тег можно перегрузить или использовать повторно

extends

string

указывает родителя для тега

text

string

для указания текста для действий isContainsText или isNotContainsText. Он нужен только если выбрано действие isContainsText или isNotContainsText. Так же как имя html-атрибута, значение которого необходимо взять с помощью процессора getAttribute, как ключ:новое_значение  для процессора  setAttribute

returnValueName

string

для задания имени переменной, куда поместиться полученное из элемента значение. Атрибут является обязательным только если выбрано действие getText, getAttribute, getSize или getHTML. В последствии по этому имени можно обращаться к переменной, где будет храниться полученное значение. Для имен переменных разрешается использовать только следующие символы: буквы латинского и русского алфавитов, цифры, точку, подчеркивания.

showAlert

true false

указывает, что ожидается появление диалогового окна

expectedDownload

true

false

указывает, что ожидается загрузка файла

showModalDialog

true false

этот атрибут указывает, что, кликая по элементу, мы открываем модальное диалоговое окно и автоматически переходим к работе с элементами данного окна. По умолчанию атрибут равен false.  Aтрибут можно использовать только с действием click. При открытии модального окнами необходимо учесть, что окно браузера должно быть активно, элемент на который по которому будет происходить нажатие должен быть виден на странице, также нельзя изменять положение курсора мышки. Если вы используете ваш браузер с профайлом - необходимо в настройках профайла отключить панель дополнений.

closeModalDialog

true

false

этот атрибут указывает, что, кликая по элементу, мы закрываем модальное диалоговое окно и возвращаемся на предыдущее окно. По умолчанию атрибут равен false. Aтрибут можно использовать только с действием click

condition

true

false

этот атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий

smartWaitFor

String

Включает ожидание обязательного элемента перед выполнением действий над вебэлементом на тестируемой странице. Содержит следующие настройки:

  • timeout - максимальное время, за которое должен появиться элемент, в миллисекундах
  • step - шаг ожидания, в миллисекундах
  • id, xpath, cssSelector или tagName - селектор (идентификатор) обязательного элемента, который появляется после полной загрузки страницы

Важно: При работе с модальными окнами, окно браузера должно быть активным

Действия (действие указывается в атрибуте action):

isContainsText

проверяет, присутствует ли у элемента текст, определенный в атрибуте text

isNotContainsText

проверяет, отсутствие ли у элемента текст, определенный в атрибуте text

isExists

проверить присутствует ли на странице указанный элемент (действие по умолчанию)

isNotExists

проверить, что указанный элемент не присутствует на странице

isEnabled

проверить является ли "включенным" dom-элемент

isDisplayed

проверить, отображается ли на странице в настоящий момент элемент

isNotDisplayed

проверить, что указанный элемент не отображается на странице в настоящий момент

click

кликнуть на элемент

getText

получить текст из элемента и поместить его в переменную с именем, указанным в атрибуте returnValueName.  Эту переменную дополнительно создавать и указывать не надо, она автоматически создается и помещается в контекст, после сохранения текста со страницы.

mouseMove

передвинуть мышь в координаты элемента, процессор определяет расположение элемента с помощью селектора

getAttribute

возвратить атрибут html-элемента и поместить его в переменную с именем, которое указано в атрибуте returnValueName, если такого атрибута не существует или у него не задано значение, то возвращается null

setAttribute

установить атрибут для указанного html-элемента, в атрибут text необходимо прописать информацию в таком формате имя_атрибута:новое_значение

download

скачать файл. Позволяет скачивать файлы по ссылкам, используя содержимое атрибута href, а также скачивать картинки, используя содержимое атрибута src. Файл по умолчанию сохраняется в артефакты теста, а путь к файлу помещается в переменную указанную в атрибуте returnValueName

getHTML

возвращает атрибут outerHTML текущего элемента в виде отформатированной строки  и помещается в переменную с именем, указанным в атрибуте returnValueName

getSize

позволяет получить количество веб-элементов, которые вернутся по id, xpath, css или tagName селекторам, и поместить полученное количество веб-элементов в переменную с именем, указанным в атрибуте returnValueName

openLinkInNewWindow

позволяет при клике на ссылку открыть страницу в новом окне. Новая страница будет открыта в фоновом режиме, для перехода на нее нужно будет воспользоваться тегом <window>

Примеры использования:

<webelement subId="logout_link" action="isDisplayed"/>
<webelement xpath="jd406_1:menu_system_logout_link" action="isExists"/>
<webelement cssSelector="jd406_1:menu_system_logout_link" action="isEnabled"/>
<webelement cssSelector="login_button" action="getText"/>
<webelement id="jd406_1:menu_system_logout_link" action="click"/>
<webelement id="loginLink" action="getText" returnValueName="savedPage"/>

<webelement action="download" id="downloadFile" returnValueName="path"/>

<test>
   <navigate to="http://localhost:${jetty.port}/test/"/>
   <field xpath="//form[@id='loginForm']/div/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/input" textToType="fr1"/>
   <field xpath="//form[@id='loginForm']/div/table/tbody/tr[3]/td/table/tbody/tr[3]/td[2]/input" textToType="fr1"/>
       
   <!-- Click 'login' button -->
   <webelement id="login_button" action="click"/>
   <!-- Wait for display of 'logout' button -->
   <webelement subId="menu_system_logout_link" action="isDisplayed"/>
       
   <!-- Click 'logout' button -->
   <webelement id="j_id46:menu_system_logout_link" action="click"/>
   <!-- Wait for display of 'login' button -->
   <webelement id="login_button" action="isDisplayed"/>
</test>

Пример использования getText

<test name="Get text from div" tags="framework, common, getText">

    <navigate to="http://localhost:${jetty.port}/test/specialSearch.html" />

    <webelement id="someText" action="getText" returnValueName="savedText"/>

    <field id="maxWeight" textToType="${savedText}"/>

    <webelement id="maxWeight" action="isContainsText" text="Div text"/>

</test>

Пример использования getAttribute

<button action="isExists" id="button" />

// В элеменете с id = “button” берём атрибут id и помещаем его значение в переменную oldAttrValue, значение переменной oldAttrValue будет равно “button”

<webelement action="getAttribute" id="button" text="id" returnValueName="oldAttrValue"/>

Пример использования getSize

<webelement action="getSize" id="loginInput" returnValueName="sizeLoginInput" />

Пример использования setAttribute

<button action="isExists" id="button" />

// В элементе с id=”button” устанавливаем значение атрибута alt на newAttributeValue.

<webelement action="setAttribute" id="button" text="alt:newAttributeValue"/>

Пример использования download

<webelement action="isExists" id="downloadFile" />

// В элеменете с id = “downloadFile” берём путь к файлу, обычно это содержимое href для ссылки, скачиваем файл в артефакты теста, и помещаем путь к скаченнному файлу в переменную path

<webelement action="download" id="downloadFile" returnValueName="path"/>

// Проверяем, что переменная path существует

<assert first="path" action="variableExists" />

// Проверяем, что переменная содержит путь к файлу,  Т.к. файл сохраняется в артефакты теста. Groovy выражение ${file.separator} позволяет получить системную переменную, отвечающую за разделители в путях, Это поможет запускать тест на разных операционных системах.

<assert first="${path}" second="xml2selenium${file.separator}test${file.separator}fr

ameworkTests${file.separator}actions${file.separator}Download#xml${file.separator}Download text file

${file.separator}1.txt" action="isContainsText" />

// Проверяем размер скачанного файла. Groovy выражение ${x2s.util.FileUtil.getSize(path)} - позволяет вызвать метод java класса, и результат метода поместить в переменную, после чего значение этой переменной сравнивается с эталонным значением.

<assert first="${x2s.util.FileUtil.getSize(path)}" second="22" action="equals"/>

Пример использования атрибутов showModalDialog, closeModalDialog  для работы с модальными окнами

<test name="Assert for new modal popap open and return value" description="Test for check open new modal popap and return vaue" tags="window, modal_dialog, M31" coverage="100">                <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />        

        <variable ref="login" value="someLogin"/>

        <variable ref="password" value="somePassword"/>

                

        <webelement ref="linkForNewTab" id="inNewModalReturnValue" action="isExists" />

        <webelement extends="linkForNewTab" action="click" showModalDialog="true"/>

        <window assert="newWindowOpened:current" />

                

        <frame ref="fillValue">                        

                <field id="loginInputRet" textToType="${login}"/>                        

                <field id="passwordInputRet" textToType="${password}"/>

                <webelement id="addBtn" closeModalDialog="true"/>

        </frame>        

                        

        <webelement extends="linkForNewTab" action="isExists"/>

        <webelement id="loginInput" action="isContainsText" text="${login}"/>

        <webelement id="passwordInput" action="isContainsText" text="${password}"/>

</test>

Пример использования openLinkInNewWindow

<webelement id="inNewTabWithoutTransition" action="openLinkInNewWindow" />

<window action="goToNewWindow"/>

5.1.1.2 <button>

Описание

Тег для осуществления нажатия на элемент со страницы. Наследуется от <webelement> и может использовать все его методы. Работает этот тег по такому же принципу, что и <webelement>. По умолчанию определяет действие - атрибут action, как click.

Атрибуты

Все атрибуты аналогичны атрибутам из <webelement>. Отличие состоит в том, что тег сразу реализует атрибут action = "click"

Примеры использования

<!-- Нажимаем на кнопку с id="if909:id_button". -->
<button ref="buttonName" id="if909:id_button" />

<!-- Нажимаем на кнопку с id="*_button*". -->
<button ref="buttonName" subId="_button" />

<test>
    <navigate to="http://localhost:${jetty.port}/test/"/>
   <field xpath="//form[@id='loginForm']/div/table/tbody/tr[3]/td/table/tbody/tr[1]/td[2]/input" textToType="0UITO"/>
   <field xpath="//form[@id='loginForm']/div/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/input" textToType="fr1"/>
   <field xpath="//form[@id='loginForm']/div/table/tbody/tr[3]/td/table/tbody/tr[3]/td[2]/input" textToType="fr1"/>
       
   <!-- Click 'login' button -->
   <button id="login_button"/>
   <!-- Wait for display of 'logout' button -->
   <webelement subId="menu_system_logout_link" action="isDisplayed"/>
       
   <!-- Click 'logout' button
-->
    <button id="j_id46:menu_system_logout_link"/>
   <!-- Wait for display of 'login' button -->
   <webelement id="login_button" action="isDisplayed"/>
</test>

5.1.1.3 <checkbox>

Описание

Тег для работы с чекбоксами на странице. Наследуется от <webelement> и может использовать все его атрибуты. Работает этот тег по такому же принципу, что и <webelement>. По умолчанию определяет действие (атрибут action) как click.

Атрибуты

Все атрибуты аналогичны атрибутам из <webelement>.

Действия (действие указывается в атрибуте action):

click

кликнуть на чекбокс (действие по умолчанию)

enable

перевести чекбокс в состояние enabled

disable

перевести чекбокс в состояние disabled

isEnabled

проверить является ли состояние чекбокса enable. Если нет - появляется ошибка

isDisabled

проверить является ли состояние чекбокса disable. Если нет - появляется ошибка

Примеры использования

<сheckbox id="checkboxId1" action="isEnabled"/>
<сheckbox id="checkboxId1" />

<test name="testing disable action of checkbox and checking state" tags="checkbox">
   <navigate to="http://localhost:${jetty.port}/test/checkbox.html" />
   <сheckbox id="checkboxId3" action="disable"/>
   <сheckbox id="checkboxId3" action="isDisabled"/>
   <сheckbox id="checkboxId3" action="disable"/>
   <сheckbox id="checkboxId3" action="isDisabled"/>
</test>

5.1.1.4 <combobox>

Описание

Тег для выбора значения в combobox элементе. Наследуется от <webelement> и может использовать все его методы. Работает этот тег по такому же принципу, что и <webelement>. По умолчанию определяет действие (атрибут action) как select.

Атрибуты

Все атрибуты аналогичны атрибутам из <webelement>. Дополнительно добавляет новые обязательные атрибуты (Атрибуты являются обязательными, только если выбрано действие select у этого тега):

by

text

value

number

text - выбирать значение из комбобокса по тексту

value - выбирать значение из комбобокса по value этого значения

number - выбирать значение из комбобокса по номеру из списка всех значений

value

string

значение, которое нужно выбрать

Действия (которые можно использовать в атрибуте action)

select

выбрать значение из комбобокса. Это действие сразу определено по умолчанию у комбобокса (по умолчанию)

isContainsText

проверяет, чтобы в одном из значений комбобокса было указанное в теге text значение

isNotContainsText

проверяет, чтобы ни в одном из значений комбобокса не было указанного в теге text значения

Примеры использования

<combobox id="comboBox" action="isContainsText" text="Blue" />
<combobox id="comboBox" action="select" by="number" value="1" />
<combobox id="comboBox" by="value" value="orange" />

<test name="Get string value from property" tags="combobox

    <property resource="combobox/combobox.properties" name="propertyValue" />
   <navigate to="http://localhost:${jetty.port}/test/specialSearch.html" />
   <combobox id="comboBox" by="value" value="${propertyValue.valueString}" />
   <combobox id="comboBox" action="isContainsText" text="Orange" />
</test>

5.1.1.5 <field>

Описание

Тег для описания действий с полем для ввода. Наследуется от <webelement> и может использовать все его методы. Работает этот Тег по такому же принципу, что и <webelement>. Кроме того, добавляет новое действие для тега: type. По умолчанию определяет действие (атрибут action) как type. Это означает, что он вводит данные в поле.

Атрибуты

Все атрибуты аналогичны атрибутам из <webelement>.

Дополнительно добавляет новые обязательные атрибуты

Обязательные:

textToType 

string

указывает текст, заданный для ввода в поле.

Необязательные:

clearOldText

true

false

eсли значение true - то старый текст в поле будет удален, а на его место будет помещен новый. Если false - то старый текст не будет удаляться из поля и дополнительно к нему будет добавлен новый текст.

Действия (действие указывается в атрибуте action):

type

вводит текст из атрибута textToType  в поле ввода

Примеры использования

<field xpath="//form[@id='loginForm']/div/table/tbody/tr[3]/td/table/tbody/tr[1]/td[2]/input" textToType="code"/>
<field id="loginForm" textToType="login" clearOldText="false"/>

<test>
   <navigate to="http://localhost:${jetty.port}/test/"/>
   <field xpath="//form[@id='loginForm']/div/table/tbody/tr[3]/td/table/tbody/tr[2]/td[2]/input" textToType="login"/>
   <field ref="loginPassword" cssSelector="input[name='j_password']" textToType="password"></field>
       
   <!-- Click 'login' button -->
   <button id="login_button"/>
   <!-- Wait for display of 'logout' button -->
   <webelement subId="menu_system_logout_link" action="isDisplayed"/>
       
   <!-- Click 'logout' button -->
   <button id="j_id46:menu_system_logout_link" />
   <!-- Wait for display of 'login' button -->
   <webelement id="login_button" action="isDisplayed"/>

</test>

  5.1.1.5 <radio>

Описание

Тег для работы с radiobutton на странице. Наследуется от <webelement> и может использовать все его аттрибуты. Работает этот тег по такому же принципу, что и <webelement>. По умолчанию определяет действие (атрибут action) как click. Это означает, что он выбирает радио элемент.

Выбор конкретного элемента из группы radio может происходить с помощью:

1. Селектора

2. По тексту относящемуся к тегу input

3. По номеру в группе элементов radio

Атрибуты

Все атрибуты аналогичны атрибутам из <webelement>.

Дополнительно добавляет новые атрибуты:

Обязателен один из атрибутов:

id

string

выбор элемента по его полному id

number

string

номер элемента в группе

text

string

текст, который относится к radio элементу

groupName

string

имя элемента из атрибута name, к примеру:

<input name="group1" type="radio" id="red1" value="Red"/>,

в этом случае groupName=”group1”

Действия (действие указывается в атрибуте action):

click

кликнуть на radio элемент

isChecked 

используется для того, чтобы проверить выбран ли радио элемент

Примеры использования

<radio id="" />

<radio groupName="" number=""/>

<radio groupName="" text=”" />

<radio id="" action=”isChecked” />

Выборка по id

HTML

<div>

    <form action="/" method="get">

        <input name="group1" type="radio" id="red1" value="Red" />Red<br />

        <input name="group1" type="radio" id="blue1" value="Blue" />Blue<br />

        <input name="group1" type="radio" id="green1" value="Green" />Green<br />

        <input type="submit" id="btn" value="Submit" />

    </form>

</div>

TEST

<test name="Testing default action of radio" tags="radio">

    <navigate to="http://localhost:${jetty.port}/test/radio.html" />

    <radio id="red1" />

    <radio id="green1" />

    <radio id="blue1" />

    <button id="btn" />

</test>

Выборка по номеру

HTML

<div>

    <form action="/" method="get">

        <input name="group2" type="radio" id="red2" value="Red" />

        <label for="red2">Outer label1</label><br>

        <input name="group2" type="radio" id="blue2" value="Blue" />

        <label for="blue2">Outer label2</label><br>

        <input name="group2" type="radio" id="green2" value="Green" />

        <label for="green2">Outer label3</label><br>

        <input type="submit" id="btn" value="Submit" />

    </form>

</div>

TEST

<test name="Testing default action of radio by number" tags="radio">

    <navigate to="http://localhost:${jetty.port}/test/radio.html" />

    <variable ref="group" value="group1"/>

    <radio groupName="${group}" number="1"  />

    <radio groupName="${group}" number="2" />

    <radio groupName="${group}" number="3" />

    <button id="btn" />

</test>

Выборка по тексту

HTML

<div>

    <form action="/" method="get">

        <input name="group1" type="radio" id="green1" value="Green" />

        Green

        <br/>

        <input name="group2" type="radio" id="red2" value="Red" />

        <label for="red2">Outer label1</label>

        <br>

        <label>

            <input name="group3" type="radio" id="green3" value="Green"/>

            Inner label3

        </label>

        <input type="submit" id="btn" value="Submit" />

        </form>

</div>

TEST

<test name="Testing default action of radio by text" tags="radio">

    <navigate to="http://localhost:${jetty.port}/test/radio.html" />

    <variable ref="group1" value="group1"/>

    <variable ref="group2" value="group2"/>

    <variable ref="group3" value="group3"/>

    <radio groupName="${group1}" text="Green" />

    <radio groupName="${group2}" text="Outer label” />

    <radio groupName="${group3}" text="Inner label3" />

    <button id="btn" />

</test>

5.1.2 Поведение браузера

5.1.2.1 <navigate>

Описание

Открывает в браузере страницу по заданному url. Используется обычно для запуска тестов - для указания стартовой страницы, откуда начинается тест. Поддерживает протокол file:///. Если попытаться открыть несуществующую или недоступную страницу то тест завершится с исключением. Проверка на доступность страницы осуществляется только для протоколов http:// и file:///. Остальные протоколы открываются в браузере без проверки.

Атрибуты

Обязательные:

to

string

url страницы, которую нужно открыть

Необязательные:

ref

string

дает имя тега, используя которое тег можно перегрузить или использовать повторно

extends 

string

указывает родителя для тега

expected404page

true

false

устанавливается, если необходимо протестировать страницу, на которую будем попадать в случае 404 ошибки.  По умолчанию данный атрибут равен false. Eсли данный атрибут не будет указан, или будет равен false, и сервер вернет ошибку 404 - тест завершится с ошибкой: URL '%url%' is not a available with response code 404.

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

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий

Код

<navigate to="http://xml2selenium.com" />
<navigate to=
"file:///c:\pages\mypage.html" ref="navigateMyPage" />

Примеры использования

<test>
  <!-- В начале теста будет открыта страница google.com -->
  <navigate to="http://www.google.com"/>

  <field ref="searchField" cssSelector="[name='q']" textToType="xml2selenium"/>
  <field extends="searchField" textToType=" by JazzTeam"/>
  <button cssSelector="[name='btnK']"/>
</test>

 5.1.2.2 <upload>

Описание

        Тег предоставляет возможность выбрать ресурс для загрузки при использовании на странице страндартного html-тега <input type=”file”/>. Поведение стандартного html-тега требует ручного выбора ресурса из файловой системы, после выбора ресурса его имя помещается в поле <input/>.

Тег <upload/> позволяет пропустить шаг ручного выбора ресурса из файловой системы, он напрямую помещает имя ресурса в поле <input/>

        

Атрибуты

Все атрибуты аналогичны атрибутам из <webelement>.

Дополнительно добавляет новые необязательные атрибуты:

resource

string

путь к файлу для загрузки, который может быть как абсолютный так и относительный.

Абсолютный путь рассчитывается от корня файловой системы, то есть для загрузки можно использовать любой файл в файловой системе.

Относительный путь рассчитывается от папки с файлом теста в котором используется upload, то есть чтобы использовать данный формат пути, файл для загрузки необходимо положить в папку с тестом.

В случае если тесты запускаются на jenkins, файл для загрузки необходимо положить в папку с тестом и использовать относительный путь.

Дополнительно к этому по умолчанию определяется атрибут action:

upload

позволяет поместить содержимое атрибута resourse этого тега в поле <input/>

Код

<upload ref="upload" id="fileUpload" resource="files/file.txt"/>

Примеры использования

<test name="Upload resource" tags="upload">

   <navigate to="http://localhost:${jetty.port}/test/upload.html" />

       

   <upload id="fileUpload" resource="file.txt"/>

   <upload id="fileUpload" action="isContainsText" text="resource-file"/>

</test>

5.1.2.3 <script>

Описание

Тег для выполнения скрипта какого-либо языка программирования на текущей странице. Cодержит один дочерний тег со скриптом конкретного языка программирования. В данный момент присутствует поддержка javascript с помощью тега <javascript>. Для работы данного тега необходимо разместить код внутри тега <javascript> . В случае если тег <javascript> содержит html или xml код, или какие-то символы, которые не являются верными в XML (<,>, “”, &) необходимо содержимое тега <javascript> поместить в тег <![CDATA[<!-- javascript code--> ]]>.

        

Атрибуты

Необязательные:

ref

string

дает имя тега, используя которое тег можно перегрузить или использовать повторно

extends 

string

указывает родителя для тега

condition

true

false

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

Код

<script

   <javascript>

      <!-- javascript code →

   </javascript>

</script>

Примеры использования

<script>

   <javascript>

      document.getElementById('DoLoginBtn').click();

   </javascript>

</script>

        

С помощью javascript метода document.write() можно динамически добавить на страницу html код. В данном случае необходимо поместить javascript код в тег

<![CDATA[<!-- javascript code--> ]]>.

<script>

        <javascript>

        <![CDATA[

                document.open();

                document.write('<input type="submit" id="button1" value="Button1"/>');

                document.close();]]>

        </javascript>

</script>

Получение сообщения ошибки выполнения javascript кода

Тег <script> отлавливает все ошибки произошедшие в javascript коде и возвращает как результат выполнения теста AssertsException с сообщением об ошибке.

Пример:

<test name="Fail test from javascript with exception" tags="Script, error, JavaScript, M19" expectedMessage="precision 100000 out of range">

        <navigate to="http://localhost:${jetty.port}/test/login.html" />

        <script>

                <javascript>

                <![CDATA[        

                         var pi = 3.14159;

                         pi.toFixed(100000);

                 ]]>

                </javascript>

        </script>

</test>        

Сообщения об ошибочной ситуации выполнения теста из javascript кода

Тег <script> предоставляет возможность остановить выполнение теста с ошибочным результатом. Для этого необходимо записать в переменную x2s_error сообщение об ошибке, которое затем будет отображено как сообщение в AssertsException в результате выполнения теста.

Пример:

<test name="Fail test from javascript" tags="Script, error, JavaScript, M19" expectedMessage="error">

   <navigate to="http://localhost:${jetty.port}/test/login.html" />

   <script>

      <javascript>

         <![CDATA[

            x2s_error = "error";

         ]]>

      </javascript>

   </script>

</test>

Передача переменных в javascript-код

Тег <script> предоставляет возможность передавать в код на javascript переменные, определённые, например, тегом <variable>, или переданные как jvm-параметры.

Пример:

<variable ref=”buttonId” value=”some text”>

<script>

        <!-- “Кавычки” в javascript-методе сохраняем! -->

        <javascript>

        <![CDATA[

                        document.getElementById(“${buttonId}”).click();

                ]]>

        </javascript>

</script>

Передача переменных из javascript-кода в тест-кейс

Для передачи переменных используется массив x2s_context

<script>

   <!-- “Кавычки” в javascript-методе сохраняем! -->

        <javascript>

   <![CDATA[

      // Получаем значение из какого-нибудь текстового поля

            var myvalue = document.getElementById(someTextField).value;

         x2s_context["someTextFieldValue"] = myvalue;

           ]]>

        </javascript>

</script>

<!-- Далее в тесте используем полученное значение -->

<field action=”isContainsText” text=”${someTextFieldValue}” />

5.1.2.4 <window>

Описание

        Тег для работы с вкладками. Позволяет переключаться между вкладками, открывать и закрывать вкладки. Необходимо учесть, что при выполнении тестов новая вкладка откроется в новом окне браузера.

Атрибуты

Необязательные:

assert

newWindowOpened:background

newWindowOpened:current

для проверки открытия нового окна. Может принимать только значения из определенного списка:

newWindowOpened:background - проверяет, открыто ли новое окно в фоновом режиме

newWindowOpened:current - проверяет, является ли новое окно текущим

action

string

для задания действия элементу. Может принимать только значения из определенного списка, приведенного ниже.

where

string

указывает имя окна, на которое необходимо перейти при выполнении действий goToWindow или closeCurrentAndGoToWindow.

what

string

указывает имя окна, которое необходимо закрыть при выполнении действия closeWindow.

ref

string

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

currentWindowRef

string

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

newWindowRef

string

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

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Действия (действие указывается в атрибуте action):

getCurrentWindow

получает текущее окно и сохраняет под именем указанным в атрибуте ref

getNewWindow

получает новое открытое в фоновом режиме окно и сохраняет под именем указанным в атрибуте ref

getPreviousWindow

получает предыдущее окно и сохраняет под именем указанным в атрибуте ref

goToNewWindow

переходит на новое открытое окно, можно использовать совместно с атрибутами newWindowRef и currentWindowRef

goToWindow

переходит на конкретное окно, имя которого указано в атрибуте where, также можно использовать совместно с атрибутом currentWindowRef

closeWindow

закрывает окно, имя которого передано в атрибуте what

closeCurrentAndGoToWindow

закрывает текущее окно и переходит в окно, имя которого передано в атрибуте where

Код

<window assert="newWindowOpened:background" />

<window action="goToNewWindow"/>

<window assert="newWindowOpened:current" />

<window action="getCurrentWindow" ref="currentWindow"/>                        

<window action="getNewWindow" ref="newWindow"/>                

<window action="getPreviousWindow" ref="previousWindow"/>

<window action="goToNewWindow" newWindowRef="newWindow" currentWindowRef="currentWindow"/>

<window action="goToWindow" where="newWindow" currentWindowRef="previousWindow"/>

<window action="closeWindow" what="previousWindow"/>

<window action="closeCurrentAndGoToWindow" where="previousWindow"/>                

Примеры использования assert

<test name="Assert for new window open in background and current" description="Test for check open new window in background and current" tags="window, M26">                

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />

   <webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />

   <webelement extends="linkForNewTab" action="click" />

   <window assert="newWindowOpened:background" />

   <window action="goToNewWindow"/>

   <window assert="newWindowOpened:current" />

</test>

Примеры использования getCurrentWindow

<test name="Get current window" description="Test for get current window and put in context" tags="window, M26">                

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

   <webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />

   <window action="getCurrentWindow" ref="currentWindow"/>                        

   <assert first="currentWindow" action="variableExists" />                

</test>

Примеры использования getNewWindow

<test name="Get new window" description="Test for get new window and put in context"

tags="window, M26">                

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

<webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />                

<webelement extends="linkForNewTab" action="click" />                

<window action="getNewWindow" ref="newWindow"/>                        

<assert first="newWindow" action="variableExists" />                

</test>

        

Примеры использования getPreviousWindow

<test name="Get previous window" description="Test for get previous window and put in context"

tags="window, M26">                

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

<webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />        

<webelement extends="linkForNewTab" action="click" />        

<window action="goToNewWindow"/>

<window action="getPreviousWindow" ref="previousWindow"/>                        

<assert first="previousWindow" action="variableExists" />                

</test>

Примеры использования goToNewWindow

<test name="Go to new window by default" description="Test for go new window by defaut if new window open" tags="window, M26">                

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

   <webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />

   <webelement extends="linkForNewTab" action="click" />                

   <window action="goToNewWindow"/>

</test>

<test name="Go to new window with variable" description="Test for go new window witn variable" tags="window, M26">

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

<webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />

<webelement extends="linkForNewTab" action="click" />                                

<window action="goToNewWindow" newWindowRef="newWindow" currentWindowRef="currentWindow"/>

<assert first="newWindow" action="variableExists" />

<assert first="currentWindow" action="variableExists" />                                                

</test>

Примеры использования goToWindow

<test name="Go to window with variable" description="Test for go window"

tags="window, M26">                

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

   <webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />

   <webelement extends="linkForNewTab" action="click" />

   <window action="getCurrentWindow" ref="previousExpected"/>

   <window action="getNewWindow" ref="newExpected"/>                                

   <window action="goToWindow" where="newExpected" currentWindowRef="previousActual"/>

   <window action="getCurrentWindow" ref="newActual"/>

   <assert first="previousExpected" action="variableExists" />        

   <assert first="previousActual" action="variableExists" />        

   <assert first="newExpected" action="variableExists" />        

   <assert first="newActual" action="variableExists" />                                                

</test>

        

Примеры использования closeWindow

 

<test name="Close window with variable" description="Test for close window"

tags="window, M26">                

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

   <webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />                

   <window action="getCurrentWindow" ref="previousWindow"/>

   <webelement extends="linkForNewTab" action="click" />                

   <window action="goToNewWindow"/>

   <window action="closeWindow" what="previousWindow"/>                                        

</test>

Примеры использования closeCurrentAndGoToWindow

<test name="Close current window with variable" description="Test for close window" tags="window, M26">

   <navigate to="http://localhost:${jetty.port}/test/tabs/window.htm" />                

   <webelement ref="linkForNewTab" id="inNewTabWithTransition" action="isExists" />

   <window action="getCurrentWindow" ref="previousWindow"/>

   <webelement extends="linkForNewTab" action="click" />                

   <window action="goToNewWindow"/>

   <window action="getCurrentWindow" ref="newWindow"/>

   <window action="closeCurrentAndGoToWindow" where="previousWindow"/>                

</test>

Пример совместного использования assert и action

<window assert="newWindowOpened:background" action="getNewWindow" ref="newWindow">

<window assert="newWindowOpened:background" action="goToWindow" where="newWindow"  currentWindowRef="previousWindow"/>

5.1.2.5 <dialog>

Описание

        Тег для работы с диалоговыми окнами: alert, confirm, prompt. Данный тег позволяет обрабатывать диалоговые окна, закрывать диалоговое окно, получить текст и ввести текст в диалоговое окно. Если открыть диалоговое окно и в тесте не вызывать данный тег, то вы получите исключение UnhandledModalDialog. Перед использованием этого тега, в элементе который вызывает диалоговое окно нужно добавить атрибут showAlert=”true”. Необходимо учесть, что между тегом, который вызывает диалоговое окно, и самим тегом dialog не должно быть других тегов.

Атрибуты

Обязательные:

action

string

для задания действия над диалогом. Может принимать только значения из определенного списка, приведенного ниже.

Необязательные:

returnValueName

string

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

condition

true

false

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

Действия (действие указывается в атрибуте action):

accept

нажимает в диалоговом окне кнопку OK.

dismiss

нажимает в диалоговом окне кнопку cancel (отмена).

getText

кладёт в переменную содержимое диалогового окна.

typeText

вставляет текст в диалоговое окно prompt.

Пример использования:

<button id=”dialog” action=”click” showAlert=”true”/> - нажимаем на элемент который вызывает диалог, атрибут showDialog указывает на то, что мы ожидаем вызов диалога. Это техническая особенность WebDriver.

<dialog action=”accept”/> - нажимаем на кнопку OK.

5.1.3 Задержки, ожидания

5.1.3.1 <defaultdelay>

Описание

Задает время таймаута для поиска по селектору каждого из элементов, которые идут после этого тега. Если в течение заданного таймаута фреймворк не найдет элемент на странице, то будет сгенерировано исключение.

Атрибуты

Обязательные:

time 

string

время ожидания появления элемента в миллисекундах

Необязательные:

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Код

<defaultdelay time="time in milliseconds"/>

Примеры использования

<test>
  <navigate to="http://www.google.com"/>

  <defaultdelay time="5000"/>
 
  <!-- Время таймаута для поиска каждого элемента field будет 5 секунд -->
  <field ref="searchField" cssSelector="[name='q']" textToType="xml2selenium"/>
  <field extends="searchField" textToType=" by JazzTeam"/>

  <defaultdelay time="7500"/>

  <!-- Время таймаута для поиска элемента button будет 7.5 секунд -->
  <button cssSelector="[name='btnK']"/>
</test>

5.1.3.2 <pause>

Описание

Создает паузу. Пауза является абсолютной, задается в миллисекундах и продолжается ровно то время, что указано. Пауза нужна для каких-либо специфических задержек, например, если после какого-либо действия нужно подождать 5 минут (так как именно в течении этого времени выполнится нужный функционал), и после этого таймаута проверить, сработало ли нужное действие.

Атрибуты

Обязательные:

time 

string

время паузы в миллисекундах

Необязательные:

condition 

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Код

<pause time="time in milliseconds"/>

Примеры использования

<test>
  <navigate to="http://www.google.com"/>

  <field ref="searchField" cssSelector="[name='q']" textToType="xml2selenium"/>
  <pause time="5000"/>
  <field extends="searchField" textToType=" by JazzTeam"/>

  <pause time="5000"/>

  <button cssSelector="[name='btnK']"/>
</test>

5.1.4 Теги для получения артефактов

5.1.4.1 <screenshot>

Описание

Тег позволяет создать скриншот страницы. Скриншоты сохраняются в папку c артефактами теста target/xml2selenium/...

Атрибуты

Необязательные:

filePrefix

string

содержит префикс, который будет добавлен к имени файла.

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Код

<screenshot filePrefix="myScreenshot" />

Примеры использования

<test name="Simple test" description="Simple test for testing base framework functions">
   <navigate to="http://localhost:${jetty.port}/test/login.html"/>
       
   <!-- test save screenshot without file prefix -->
   <screenshot />
   <field id="loginInput" textToType="someLogin"/>
   <field id="passwordInput" textToType="SomePassword"/>
   <button id="DoLoginBtn"/>
       
   <button id="search"></button>
   <webelement id="orderItem" action="isExists"/>
       
   <!-- test save screenshot without with file prefix -->
   <screenshot filePrefix="myScreenshot" />
</test>

5.1.4.2 <snapshot>

Описание

Тег позволяет сохранить html верстку страницы. Html-файлы сохраняются в папку c артефактами теста target/xml2selenium/...

Атрибуты

Необязательные:

filePrefix

string

содержит префикс, который будет добавлен к имени файла.

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Код

<snapshot filePrefix="myScreenshot" />

Примеры использования

<test name="Simple test" description="Simple test for testing base framework functions">
   <navigate to="http://localhost:${jetty.port}/test/login.html"/>
       
   <snapshot />
   <field id="loginInput" textToType="someLogin"/>
   <field id="passwordInput" textToType="SomePassword"/>
   <button id="DoLoginBtn"/>
       
   <button id="search"></button>
   <webelement id="orderItem" action="isExists"/>
       
   <snapshot filePrefix="myScreenshot" />
</test>

 5.1.4.3 <video>

Описание

        Тег предоставляет возможность записывать выполнение фрагментов теста на видео. Записи сохраняются как flv, имеют небольшой размер. Во время одного теста можно сделать запись нескольких фрагментов. Записанные видео сохраняются в папку c артефактами теста. Для тегов <before>, <after> и <test> видео записывается отдельно, то есть в начале каждого контейнера вам необходимо указать тег <video> с атрибутом action=”start”.

        

Атрибуты

Обязательные:

action

string

для задания действия элементу. Может принимать только значения из определенного списка, приведенного ниже

Необязательные:

fileprefix

string

Имя файла с видео будет иметь указанный в атрибуте префикс. Удобно чтобы разлечить видеозаписи от разных тестов.

condition

true

false

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

Действия (действие указывается в атрибуте action):

start

Запускает запись на видео с этого момента. Действие обязательно для записи видео.

stop

Останавливает запись на видео и сохраняет записанное в файл.

Код

<!-- запускаем запись на видео -->

<video action="start" />

<!-- код теста, он записывается -- >

<!-- останавливаем запись на видео -- >

<video action="stop" />

<!-- далее код теста не записывается -- >

Примеры использования

<test name="Test manual start and stop video creation" tags="video">        

    <video action="start"/>                

    <navigate to="http://localhost:${jetty.port}/test/login.html"/>        

                      

    <field id="loginInput" textToType="video_test"/>        

    <field id="passwordInput" textToType="video_test"/>        

    <button id="DoLoginBtn"/>        

                      

    <video action="stop"/>        

</test>

Запись нескольких фрагментов теста (отдельные видео файлы).

<test name="Test manual start and stop video creation" tags="video">        

    <video action="start"/>                

    <navigate to="http://localhost:${jetty.port}/test/login.html"/>        

                      

        <field id="loginInput" textToType="video_test"/>

        <field id="passwordInput" textToType="video_test"/>        

        <button id="DoLoginBtn"/>        

                      

        <video action="stop"/>

    <!-- Пишем второй фрагмент, помечаем имя файла префиксом чтобы не перепутать с

    первым фрагментом -- >

   

    <video action="start" fileprefix=”secondVideo”/>                

                      

        <field id="loginInput" textToType="video_test"/>        

        <field id="passwordInput" textToType="video_test"/>        

        <button id="DoLoginBtn"/>                

       

    <video action="stop"/>        

</test>

5.2 Тестирование веб-сервисов

5.2.1 Работа с Rest-сервисами

 5.2.1.1 <rest>

Описание

Тег предоставляет возможность тестирования REST-сервисов. Данный тег отправляет запрос и полученный ответ помещает в переменную, имя которой указывается в атрибуте returnValueName. При построении запроса обязательно нужно указывать url адрес, куда отправлять запрос, и HTTP-метод запроса. Дополнительно можно описывать заголовки, параметры и тело запроса. Из ответа можно взять любое значение, если обратится к нему с помощью xpath, jsonpath, regexp, в зависимости от типа полученного ответа.

Атрибуты

Обязательные:

url

string

адрес, куда отправляется запрос

method

string

описывает HTTP-метод запроса, может принимать след. значения: get, post, put, delete

returnValueName

string

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

Содержит дочерние теги, которые дополнительно описывают запрос.

<headers>

        Контейнер для заголовков запроса. Содержит список дочерних тегов <header>.

<header>

        Определяет имя и значение, которое будет передано в заголовке запроса.

Атрибуты

Обязательные:

name

string

имя передаваемого заголовка

value

string

значение передаваемого заголовка

Код

<headers>

        <header name="Content-Type" value="application/xml"/>

</headers>

<params>

 Контейнер для параметров запроса. Содержит список дочерних тегов <param>.

 <param>

        Определяет имя и значение, которое будет передано в параметре запроса.

Атрибуты

Обязательные:

name

string

имя передаваемого параметра

value

string

значение передаваемого параметра

Код

<params>

        <param name=”id” value=”1”/>

</params>

<body> 

Данные которые будут посланы в теле запроса. Cодержимое необходимо поместить в тег  <![CDATA[<!--body--> ]]>.

Код

<body>

    <![CDATA[

        <todo>

    <id>${id}</id>

            <description>${description}</description>

            <summary>${summary}</summary>

        </todo>

    ]]>

</body>

Примеры использования rest тега и его дочерних тегов:

<test name="Create todo [xml]" tags="rest">

    <variable ref="id" global="true" value="42"/>

    <variable ref="description" global="true" value="blah!!!"/>

    <variable ref="summary" global="true" value="This is summary"/>

    <rest url="http://localhost:${jetty.port}/test/rest/todos/" method="post"

    returnValueName="restResult">

        <headers>

            <header name="Content-Type" value="application/xml"/>

        </headers>

        <body>

            <![CDATA[

                    <todo>

                            <id>${id}</id>

                            <description>${description}</description>

                            <summary>${summary}</summary>

                    </todo>

             ]]>

        </body>

    </rest>

    <restassert response="restResult" action="checkCode" value="${codeSuccess}"/>

</test>

<test name="Edit todo [xml]" tags="rest">

<rest url="http://localhost:${jetty.port}/test/rest/todos/${id}" method="put" returnValueName="restResult">

    <headers>

        <header name="Content-Type" value="application/xml"/>

    </headers>

    <body>

        <![CDATA[

                    <todo>

                            <id>${id}</id>

                            <description>Updated ${description}</description>

                            <summary>Updated ${summary}</summary>

                    </todo>

                    ]]>

    </body>

</rest>

<restassert response="restResult" action="checkCode" value="204"/>

</test>

<test name="Get todo [json]" tags="rest">

<rest url="http://localhost:${jetty.port}/test/rest/todos/${id}" method="get" returnValueName="restResult">

    <headers>

        <header name="Accept" value="application/json"/>

    </headers>

</rest>

<assert first="${restResult.getValueByJSONPath('$.id')}" second="${id}" action="equals"/>

<assert first="${restResult.getValueByJSONPath('$.description')}" second="${description}" action="equals"/>

<assert first="${restResult.getValueByJSONPath('$.summary')}" second="${summary}" action="equals"/>

</test>

<test name="Edit todo [json]" tags="rest">

<rest url="http://localhost:${jetty.port}/test/rest/todos/${id}" method="put" returnValueName="restResult">

    <headers>

        <header name="Content-Type" value="application/json"/>

    </headers>

    <body>

        <![CDATA[

                    {

                     "id":${id},

                     "description":"Updated ${description}",

                     "summary":"Updated ${summary}"

                   }

        ]]>

    </body>

</rest>

<restassert response="restResult" action="checkCode" value="204"/>

</test>

<test name="Delete todo [json]" tags="rest">

<rest url="http://localhost:${jetty.port}/test/rest/todos/${id}" method="delete" returnValueName="restResult"/>

</test>

 5.2.1.2 <restassert>

Описание

        Тег предоставляет возможность делать различные проверки над ответом REST-сервиса: проверять код ответа, сообщение ответа, проверять содержимое и так далее.. Значения, передаваемые в атрибуты response, value, могут быть как строки, так и groovy выражения или ссылки на переменные в контексте.

Атрибуты

Обязательные:

response

string

имя переменной, содержащей ответ от Rest-сервиса

action

string

для задания действия элементу. Может принимать только значения из определенного списка, приведенного ниже

Необязательные:

value

string

ожидаемое значение, требуется для действий: checkType, checkCode, checkStatusMessage, checkCharset,  checkXPathContent, checkJSONPathContent, checkRegExpContent

expr

string

для указания выражения для действий checkXPathContent, checkJSONPathContent, checkRegExpContent

Действия (действие указывается в атрибуте action):

isNotEmpty

проверить ответ не пустой (действие по умолчанию)

checkType

проверить тип ответа, например text/json

checkCode

проверить код ответа от сервиса

checkStatusMessage

проверить сообщение о статусе

checkCharset

проверить в какой кодировке пришёл ответ от сервиса

checkXPathContent

взять какое-то значение по XPath и сравнить его с ожидаемым значением

checkJSONPathContent

взять какое-то значение по JSONPath и сравнить его с ожидаемым значением

checkRegExpContent

взять какое-то значение используя регулярное выражение и сравнить его с ожидаемым значением

Примеры использования

<restassert response="restResult" action="checkType" value="text/xml"/>

<restassert response="restResult" action="checkCharset" value="${charsetUtf8}"/>

<restassert response="restResult" action="checkCode" value="${codeSuccess}"/>

<restassert response="restResult" action="checkStatusMessage" value="${messageSuccess}"/>        

5.3 Базовые теги тестов

5.3.1 Контейнеры

5.3.1.1 Логическая организация тестов

5.3.1.1.1 <testcase>

Описание

Контейнер для <test>. Говорит о том, что из этого тега необходимо запустить один или несколько тестов, заключенных в тег <test>. На ряду с <imports> является корневым тегом, перед ним нужно указать версию xml. Внутри себя может содержать только теги <test>, <import>. С помощью <import> может использовать объекты из других файлов.

Важно: Общая длина пути к папке, в которую генерируется артефакты тесткейса, для Windows не должна превышать 220 символов.

Путь к этой папке выглядит следующим образом:

%Путь к фреймворку начиная с корня диска%\target\xml2selenium\test\%название xml-файла тесткейса и атрибута name этого тесткейса с разделителем #xml# между ними%

Атрибуты

Содержит такие же атрибуты, что и <imports>.

Необязательные:

name

string

Имя тесткейса, которое будет отображено в репорте. Не должно содержать символов  . / \ : * ? “ < > | # ( )

description

string

Описание тест-кейса для бизнес репорта 

tags

string

Фильтр для тест-кейса в бизнес репорте

webDriverOn

true

false

Атрибут позволяющий выключить использование WebDriver и тестировать фенкционла не относящийся к веб, к примеру базу данных, логические операции. При значении false в тесткейсе нельзя использовать теги относящиеся к веб-тестированию.

coverageDoc

string

текстовое поле, указывает какой документ соответствует данному тесткейсу.

smartWaitFor

String

Включает ожидание обязательного элемента перед выполнением действий над элементами тесткейса на тестируемой странице. Содержит следующие настройки:

  • timeout - максимальное время, за которое должен появиться элемент, в миллисекундах
  • step - шаг ожидания, в миллисекундах
  • id, xpath, cssSelector или tagName - селектор (идентификатор) обязательного элемента, который появляется после полной загрузки страницы

Код

<testcase xmlns="http://www.jazzteam.org/Routines"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd"
description="Basic test case" tags="base, simple">
</testcase>

Примеры использования

<?xml version="1.0" encoding="UTF-8"?>
<testcase xmlns="http://www.jazzteam.org/Routines"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd"
description="Basic test case" tags="base, simple">

<test name="Simple test" description="Simple test for testing base framework functions">
       <navigate to="http://localhost:${jetty.port}/test/login.html" />

       <!-- test save snapshot without file prefix -->
       <snapshot />
       <field id="loginInput" textToType="someLogin" />
       <field id="passwordInput" textToType="SomePassword" />
       <button id="DoLoginBtn" />

       <button id="search"></button>
       <webelement id="orderItem" action="isExists" />

       <!-- test save snapshot with file prefix -->
       <snapshot filePrefix="htmlSource" />
   </test>
</testcase>

 5.3.1.1.2 <before>/<after>

Описание

Тег позволяет вставлять описать в тест-кейсе фрагменты кода, которые должны выполниться до и после каждого теста. Фрагмент <after> выполняется даже если в тесте произошла ошибка и он не выполнился до конца. Тег создан для описания предусловий и постусловий выполнения тестов. Например для выполнения теста пользователь должен быть залогинен, а после теста должен разлогиниться.

Атрибуты

Необязательные:

scope

string

атрибут позволяет использовать в контейнере <test> преременные которые были объявлены в контейнере <before> или наоборот в случае <test> и <after>.

smartWaitFor

String

Включает ожидание обязательного элемента перед выполнением действий над вложенными элементами на тестируемой странице. Содержит следующие настройки:

  • timeout - максимальное время, за которое должен появиться элемент, в миллисекундах
  • step - шаг ожидания, в миллисекундах
  • id, xpath, cssSelector или tagName - селектор (идентификатор) обязательного элемента, который появляется после полной загрузки страницы

Код

<before>

        <!-- Выполняем этот код перед каждым тестом: заходим на страницу и логинимся -- >

<navigate to=”http://mysite.com” />

<frame extends=”login”/>

</before>

<test>

        <!-- тут выполняем тестовые шаги теста 1 -- >

</test>

<test>

        <!-- тут выполняем тестовые шаги теста 2 -- >

</test>

<after>

        <!-- После каждого теста разлогиниваемся -- >

        <frame extends=”logout” />

</after>

В описанном примере секция <before> выполнится перед каждым тестом, секция <after> выполнится после каждого теста.

5.3.1.1.3 <test>

Описание

Указывает границы теста для фреймворка, то есть определяет тест, который фреймворк будет запускать. Все теги <test> должны быть заключены в тег <testcase>. Тегов <test> может быть несколько в одном файле, для этого они должны располагать один за другим.

Важно: Общая длина пути к папке, в которую генерируется артефакты теста, для Windows не должна превышать 240 символов.

Путь к этой папке выглядит следующим образом:

%Путь к фреймворку начиная с корня диска%/arget/xml2selenium/test/%название xml-файла тесткейса и атрибута name этого тесткейса с разделителем #xml# между ними%/%имя теста%

Атрибуты

Необязательные:

name

string

имя теста, которое будет отображено в репорте. Не должно содержать символов / \ : * ? “ < > | # ( )

tags

string

это имя будет применено для фильтра в бизнес репорте

description

string

описание для теста. Применяется в бизнес репорте 

expected

fail

error

success

ignore

указывает ожидаемый результат работы теста

where

string

используется только совместно с атрибутом expected. Должен содержать ref элемента, в котором ожидается ошибка

expectedException

string

содержит полное java-имя ошибки, с которой мы ожидаем завершения теста

expectedMessage

string

содержит текст сообщения об ошибке, с которой тест упадет

coverage

number

процент покрытия теста, в этом атрибуте указывается числовое значение (от 0 до 100), которое отобразится графически (в виде прогрессбара у теста и тесткейса) в бизнес отчёте. По умолчанию содержит значение 0.

ignore

true

false

пропускает выполнение этого теста и выставляет ему результат IGNORE.

condition

true

false

этот атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий. Если значение атрибута выставлено в false, то результат теста - IGNORE

smartWaitFor

String

Включает ожидание обязательного элемента перед выполнением действий над элементами теста на тестируемой странице. Содержит следующие настройки:

  • timeout - максимальное время, за которое должен появиться элемент, в миллисекундах
  • step - шаг ожидания, в миллисекундах
  • id, xpath, cssSelector или tagName - селектор (идентификатор) обязательного элемента, который появляется после полной загрузки страницы

Значения, которые можно использовать в атрибуте expected

fail

говорит, что ожидаемый результат работы теста fail 

error

говорит, что ожидаемый результат работы теста error

success

говорит, что ожидаемый результат работы теста success 

ignore

говорит, что ожидаемый результат работы теста ignore

Варианты результатов теста

Тест может иметь 4 статуса выполнения:

  1. success (успех) – тест выполнен успешно
  2. error (ошибка) – в ходе теста произошла критическая ошибка
  3. fail (неудача) – в ходе теста произошла неудача
  4. ignore - пропущенный тест.

Подробнее остановимся на результате fail. Он происходит в следующих случаях:

Код

<test name="Extends webelement from frame [52]"  coverage=”50”
        expected="error" where="failElement"
        expectedException="java.lang.IllegalStateException"
        expectedMessage="webelement can not extend frame">

<test name="FillWithtClear" tags="field" description="Check field tag for correct work">

Примеры использования

<test name="Extends frame from webelement [53]"  coverage=”50”
                expected="error" where="failElement"
                expectedException="java.lang.IllegalStateException"
                expectedMessage="frame can not extend webelement">
        <navigate to="http://localhost:${jetty.port}/test/login.html"/>

        <webelement id="loginInput" ref="loginField" action="isExists"/>
                
        <frame ref="failElement" extends="loginField">
                <field id="loginInput" textToType="login-login"/>
        </frame>
</test>

5.3.1.2 Повторное использование, процедуры

5.3.1.2.1 <frame>

Описание

Контейнер для любых элементов и для других <frame>. Нужен для вынесения некоторой последовательности действий в один тег (аналог функций из программирования). Используется для уменьшения дублирования кода в тестах. Позволяет несколько раз вызывать одни и те же действия. Для этого необходимо просто ссылаться на <frame>, и будут выполняться все действия, которые в нем описаны. Фреймы могут расширять уже существующие фреймы, при этом все действия родителя переносятся в потомка. Потомок не может добавлять новых действий, в потомке можно переопределить действия родителя. Тогда вместо действия родителя выполнится действие потомка. Для этого нужно в потомке указать фрейм или элемент с таким же ref, какой указан в родителе.

Атрибуты

Необязательные:

ref

string

имя для фрейма, по которому к фрейму можно обращаться

extends

string

указывает, что нужно расширить фрейм. Здесь необходимо указать ref родительского фрейма

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий

smartWaitFor

String

Включает ожидание обязательного элемента перед выполнением действий над вложенными элементами на тестируемой странице. Содержит следующие настройки:

  • timeout - максимальное время, за которое должен появиться элемент, в миллисекундах
  • step - шаг ожидания, в миллисекундах
  • id, xpath, cssSelector или tagName - селектор (идентификатор) обязательного элемента, который появляется после полной загрузки страницы

Код

<frame ref="DirectorLogin">
   <field ref="login" id="loginField" textToType="director"></field>
   <field ref="password" id="pwdField" textToType="dirpwd"></field>
</frame>

<!-- Пример перопределения фрейма, здесь введется в поле логин тоже значение, что и в пердыдущем тесте, но в поле пароля - новое значение -->
<frame ref="DirectorLoginWithAnotherPassword" extends="DirectorLogin">
   <field ref="password" textToType="anotherPas"></field>
</frame>

Примеры использования

<?xml version="1.0" encoding="UTF-8"?>

<imports xmlns="http://www.jazzteam.org/Routines"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines 

http://xml2selenium.com/schema/xml2selenium.xsd">

   <frame ref="DirectorLogin">
       <field ref="login" id="loginField" textToType="director"></field>
       <field ref="password" id="pwdField" textToType="dirpwd"></field>
   </frame>

   <frame ref="DirectorLoginWithAnotherPassword" extends="DirectorLogin">
       <field ref="password" textToType="anotherPas"></field>
   </frame>

   <frame ref="LogInAsDirector">
       <navigate to="http://profile.tut.by/register.html"/>
       <frame extends="DirectorLoginWithAnotherPassword"/>
       <button id="buttonId"/>
   </frame>

</imports>

5.3.1.3 Работа с импортами

5.3.1.3.1 <imports>

Описание

Контейнер для тегов и фреймов. На ряду с <testcase> является корневым тегом, перед ним нужно указать версию xml. Внутри себя может содержать теги <import> и любой другой из тегов, не являющихся корневым, за исключением <test>. С помощью <import> может использовать теги из других файлов.

Атрибуты

Обязательные:

xmlns

объявляет неймспейс по умолчанию. Должен быть равен  http://www.jazzteam.org/Routines

xmlns:xsi

объявление XSL-неймспейса. Должен быть равен  http://www.w3.org/2001/XMLSchema-instance

Необязательные:

xsi:schemaLocation

путь от файла с тестом к xsd-файлу, где указана валидация ко всем тестам. Путь должен содержать “http://www.jazzteam.org/Routines  http://xml2selenium.com/schema/xml2selenium.xsd

Код

<imports xmlns="http://www.jazzteam.org/Routines" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd">
</imports>

Примеры использования

<?xml version="1.0" encoding="UTF-8"?>
<imports xmlns="
http://www.jazzteam.org/Routines"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.jazzteam.org/Routines    

http://xml2selenium.com/schema/xml2selenium.xsd">

   <import resource="frameworktests/imports/cyclicImports/Import2.xml" name="appElements" />
   <navigate ref="basicLogin" to="http://localhost:${jetty.port}/test/login.html" />    
   <field ref="loginName" id="loginInput" />
   <field ref="loginPwd" cssSelector="#passwordInput" />
   <button ref="loginButton" subId="LoginBtn" />
   <button ref="checkLoginButton" extends="loginButton" action="isExists"/>
   <webelement ref="logout" id="logoutLink" action="click"></webelement>
</imports>

</test>

5.3.1.3.2 <import>

Описание

Тег для включения в текущий файл других файлов. Элементы из другого файла могут быть получены, если у них определен атрибут ref. Для обращения к объекту из другого файла необходимо в нужном элементе указать в атрибуте extends указать name файла и через : указать значение ref нужного объекта. Тег размещается внутри тега <testcase>, на одном уровне c тегом <test>.

Атрибуты

Обязательные:

resource

string

путь к включаемому файлу с именем файла и расширением (абсолютный, относительно пакета resources, а также относительно текущего каталога)

name

string

имя для включаемого файла. Через это имя к файлу можно обращаться в текущем файле

Необязательные:

condition  

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Код

<import resource="frameworktests/imports/importOneFileManyTimes/Import1.xml" name="appElements1" />
<import resource="Import1.xml" name="appElements2" />

Примечание

Так-же можно указывать путь относительно последней совпавшей директории в пути к файлу содержащему данный импорт.

Пример:

“D:\xml2selenium\xml2selenium-reports\src\test\resources\frameworkTests\tags\path\testPath.xml“ -  путь к тесту содержащему импорт

“D:\xml2selenium\xml2selenium-reports\src\test\resources\frameworkTests\tags\iterate\import.xml“ “iterate\import.xml“  - путь относительный фолдера “tags“ - последний совпадающий фолдер этих двух путях.

Примеры использования

<testcase xmlns="http://www.jazzteam.org/Routines"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.jazzteam.org/Routines http://xml2selenium.com/schema/xml2selenium.xsd" description=”Test case with import" tags="import">

<import resource="frameworktests/imports/importOneFileManyTimes/Import1.xml" name="appElements" />
<test expected="error" name="Import single file many times [same namespace] [19]">
   <navigate extends="appElements:basicLogin"></navigate>
       
   <field extends="appElements:loginName" textToType="someLogin" />
   <field  extends="appElements:loginPwd" textToType="SomePassword" />
   <button extends="appElements:checkLoginButton"/>
   <button extends="appElements:loginButton" />

   <button id="search" />
   <webelement id="orderItem" action="isExists" />
</test>

</testcase>

5.3.2 Работа с данными теста

5.3.2.1 <property>

Описание

Элемент для получения значения из property-файла. Он получает или одно значение из property-файла или все значения из него. После указания файла property, через этот тег, его используют как <variable> используя в качестве ссылки на этот элемент его значение, указанное в атрибуте name. Для использования значения из property-файла необходимо указать name и через “.” задать ключ, значение по которому необходимо получить.

Атрибуты

Обязательные: 

resource

string

задает полный путь к property-файлу (относителньо пакета resources)

name

string

указывает имя для тега. Через это имя к тегу можно обращаться

Необязательные:

key

string

указывает на ключ из проперти для того, чтобы взять из него только одно значение

condition  

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Код

<property resource="filePath/property/property1.properties" name="propertyName" key="key1"/>
<field id="passwordInput" textToType="${propertyName.key1}" />

Примеры использования

<test>
   <property resource="frameworktests/tags/property/property-tag-test1.properties" name="prop1" />
   <property resource="frameworktests/tags/property/property-tag-test2.properties" name="prop2" />
        
   <navigate to="http://localhost:${jetty.port}/test/login.html"/>
                
   <field ref="login" id="loginInput" textToType="${prop1.login}" />
   <field ref="password" id="passwordInput" textToType="${prop1.password}" />

   <field ref="login" id="loginInput" textToType="${prop2.login}" />
   <field ref="password" id="passwordInput" textToType="${prop2.password}" />
   <field extends="login" action="isContainsText" text="logingFromProperties"/>
</test>

5.3.2.2 <variable>

Описание

Тег для задания переменной в тесте. Для использования значения необходимо внутри ссылки указать ref необходимой переменной. Ссылка на ref переменной заключается в ${ }. Для имени ссылки переменной разрешается использовать только буквы латинского алфавита, цифры, точку, и знак подчеркивания.

Тег <variable> имеет смысл переменной в языках программирования. Это означает, что значение переменной по ключу А можно переопределить другой переменной с таким ключом, но с другим значением. Это делает этот тег отличным от других элементов, где существование элемента с уникальным ref запрещает в том же контексте (скоупе) создавать другие элементы с таким же ref.

Атрибуты

Обязательные:

value

string

значение переменной

Необязательные:

ref

string

указывает ссылку для переменной. Через это имя к ней можно обращаться, а также для использования ее в наследовании. Для имени ссылки переменной разрешается использовать только буквы латинского и русского алфавита, цифры, точку, и знак подчеркивания.

extends

string

имя родительского элемента для наследования значения из другой переменной

change

string

в атрибуте указывается ref переменной, значение которой необходимо изменить. Изменение значения переменной возможно только если при её объявлении был указан атрибут changeable=true.

changeable

true

false

указывает, может ли переменная быть изменена далее в тесте

global

true

false

Записывает переменную в самый верхний scope тем самым делает переменную доступной во всем тесткейсе.  Если объявить переменную сразу внутри тега <testcase>, такая переменная по умолчанию станет глобальной и доступной во всем тесткейсе.

condition

true

false

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

Код

<variable ref="childVariable" value="any value for variable" extends="parent:parentVariable"/>
<field ref="loginField" subId="login" textToType="${childVariable}"/>

Примеры использования

<test name="Variable using">
       <variable ref="application.host" value="localhost" />
        <navigate ref="failElement" to="http://${application.host}:${jetty.port}/test/login.html" />
        <webelement subId="DoLogin" action="isExists" />
</test>

<test name="Change value of variable" tags="variable">

<!-- Объявляем изменяемую переменную со значением 111 →

<variable ref="var1" changeable="true" value="111"/>

<!-- Меняем её значение на 555 →

<variable change="var1" value="555"/>

<assert first="${var1}" second="555" action="equals"/>

</test>

5.3.3 Организация логики теста

 5.3.3.1 <assert>

Описание

        Тег предоставляет возможность делать различные проверки: сравнивать значения переменных контекста, проверять, что какой-то атрибут установлен. Значения, передаваемые в параметры first, second, могут быть как строки, так и groovy выражения или ссылки на переменные в контексте.

Код

<assert action=”**” first=”**” second=”**” result=”**”/>

Атрибуты

Обязательные:

first

string

значение первого атрибута

action

string

для задания действия элементу. Может принимать только значения из определенного списка, приведенного ниже

Необязательные: 

second

string

значение второго атрибута.

result

warning

error

failure

позволяет указать, что должно произойти:

failure - плохое поведение приложения

warning - сообщение просто попадает в лог файл, то есть не носит слишком серьёзного значения

error - плохое поведение фреймворка, к примеру, когда мы тестируем js и проверяем, что переменная не создалась, мы можем сделать error

condition

true

false

этот атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий

Действия (действие указывается в атрибуте action):

equals

проверить, что два переданных значения эквивалентны друг другу

notEquals

проверить, что два переданных значения не эквивалентны друг другу

moreThan

проверить, что первое переданное значение больше второго

isTrue

проверить, что переданное значение истинно

isEmpty

проверить, что переданное значение не заполнено

variableExists

проверить, что переменная существует, обрабатывается только первый параметр, который должен быть именем искомой переменной

size

проверить количество веб-элементов которое вернёт xpath, css или tagName селектор, первый параметр ref на веб-элемент, второй ожидаемое кол-во элементов.

isContainsText

проверяет, что содержимое первого атрибута first содержит текст, определенный во втором атрибуте second

isNotContainsText

проверяет, что содержимое первого атрибута first не содержит текст, определенный во втором атрибуте second

fileDownloaded

проверяет загрузился ли файл, и возвращает абсолютный путь к файлу в атрибуте first

Пример

<test name="variableExists test [success]" tags="assert">

        <variable ref="attributeValue" value="New Value For Attribute" />

        <assert first="attributeValue" action="variableExists" />

</test>

<test name="variableExists test [error]" tags="assert"

expectedException="java.lang.AssertionError">

        <variable ref="attributeValue" value="New Value For Attribute" />

        <assert first="attributeValue1" action="variableExists" />

</test>

<test name="moreThan processor test" tags="assert">

        <variable ref="x" value="10" />

        <variable ref="y" value="2" />

        <assert first="${x}" second="${y}" action="moreThan" />

</test>

<test name="equals processor test" tags="assert">

        <assert first="assert" second="assert" action="equals" />

</test>

<test name="not equals processor test" tags="assert"

        expectedException="java.lang.AssertionError">

        <assert first="assert" second="notassert" action="equals" />

</test>

<test name="empty processor test" tags="assert">

        <assert first="" action="isEmpty" />

</test>

<test name="empty processor test with variable [error]" tags="assert">

        <variable ref="empty" value="" />

        <assert first="${empty}" action="isEmpty" />

</test>

<test name="empty processor test [error]" tags="assert"

        expectedException="java.lang.AssertionError">

        <assert first="assert" action="isEmpty" />

</test>

        

<test name="isTrue processor test" tags="assert">

        <assert first="${(4>1).toString()}" action="isTrue" />

</test>

        

<test name="isTrue processor test [expression error]" tags="assert" expectedException="java.lang.AssertionError">

        <assert first="${(4&lt;1).toString()}" action="isTrue" />

</test>

        

<test name="isTrue processor test [error]" tags="assert" expectedException="java.lang.AssertionError">

        <assert first="false" action="isTrue" />

</test>

<test name="size processor test [1 element]" tags="assert, m23">

        <navigate to="http://localhost:${jetty.port}/test/iterate.html" />

        <webelement xpath="//body" ref="body" />

        <assert first="body" second="1" action="size" />

</test>

<test name="isContainsText processor test" tags="assert, M25">

<assert first="assert" second="ass" action="isContainsText" />

</test>

<test name="not isContainsText processor test" tags="assert, M25"

expectedException="java.lang.AssertionError">

<assert first="assert" second="notassert" action="isContainsText" />

 </test>

<test name="fileDownloaded processor test" tags="assert, M27">

        <navigate to="http://localhost:${jetty.port}/test/download.html" />

<!-- click button for download file, download will start automatically-->

        <webelement xpath="//downloadDuttron" action="click" />

        

<!-- check file was downloaded and return absolute path to file -->

        <assert action="fileDownloaded" first="pathToFile"/>

</test>

                

5.3.3.2 <iterate>

Описание

        Тег необходим для повторения определённых во фрейме операций над несколькими элементами.

Код

<iterate for=”**” var=”**” run=”**”/>

Атрибуты

Обязательные:

for

string

содержит в себе список элементов, по которым нужно итерировать. Он принимает 2 типа данных:

  1. строка с перечислением id элементов
  2. 2-ая форма - список готовых элементов, полученных через <webelement>, для этого нужно объявить тег webelement и в нём заполнить один из селекторов xpath, css или tagName, заполнить атрибут ref, затем в атрибуте for тега <iterate> указать ref  этого <webelement>

var

string

название переменной цикла, которой последовательно будут присваиваться все значения

run

string

ref фрейма, который должен выполняться. Притом этот фрейм у себя будет иметь параметр, соответствующий var названию.

Необязательные:

variableCondition

string

имя переменной, по значению которой цикл останавливается. Для выхода из цикла значение переменной должно быть true. Если переменная не была объявлена заранее, создаётся новая. Если переменная существовала, её значение не изменяется. В конце всех итераций значение переменной выставляется в false.

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Пример:

<webelement subId="d" ref="web_elements"/>

<iterate for="web_elements" var="x" run="exist_operations" />

<frame ref="exist_operations">

        <webelement id="${x}" action="isExists"/>

</frame>

итерация по элементам, выбранным с помощью subId

<webelement subId="text" ref="subid_inputs" />

<iterate for="subid_inputs" var="variable" run="type_operations_webelements" />

итерация по элементам, выбранным с помощью tagName

<webelement tagName="div" ref="tagName_divs" />

<iterate for="tagName_divs" var="z" run="exist_operations" />

итерация по элементам, выбранным с помощью cssSelector

<webelement cssSelector=".clazz" ref="cssSelector_divs" />

<iterate for="cssSelector_divs" var="z" run="exist_operations" />

итерация по элементам, выбранным с помощью xpath

<webelement xpath="//input" ref="input_elements" />

<iterate for="input_elements" var="xy" run="input_operations" />

<!-- выход из iterate по условию -->

<frame ref="breakFrameOnSecondIteration">

<echo message="${Integer.parseInt(count)+1}"/>

<variable change="count" value="${Integer.parseInt(count)+1}"/>

<variable change="condition" value="${Integer.parseInt(count)>1}"/>

</frame>

<iterate for="1,2,3,4,5" variableCondition="condition" var="i" run="breakFrameOnSecondIteration"/>

5.3.3.3 <condition> 

Описание

        Тег необходим для определения условий выполнения или невыполнения определённых во фрейме операций.

Код

<condition value=”**” run=”**”/>

Атрибуты:

Обязательные:

value

string

Определяет условие, по которому выполняется или не выполняется фрейм

run

string

ref фрейма, который должен выполняться. Притом этот фрейм у себя будет иметь параметр, соответствующий var названию.

Необязательные:

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Пример:

<test name="Use condition value string = true" tags="condition, M33">

<variable ref="var" changeable="true" value="1" />

<condition value="true" run="elements:changeVar" />

<assert first="${var}" second="2" action="equals" />

</test>

        

<test name="Use condition value groovy = true" tags="condition, M33">

<variable ref="var" changeable="true" value="1" />

<condition value="${var.equals('1')}" run="elements:changeVar" />

<assert first="${var}" second="2" action="equals" />

</test>

<test name="Use frame from test for conditon" tags="condition, M33">

<variable ref="var" changeable="true" value="1" />

<frame ref="changeVarFromTest">

        <variable change="var" value="2" />

        <echo message="change variable in condition" />

</frame>                

<assert first="${var}" second="2" action="equals" />

<variable change="var" value="1" />

<condition value="${var.equals('1')}" run="changeVarFromTest" />

<assert first="${var}" second="2" action="equals" />

</test>

5.3.3.4 <failure>

Описание

        Тег должен валить тест с конкретным результатом и сообщением.

Код

<failure result="error" message="My Error exception message"/>

Атрибуты

Необязательные

result

failure

error

атрибут может принимать два значения: failure/error. Атрибут определяет результат, с которым тест должен упасть

message

string

в этот атрибут передаётся сообщение ошибки для теста

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий.

Пример

<test name="Test of tag failure with error result" tags="failure" expectedException="org.jazzteam.xml2selenium.core.exceptions.FrameworkException">

<failure result="error"/>        

</test>

5.3.4 Маркеры

  5.3.4.1 <bdd>

Описание

Тег позволяет разбить тест на use cases, для последующего отображения в behavior репортах. Каждый тег <bdd> реагирует на фейлы в коде до следующего тега <bdd>. Если фейла не произошло, то этот тег прошёл успешно и подсвечивается зелёным. Если был фейл, то красным, если тест повалился до выполнения тега, то серым. Если <bdd> тег объявлен во фрейме, то он становится дочерним для тега <bdd>, который был перед фреймом. В параметр message можно передавать как текст, так и groovy-выражения

Атрибуты

Необязательные

message

string

в этот атрибут передаётся сообщение, которое будет отображатся Behavior report для конкретного use case

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий

Код

<bdd message=”Название кейса” />

Пример использования

<test name="Open page and fill user info" description="" tags="bdd">

<bdd message=”Login to system” />

           <navigate to="http://localhost:${jetty.port}/test/login.html" />

        <bdd message=”Fill user login and password” />

        <frame>

           <bdd message="Fill login field" />

           <field id="loginInput" textToType="someLogin" />

        <bdd message=”Fill password field” />

        <field id=”non-existentPasswordInput” textToType=”somePassword” /> // Допустим такого элемента не существует

        </frame>

...        

</test>

После выполнения теста должен сгенерироваться репорт в стиле BDD, в нём отображаются: имена тест-кейсов, тестов и <bdd>, объявленные в этом тесте, например:

TestCaseName

Open page and fill user info

Login to system

Fill user login and password

Fill login field

Fill password field

5.3.4.2 <echo>

Описание

Тег предназначен для записи информации в лог файл.

Атрибуты

message

string

в этот атрибут передаётся сообщение,которое пишется в лог файл теста.

Необязательные:

condition

true

false

атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий

Код

<echo message="**"/>

Примеры использования

<test name="Echo test without import" tags="echo">        

<echo message="Test Log"/>        

</test>

<test name="Echo test without import" tags="echo">        

        <variable ref="variable" value="some text"/>

        <echo message="${variable}"/>        

</test>

6. Виды отчётов

6.1 Index page (индекс страница)

Индекс страница – это html-файл index.html, который содержит список ссылок, ведущих на сгенерированные Behavior, Business и Technical отчеты. Служит для более удобной навигации и перехода между различными видами отчетов. Находится страница по адресу %project%/trunk/target/xml2selenium/index.html

Структура страницы:

1.  Ссылка на Технический отчет

2.  Список ссылок на Behavior репорты

3.  Список ссылок на Business репорты

6.2 Behavior report (поведенческий отчет)

Behavior-отчет – это html-файл, в котором размещена информация об операциях (тесткейсах, тестах, use cases разбитых bdd-тегами) и их статусе наглядно, без лишних подробностей в виде таблицы. В первую очередь данный отчет предназначен нетехническим специалистам и объясняет общую картину результатов тестов.

В отчете представлена следующая информация:

Рабочие возможности отчета:

Находится отчет по адресу
 %project%/trunk/target/xml2selenium/behavior-reports/%suite-name%_behavior-reports_%date-time%_%suite-id%.html

6.3 Business report (бизнес отчет)

Business-отчет – это html-файл, с наиболее подробной информацией о прохождении тесткейсов и тестов. Имеет ссылки на результаты работы фреймворка (скриншоты, снепшоты, логи).

В отчете представлена следующая информация:

Business document. Этот функционал позволяет указывать в тесткейсах имя документации покрытия тестов. Имя документа указывается обычной строкой разделенной специальным символом ‘#’. Этот символ делит строку на теги (разделы документа), например:

Имя документации вводится в атрибут coverageDoc в теге <testcase>.

Покрытие документа будет вычисляться из полей coverage указанных в тестах.

Алгоритм вычисления покрытия тестами документа вычисляется следующим способом:

  1. Дочерние элементы имеют среднее арифметическое значение покрытия тесткейсов со своим именем документации. (= сумма coverage всех тесткейсов с текущим дочерним business document / количество тесткесов с текущим дочерним business document)
  2. Родительские элементы имеют среднее арифметическое значение самих себя и дочерних документов. (= среднее арифметическое тесткейсов с текущим родительским business document + среднее арифметическое дочерних элементов / ( количество тесткесов с текущим родительским business document + 1 (дочернее среднее арифметическое)))

Таблица со списком тесткейсов, тестов со следующей информацией:

Для навигации по элементам тесткейса предусмотрено два решения:

Все элементы навигационных инструментов кликабельны и имеют особую подсветку.

При нажатии на имя теста происходит открытие WebView диалога и сразу же выбран нажатый нами раннее тест, если в нём произошло исключение, то так же активируется и его breadcrumb.

При нажатии на имя тесткейса происходит открытие WebView диалога и автоматически выбирается наш тесткейс.

Тесты и тесткейсы имеют специальный маркер (красный, синий и зелёный), характеризующий их состояние (error, fail, success).

Так же имеется возможность просмотра стектрейсов исключений выбранных элементов (тест, тесткейс).

        Информация о проценте покрытия тестов (coverage) и времени выполения тесткейсов (time)  для фолдеров. Процент покрытия считается по тестам, а время выполнения по тесткейсам. В Business report отображается следующая информация:

Рабочие возможности отчета:

Находится отчет по адресу
%project%/trunk/target/xml2selenium/%suite-name%_business-reports/business-reports_%date-time%_%suite-id%.html

6.4 Technical report (технический отчёт)

        Генерирует отчёты в папке “technical reports”, отчёт содержит информацию о jvm параметрах, подключенных плагинах (путь к конфигурационному файлу, содержимое конфига), логах фреймворка.

Находится отчет по адресу
%project%/trunk/target/xml2selenium/technical-reports/%suite-name%_technical_report_%date-time%_%suite-id%.html

6.5 Общая информация для отчетов

В каждой папке с отчетом содержиться файл с именем %suiteName%_business_report.htm. При обращении к этому файлу вас перенаправит на последний созданный репорт. Данный файл добавлен для следующих видов репортов: Business, Behaviour, Technical.

Пример адреса:

xml2selenium-testcases/target/xml2selenium/business-reports/FrameworkTest_business_report.htm


[1]