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 Запуск фреймворка с разными браузерами
2.3 Основные возможности фреймворка
4. Рекомендации и Best practices
4.1 Рекомендации по написанию простых тестов
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.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 Лучшие практики по работе с технологиями
5.1.1 Работа с dom-элементами веб-страницы
5.1.4 Теги для получения артефактов
5.3.1.1 Логическая организация тестов
5.3.1.2 Повторное использование, процедуры
5.3.3 Организация логики теста
6.1 Index page (индекс страница)
6.2 Behavior report (поведенческий отчет)
6.3 Business report (бизнес отчет)
6.4 Technical report (технический отчёт)
6.5 Общая информация для отчетов
<xml2selenium.version>
1.39.1
</xml2selenium.version>
При появлении каких-либо проблем необходимо сообщить об этом в техподдержку, подробно описав проблему и прикрепив все необходимые артефакты для воспроизведения ситуации, логи и exception traces.
Связаться с техподдержкой можно при помощи контактов:
Email: xml2selenium@jazzteam.org
Skype: xml2selenium
Фреймворк может работать в двух режимах:
Для работы фреймворка в разных режимах существуют специальные параметры. Если не передавать никаких параметров, то по умолчанию фреймворк запустится в локальном режиме.
Параметры для настройки режима запуска фреймворка:
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”
Сервис BrowserStack предоставляет удаленный SeleniumRC сервер с возможностью использования различных комбинаций браузеров и операционных систем.
Для использования BrowserStack необходимо при запуске тестов использовать след. обязательные JVM-параметры:
xml2selenium.webDriverRunMode | remote |
xml2selenium.serverUrl | http://%username%:%key%@hub.browserstack.com/wd/hub |
Также можно пользоваться и другими JVM-параметрами описанными в специальном разделе
Необходимо отметить некоторые функции, не работающие в удаленном режиме:
- Видео с браузера не записывается
- Не загружаются файлы с помощью тега upload в Opera
- Не скачиваются файлы с помощью браузеров Opera и Internet Explorer
Для работы фреймворка с разными браузерами были введены новые параметры. Если не передавать никаких параметров, то по умолчанию фреймворк запустится с браузером FireFox. Параметры для запуска браузеров:
xml2selenium.browserType | firefox chrome opera ie edge | Тип браузера, который вы хотите использовать |
При использовании разных браузеров необходимо учесть что:
Драйвера для IE - http://www.seleniumhq.org/download/
Драйвера для Сhrome - http://chromedriver.storage.googleapis.com/index.html
Драйвера для Edge - https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
xml2selenium.browserPath | Путь до исполняемого файла используемого браузера, параметр передается если исполняемый файл браузера был размещён в другой директории, не по умолчанию. Путь не должен содержать русских символов и должен быть заключен в двойные кавычки. |
Важно: При использовании перед каждым параметром нужно указывать ‘-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 | Включает ожидание обязательного элемента перед выполнением каких-либо действий на тестируемой странице. Содержит следующие настройки:
|
TREE parameters, проверяют последовательность исполнения фреймворка, используется разработчиками
xml2selenium.treeRecording | true false | Разрешить/запретить запись деревьев разбора фреймворка во время исполнения. |
xml2selenium.treeChecking | true false | Разрешить/запретить сверку записанных во время выполнения деревьев разбора фреймворка с эталонными. |
Параметры для интеграции с BrowserStack
xml2selenium.browserstack.tunnel | true false | Включает/выключает использование функции туннелинга. |
xml2selenium.browserstack.debug | true false | Включает/выключает ведение визуального лога теста. |
Для создания тестов вы можете загрузить шаблон проекта с 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 атрибута:
Данные атрибуты просто необходимо вставить в тег, они не изменяются в разных тестах.
Перед тегом <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”. Каждый файл - стартовая точка для запуска теста либо группы тестов. Тесты будут запускаться по порядку, в котором их найдёт фреймворк - сначала из одного файла, затем из следующего и так далее. При каждом запуске будут запускаться только те тесты, которые указаны в конкретном файле.
После создания файла с тестом необходимо добавить шаги.
Для совершения каких-либо действий в браузере пользуетесь следующими тегами:
Более подробно обо всех тегах фреймворка можно узнать из главы “Документация к тегам”.
После добавления в тест шагов, он выглядит следующим образом:
<?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 работает.
С помощью фреймворка можно совершать различные действия с элементами на 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>
Стоит обратить внимание на то, что имена у тестов не должны совпадать!
Все теги (за исключением <testcase>) в фреймворке помещаются в родительские контейнерные теги. Можно провести аналогию с языками программирования, где каждое выражение, оператор принадлежит какой-то блочной конструкции, например, циклу, условию, процедуре, определению класса. Также дело обстоит и с областью видимости (доступностью) объявленных тегов в разных местах. Это означает, что если вы объявили тег в одном теге <test>, то он не станет автоматически виден в другом теге <test> по аналогии и со фреймами - если во фрейме объявлен тег - то он виден только внутри этого фрейма. Если тег виден внутри какого-то другого контейнерного тега, то есть его можно использовать внутри его каким-то образом, то говорят, что он находится в скоупе (scope), или в контексте (context) этого контейнерного тега.
Когда далее по тексту мы будем использовать термин "фрейм" - имеется в виду контейнерный тег, плагин фреймворка <frame>, обеспечивающий возможность разбиения тестов на повторно-используемые части, в некоторых случаях их можно использовать даже между различными проектами. Фреймы также можно называть термином "инклюд" (include), ведь по сути, через механизм наследования тегов мы имеем возможность объявить фрейм с определёнными тегами, а потом в нашем тесте его использовать. Давайте договоримся, что термины "фрейм" и "инклюд" для нас будут равноправны.
Тег <variable> можно использовать для параметризации фреймов <frame>. Мы можем определить во фрейме переменные, возможно, с какими-то значениями, а возможно, и пустые, потом использовать эти переменные в атрибутах, выражениях других тегов данного фрейма (к примеру, для того, чтобы перейти к определённой странице, можно использовать переменную url). Далее при использовании такого фрейма мы можем переопределять значения данных переменных, что позволяет нам создавать повторно-используемые инклюды = фреймы. Стоит добавить возможность публиковать инклюды в репозиториях, очевидно, что для этого они должны быть параметризованы, то есть будут являться параметризованными инклюдами. Переменные <variable> можно называть параметрами инклюдов, или параметрами фреймов. Если в изначальном, родительском фрейме, переменная объявлена без значения, то такую переменную можно назвать плейсхолдер (placeholder, держатель места) - по сути она является параметром инклюда без значения по умолчанию.
Вообще, мы имеем возможность параметризовывать, и перегружать при наследовании фреймов переменные, теги, фреймы, включая пустые плейсхолдеры, которые могут быть переменными и фреймами.
На каждый тег может быть указана ссылка (аттрибут ref). По ней можно впоследствии обращаться к данному тегу. В первую очередь это нужно для наследования от тега. Пример добавления ref в тег:
<field ref="loginField" subId="login"/>
Ref должен быть уникальным для каждого тега.
Наследование - это включение всего содержимого из родительского тега в потомка. При наследовании можно добавлять в потомке новые атрибуты или заменять уже существующие на другие (действия можно включать во фреймы). Чтобы реализовать наследование нужно использовать атрибут extends у тега. В этом атрибуте следует указать значение атрибута ref родительского тега. То есть потомок будет содержать все то, что есть у родителя и то, что он добавляет. Чтобы наследоваться, в потомке нужно указать атрибут extends и в нем указать значение из ref родителя.
Пример:
<!-- Добавляем ref для тега, но не указываем текст, который можно ввести -->
<field ref="loginField" subId="login"/>
<!-- Наследуем тег от родителя с ref=”loginField”и добавляем новый атрибут -->
<field extends="loginField" textToType="LoginName" />
Переопределение тега - это замена всего содержимого из родительского тега содержимым потомка. Переопределение реализуется при помощи атрибута 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>
Чтобы избегать частого дублирования кода в тесте можно воспользоваться тегом <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, тестирование по другим запросам и так далее.
Импорт - это отдельный файл, который содержит внутри себя повторно используемые в разных тестах теги и фреймы. Из импорта не будут запускаться тесты. Для использования содержимого импорта в тестах, нужно подключить в них этот импорт. Импорты позволяют избегать дублирования кода. Для работы с импортами существуют два теги:
Файл с импортом должен содержать корневой тег <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>
Без использование фреймов и импортов нам бы пришлось делать копи-паст.
В тестах можно использовать переменные. Это бывает полезно, если есть какая-нибудь информация, которая повторяется несколько раз. Например 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>
Из браузера можно получить значения текста, находящееся внутри любого 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”.
Кроме <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 и тесты запустятся. При необходимости передаваемые параметры можно заменять.
Вторым способом задания параметров и значений для теста является получение их из 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.
В 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"/>
Во фреймворке существует ряд служебных переменных, которые можно использовать в тесте через groovy:
${xml2selenium.suiteId} | Уникальный id для каждого запуска тестов фреймворком. Этот id содержится в имени каталога с репортами. Задается автоматически в начале выполнения тестов на базе текущего времени в миллисекундах. Каждый Java suite файл, из которого запускаются тесты, имеет свой suiteId. |
${xml2selenium.testCaseName} | Возвращает полное имя тесткейса (включая пакеты) |
${xml2selenium.date} | Возвращает текущую дату в формате ДД.ММ.ГГГГ |
${xml2selenium.testName} | Возвращает имя теста. |
${xml2selenium.timeStamp} | Возвращает текущее время в миллисекундах (ms). |
Под динамической переменной понимается переменная в значении которой может использоваться одна или несколько служебных переменных. Динамическая переменная зависит от той служебной переменной, которую она использует.
К примеру для создания уникальной переменной можно воспользоваться служебной переменной ${xml2selenium.timeStamp}, которая равна текущему времени в миллисекундахх:
<variable ref=”name” value=”name-${xml2selenium.timeStamp}”/>
Также можно создать переменную, которая будет уникальна для каждого теста, и внутри теста будет неизменяемой. Для этого можно использовать выражение ${xml2selenium.testName}. Такая переменная будет неизменна на протяжении всего теста, а при вынесении этой переменной в импорт файл и использовании в другом тесте, переменная будет иметь другое значение, зависящее от имени теста, в котором используется. Таким образом для создания переменных можно использовать различные способы.
Именование тестов
Чтобы было удобно анализировать результаты работы тестов, для каждого теста и для всего тест-кейса, можно задавать атрибуты 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 репорте.
На текущий момент существует два способа скачивания файлов:
Содержимое данной переменной можно проверить в теге assert, или через Groovy-выражение.
Для того чтобы проверить загрузился ли файл можно воспользоваться тегом <assert> и action="fileDownloaded", а абсолютный путь к файлу поместиться в переменную указанную в атрибуте first. Тег assert и action="fileDownloaded" нужно следует устанавливать сразу после тега со скачиванием, и обязательно у тега для скачивания должен быть атрибут expectedDownload=”true”.
Разные браузеры по разному себя ведут при скачивании файлов.
Самый оптимальный браузер для скачивания - FireFox.
При тестировании web-приложений нередко возникает потребность в переключении между вкладками, окнами браузера и модальными окнами.
Работа с вкладками и обычными окнами браузера
Во время выполнения теста вкладки открываются как окна браузера. Для переключения между окнами служит специальный тег <window>. С его помощью можно перейти в открытое окно браузера, закрыть окно, проверить в каком режиме открыто окно.
Работа с модальным окном
Модальным называется окно, которое блокирует работу пользователя с родительским приложением до тех пор, пока пользователь не закроет это окно.
Открытие и закрытие модального окна может осуществляется нажатием на любой элемент на странице.
Для открытия модального окна у тега <webelement> предусмотрен специальный атрибут: showModalDialog - этот атрибут указывает, что, кликая по элементу, мы открываем модальное диалоговое окно и автоматически переходим к работе с элементами данного окна. По умолчанию атрибут равен false.
Для закрытия модального окна у тега <webelement> также предусмотрен специальный атрибут: closeModalDialog - этот атрибут указывает, что, кликая по элементу, мы закрываем модальное диалоговое окно и возвращаемся на предыдущее окно. По умолчанию атрибут равен false.
Данные атрибуты можно использовать только с action=’click’. При работе с модальными окнами окно браузера должно быть активным.
Примеры:
При работе с модальным окном запрещается использовать тег <window>.
Если тест не прошел, то чтобы сделать ошибку более понятной во фреймворке есть специальный механизм. Можно задать для тега специальное сообщение, которое будет отображаться в случае неудачи на этом теге. Для этого предусмотрен атрибут message. Он может присутствовать во всех элементах, и текст, указанный в нем, будет отображаться в сообщении ошибки.
Basic авторизация и аутентификация - это самый простой способ ограничения доступа к веб-приложениям и документам, предусмотренный стандартом протокола HTTP. При попытке обращения к таким ресурсам браузер формирует диалоговое окно, в котором предлагается ввести свой логин и пароль, после чего запрос выполняется повторно с предоставлением серверу данных для идентификации.
Пример окна с Basic Http аутентификацией в firefox:
Пример окна в chrome:
Для того чтобы избежать появления данного диалогового окна во время запуска тестов можно использовать специальный URL формата http://username:password@example.com/ для передачи учетных данных в теге <navigate>.
Иногда бывают случаи, когда недостаточно параметризовать инклюд переменными, но когда нужна необходимость переопределять логику внутри самого инклюда. Для этого во фреймворке есть возможность при наследовании фреймов переопределять элементы.
Вообще, при наследовании фреймов запрещается в дочернем фрейме определять элементы с ref, отличным от ref элементов родительского фрейма, а также иметь элементы без ref, так как иначе при наличии новых элементов непонятно, в каком порядке их выполнять.
Таким образом, при наследовании фреймов мы имеем возможность переопределить любые элементы родительского фрейма (то есть всей родительской иерархии), включая внутренние фреймы, которые могут быть у родительского фрейма. Это позволяет в дочернем фрейме вставлять фреймы с определённым набором элементов вместо фреймов с другим набором элементов, а также даёт возможность в родительском фрейме вводить пустые фреймы, которые имеют смысл placeholder-ов - они являются метками, на место которых можно помещать логику при наследовании. Это - ещё один способ параметризации инклюдов. Пустые фреймы в родительском инклюде, фрейме назовём плейсхолдерами (placeholder). Резюмируя, мы имеем возможность параметризовывать, и перегружать при наследовании фреймов переменные, элементы, фреймы, включая пустые плейсхолдеры, которые могут быть переменными и фреймами.
Иногда средствами фреймворка не удаётся выполнить какие-либо “тонкие” операции, что-то вычислить, сгенерировать случайное значение и так далее. Для этих нужд во фреймворке предусмотрены вставки на языке JavaScript. Вставки JavaScript-кода исполняются на открытой фреймворком в данный момент странице браузера. Передавать переменные можно как в JavaScript-код, так и из него далее в тест-кейс. Подробнее о вставках java script-кода и передаче переменных можно почитать в описании тега <script>.
Зачастую у тестов бывают предусловия и постусловия. Например перед выполнением теста нужно залогиниться, а после выполнения теста разлогиниться. Причём если тест упал, то разлогиниться нужно всё равно. Для этого во фреймворке предусмотрены теги <before> и <after>. Подробнее о их использовании можно почитать в документации тегов.
Фреймворк позволяет сохранять фрагменты тестов в библиотеках и подключать эти библиотеки в тестовом проекте. На данный момент существует одна библиотека от разработчиков фреймворка 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="<p>some text</p>" 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>
Старайтесь при работе с 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']
Описание
Базовый тег для описания действий с любым 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 | Включает ожидание обязательного элемента перед выполнением действий над вебэлементом на тестируемой странице. Содержит следующие настройки:
|
Важно: При работе с модальными окнами, окно браузера должно быть активным |
Действия (действие указывается в атрибуте 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"/>
Описание
Тег для осуществления нажатия на элемент со страницы. Наследуется от <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>
Описание
Тег для работы с чекбоксами на странице. Наследуется от <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>
Описание
Тег для выбора значения в 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>
Описание
Тег для описания действий с полем для ввода. Наследуется от <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>
Описание
Тег для работы с 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>
Описание
Открывает в браузере страницу по заданному 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>
Описание
Тег предоставляет возможность выбрать ресурс для загрузки при использовании на странице страндартного 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>
Описание
Тег для выполнения скрипта какого-либо языка программирования на текущей странице. 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}” />
Описание
Тег для работы с вкладками. Позволяет переключаться между вкладками, открывать и закрывать вкладки. Необходимо учесть, что при выполнении тестов новая вкладка откроется в новом окне браузера.
Атрибуты
Необязательные:
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"/>
Описание
Тег для работы с диалоговыми окнами: 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.
Описание
Задает время таймаута для поиска по селектору каждого из элементов, которые идут после этого тега. Если в течение заданного таймаута фреймворк не найдет элемент на странице, то будет сгенерировано исключение.
Атрибуты
Обязательные:
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 минут (так как именно в течении этого времени выполнится нужный функционал), и после этого таймаута проверить, сработало ли нужное действие.
Атрибуты
Обязательные:
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>
Описание
Тег позволяет создать скриншот страницы. Скриншоты сохраняются в папку 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>
Описание
Тег позволяет сохранить 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>
Описание
Тег предоставляет возможность записывать выполнение фрагментов теста на видео. Записи сохраняются как 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>
Описание
Тег предоставляет возможность тестирования 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>
Описание
Тег предоставляет возможность делать различные проверки над ответом 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}"/>
Описание
Контейнер для <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 | Включает ожидание обязательного элемента перед выполнением действий над элементами тесткейса на тестируемой странице. Содержит следующие настройки:
|
Код
<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>
Описание
Тег позволяет вставлять описать в тест-кейсе фрагменты кода, которые должны выполниться до и после каждого теста. Фрагмент <after> выполняется даже если в тесте произошла ошибка и он не выполнился до конца. Тег создан для описания предусловий и постусловий выполнения тестов. Например для выполнения теста пользователь должен быть залогинен, а после теста должен разлогиниться.
Атрибуты
Необязательные:
scope | string | атрибут позволяет использовать в контейнере <test> преременные которые были объявлены в контейнере <before> или наоборот в случае <test> и <after>. |
smartWaitFor | String | Включает ожидание обязательного элемента перед выполнением действий над вложенными элементами на тестируемой странице. Содержит следующие настройки:
|
Код
<before>
<!-- Выполняем этот код перед каждым тестом: заходим на страницу и логинимся -- >
<navigate to=”http://mysite.com” />
<frame extends=”login”/>
</before>
<test>
<!-- тут выполняем тестовые шаги теста 1 -- >
</test>
<test>
<!-- тут выполняем тестовые шаги теста 2 -- >
</test>
<after>
<!-- После каждого теста разлогиниваемся -- >
<frame extends=”logout” />
</after>
В описанном примере секция <before> выполнится перед каждым тестом, секция <after> выполнится после каждого теста.
Описание
Указывает границы теста для фреймворка, то есть определяет тест, который фреймворк будет запускать. Все теги <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 | Включает ожидание обязательного элемента перед выполнением действий над элементами теста на тестируемой странице. Содержит следующие настройки:
|
Значения, которые можно использовать в атрибуте expected
fail | говорит, что ожидаемый результат работы теста fail |
error | говорит, что ожидаемый результат работы теста error |
success | говорит, что ожидаемый результат работы теста success |
ignore | говорит, что ожидаемый результат работы теста ignore |
Варианты результатов теста
Тест может иметь 4 статуса выполнения:
Подробнее остановимся на результате 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>
Описание
Контейнер для любых элементов и для других <frame>. Нужен для вынесения некоторой последовательности действий в один тег (аналог функций из программирования). Используется для уменьшения дублирования кода в тестах. Позволяет несколько раз вызывать одни и те же действия. Для этого необходимо просто ссылаться на <frame>, и будут выполняться все действия, которые в нем описаны. Фреймы могут расширять уже существующие фреймы, при этом все действия родителя переносятся в потомка. Потомок не может добавлять новых действий, в потомке можно переопределить действия родителя. Тогда вместо действия родителя выполнится действие потомка. Для этого нужно в потомке указать фрейм или элемент с таким же ref, какой указан в родителе.
Атрибуты
Необязательные:
ref | string | имя для фрейма, по которому к фрейму можно обращаться |
extends | string | указывает, что нужно расширить фрейм. Здесь необходимо указать ref родительского фрейма |
condition | true false | атрибут позволяет выполнять или не выполнять тег в зависимости от определенных условий |
smartWaitFor | String | Включает ожидание обязательного элемента перед выполнением действий над вложенными элементами на тестируемой странице. Содержит следующие настройки:
|
Код
<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>
Описание
Контейнер для тегов и фреймов. На ряду с <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>
Описание
Тег для включения в текущий файл других файлов. Элементы из другого файла могут быть получены, если у них определен атрибут 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>
Описание
Элемент для получения значения из 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>
Описание
Тег для задания переменной в тесте. Для использования значения необходимо внутри ссылки указать 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>
Описание
Тег предоставляет возможность делать различные проверки: сравнивать значения переменных контекста, проверять, что какой-то атрибут установлен. Значения, передаваемые в параметры 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<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>
Описание
Тег необходим для повторения определённых во фрейме операций над несколькими элементами.
Код
<iterate for=”**” var=”**” run=”**”/>
Атрибуты
Обязательные:
for | string | содержит в себе список элементов, по которым нужно итерировать. Он принимает 2 типа данных:
|
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"/>
Описание
Тег необходим для определения условий выполнения или невыполнения определённых во фрейме операций.
Код
<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>
Описание
Тег должен валить тест с конкретным результатом и сообщением.
Код
<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>
Описание
Тег позволяет разбить тест на 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
Описание
Тег предназначен для записи информации в лог файл.
Атрибуты
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>
Индекс страница – это html-файл index.html, который содержит список ссылок, ведущих на сгенерированные Behavior, Business и Technical отчеты. Служит для более удобной навигации и перехода между различными видами отчетов. Находится страница по адресу %project%/trunk/target/xml2selenium/index.html
Структура страницы:
1. Ссылка на Технический отчет
2. Список ссылок на Behavior репорты
3. Список ссылок на Business репорты
Behavior-отчет – это html-файл, в котором размещена информация об операциях (тесткейсах, тестах, use cases разбитых bdd-тегами) и их статусе наглядно, без лишних подробностей в виде таблицы. В первую очередь данный отчет предназначен нетехническим специалистам и объясняет общую картину результатов тестов.
В отчете представлена следующая информация:
Рабочие возможности отчета:
Находится отчет по адресу
%project%/trunk/target/xml2selenium/behavior-reports/%suite-name%_behavior-reports_%date-time%_%suite-id%.html
Business-отчет – это html-файл, с наиболее подробной информацией о прохождении тесткейсов и тестов. Имеет ссылки на результаты работы фреймворка (скриншоты, снепшоты, логи).
В отчете представлена следующая информация:
Business document. Этот функционал позволяет указывать в тесткейсах имя документации покрытия тестов. Имя документа указывается обычной строкой разделенной специальным символом ‘#’. Этот символ делит строку на теги (разделы документа), например:
Имя документации вводится в атрибут coverageDoc в теге <testcase>.
Покрытие документа будет вычисляться из полей coverage указанных в тестах.
Алгоритм вычисления покрытия тестами документа вычисляется следующим способом:
Таблица со списком тесткейсов, тестов со следующей информацией:
Для навигации по элементам тесткейса предусмотрено два решения:
Все элементы навигационных инструментов кликабельны и имеют особую подсветку.
При нажатии на имя теста происходит открытие 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
Генерирует отчёты в папке “technical reports”, отчёт содержит информацию о jvm параметрах, подключенных плагинах (путь к конфигурационному файлу, содержимое конфига), логах фреймворка.
Находится отчет по адресу
%project%/trunk/target/xml2selenium/technical-reports/%suite-name%_technical_report_%date-time%_%suite-id%.html
В каждой папке с отчетом содержиться файл с именем %suiteName%_business_report.htm. При обращении к этому файлу вас перенаправит на последний созданный репорт. Данный файл добавлен для следующих видов репортов: Business, Behaviour, Technical.
Пример адреса:
xml2selenium-testcases/target/xml2selenium/business-reports/FrameworkTest_business_report.htm