VIQA Virtual Intelligence Quality Assurance
Обо мне Роман Иовлев
VIQA V irtual Intelligence Q uality Assurance Tool Ссылка на Github
Тестирование UI Сайт Страницы Элементы Секции (логические объединения элементов) Бизнес сущности (смысл)
Инструменты DotNet C# Selenium 2.0
Selenium driver.FindElement( By .XPath( “somelocator1" )).SendKeys( "1000" ); driver.FindElement( By .XPath( “somelocator2" )).SendKeys( "20000" ); driver.FindElement( By .XPath( “somelocator3" )).Click(); driver.FindElement( By .XPath( “somelocator4" )).Click(); driver.FindElement( By .XPath( “somelocator5" ).Click(); driver.FindElement( By .XPath( “somelocator6" )).Click(); driver.FindElement( By .XPath( “somelocator7" )).Click(); driver.FindElement( By .XPath( “somelocator8" )).Click(); driver.FindElement( By .XPath( “somelocator9" )).Click(); driver.FindElement( By .XPath( “somelocator10" )).Click();
Хочется site.OpenHomePage(); TextFieldFrom.Input("1000"); TextFieldTo.Input("2000"); MyCheckbox.Check(); MyRadioButtons.Select("да");
PageObjects и HtmlElements Yandex QA Tool Описание старниц через PageObjects + Blocks HtmlElements. Работа с элементами, а не с локаторами
Кнопка <input type=“button” value=“Найти”>
Кнопки бывают разные <a href=“…”> <span> <img src=“…”> Найти <\span> </a>
Недостатки Yandex QA Tool Нет возможности работать с нестандартными контролами > Нет Интерфейсов элементов Довольно не очевидная инициализация Драйвера, работа со страницами Примеры с Github оказались не работоспособными :(
Bumblbee Можно настраивать элементы Нет примеров работы Странное построение тестов в виде цепочки Session.CurrentBlock< FrontView >() .Tabs.SettingsTab.Click() .UserNameField.EnterText( “sometext” )
UI тестирование - AI Artificial Intelligence
UI тестирование - VI Virtual Intelligence
Selenium > Надстройки > VIQA Selenium как язык низкого уровня Надстройки над селениум использующие шаблоны PageObject и PageElements VIQA – обучаемые PageElements
VI Объекты Умные. Дефолтная реализация Обучаемые
Элемент, Секция, Страница Объект Атрибуты/Свойства/Поля Действия
Интерфейсы для Объектов public interface ICheckbox : IClickable , ILabeled , ISetValue { void Check(); void Uncheck(); bool IsChecked(); }
Ready for Use
Lazy learn Объекты имеют дефолтное поведение Можно не описывать то, чем вы не будете пользоваться
VI Элемент Простые Button, CheckBox, Link, TextArea, TextField, Clickable, Text, ClickableText Сложные CheckList, RadioButtons, Dropdown, DataForm
Просто создать [ Name (Name = "Wi-fi" ), Locate (ByXPath = "//*[@class='wifi-checkbox']" )] public ICheckbox WiFiCheckbox1 = new Checkbox (); [ Name (Name = "Wi-fi" ), Locate (ByClassName = "wifi-checkbox" )] public Checkbox WiFiCheckbox2; public ICheckbox WiFiCheckbox3 = new Checkbox ("Wi-fi" , "#wifi-checkbox" ); public ICheckbox WiFiCheckbox4 = new Checkbox ( "Wi-fi" , By.CssSelector( "#wifi-checkbox" ));
Все действия можно переопределить new Checkbox ( "Wifi Checkbox" ) { ClickAction = () => new ClickableElement ( "#wifi-chckbox" ).Click(), GetLabelFunc = () => new TextElement ( "#wifi-chckbox-lable" ).Label, IsSelectedFunc = () => new VIElement ( "#wifi-chckbox" ) .GetWebElement().GetAttribute( "checked" ) == "1" , };
Dropdown сложный select new DropDown ("My Dropdown") { SelectAction = val => { new ClickableElement ( "#rootid" ).Click(); new ClickableElement ( By .XPath( "//*[rootid]/span[text()='" +val+ "']" )); } };
VI Элементы More А также: Стабильный поиск элемента Встроенная Проверка уникальности элемента Стабильное нажатие элементов Переопределение действий со всеми VIElements Логирование всех действий и результатов по умолчанию
Сложные элементы CheckList, RadioButtons, Dropdown, DataForm Вся логика внутри
DataForm: использование Быстрое Массовое заполнение элементов ISetValue из данных
Множество Элементов
Заполнение в Selenium driver.FindElement( By .XPath( “somelocator1" )).SendKeys( "1000" ); driver.FindElement( By .XPath( “somelocator2" )).SendKeys( "20000" ); driver.FindElement( By .XPath( “somelocator3" )).Click(); driver.FindElement( By .XPath( “somelocator4" )).Click(); driver.FindElement( By .XPath( “somelocator5" ).Click(); driver.FindElement( By .XPath( “somelocator6" )).Click(); driver.FindElement( By .XPath( “somelocator7" )).Click(); driver.FindElement( By .XPath( “somelocator8" )).Click(); driver.FindElement( By .XPath( “somelocator9" )).Click(); driver.FindElement( By .XPath( “somelocator10" )).Click();
Заполнение в Selenium driver.FindElement( Locators .FromTextField).SendKeys( "1000" ); driver.FindElement( Locators .ToTextField).SendKeys( "20000" ); driver.FindElement( Locators .WifiExpand).Click(); driver.FindElement( Locators .WifiCheckbox).Click(); driver.FindElement( Locators .SensorScrnExpand).Click(); driver.FindElement( Locators .SensorScrnRadio( “да” )).Click(); driver.FindElement( Locators .ProcessorExpand).Click(); driver.FindElement( Locators .ProcessorCheckbox( “AppleA4” )).Click(); driver.FindElement( Locators .ProcessorCheckbox( “AppleA5” )).Click(); driver.FindElement( Locators .ProcessorCheckbox (“AppleA7” )).Click();
Заполнение в VIQA ProductPage .FilterSection.TextFieldFrom.Input( "1000" ); ProductPage .FilterSection.TextFieldTo.Input( "2000" ); ProductPage .FilterSection.WiFiCheckbox.Check(); ProductPage .FilterSection.SensorScreenRadioButtons.Select( "да" ); ProductPage .FilterSection.ProcessorTypesChecklist.CheckGroup( new[]{ "Apple A4" , "Apple A5" , "Apple A7" });
Заполнение в VIQA { var _ = ProductPage .FilterSection; _.TextFieldFrom.Input( "1000" ); _.TextFieldTo.Input( "2000" ); _.WiFiCheckbox.Check(); _.SensorScreenRadioButtons.Select( "да" ); _.ProcessorTypesChecklist.CheckGroup( new []{ "Apple A4" , "Apple A5" , "Apple A7" }); }
Data form _ProductFilterForm.FillForm(filter);
Создание DataForm new DataForm < Filter >( "Фильтр продукта" , new Dictionary < ISetValue , Func < Filter , object >> { { TextFieldFrom, _ => _.CostRange.From }, { TextFieldTo, _ => _.CostRange.To }, { WiFiCheckbox, _ => _.Wifi }, { SensorScreenRadioButtons, _ => _.SensorScreen }, { ProcessorTypesChecklist, _ => _.ProcessorTypes }, });
Форма Работа с формой описывается отдельно Форма заполняется из бизнес сущности/ей Одна строчка в коде
Сайт Сайт Страница1 Страница2 Элемент1 Секция1 Секция2 Элемент1 Элемент2 Элемент3
PageObjects Объект для описания ваших страниц Содержит Элементы Действия Может быть разбит на блоки
VISite WebDriver Общие настройки (Логирование, Таймауты) Домен Инициализация Страниц
Еще плюшки Драйвер стартует при первом вызове Open Браузер открывается на весь экран KillAllRunWebDrivers
Логирование Дефолтный логер Свой логер IVILogger
Слои Создаем Сайт. Настраиваем его Создаем страницы/Секции VIElement-ов Описываем-обучаем элементы для каждой страницы Описываем Действия со страницами Составляем тесты
VIQA Profit Обучаемые Веб Элементы Использование Интерфейсов Простота использования Шаблоны PageObjects и PageElements (каскадная инициализация элементов)
VIQA Profit Встроенные логирование и алертинг Широкие возможность настройки Фреймворка (свой логгер, настройки webDriver, таймауты и прочее) Множество небольших но приятных мелочей
Контакты Роман Иовлев Email
Попробуйте сами Сайт проекта github Blog проекта
Вопросы Questions await