ݺߣ

ݺߣShare a Scribd company logo
JDI: Автоматизировать
проще, чем кажется
SQA Days
JDI: Автоматизировать
проще, чем кажется
May 2016
1
Senior QA Automation
Гребенщикова Наталья
2
Вопросы
https://jdi.epam.com
https://vk.com/jdi_framework
https://github.com/epam/JDI
JDI
3
https://vk.com/jdi_framework
4
Проблема 1: Составные элементы
@FindBy(css=".colors-dropdown .caret")
WebElement arrow;
@FindBy (css=".colors-dropdown . dd-menu")
List<WebElement> list;
@FindBy (css=".colors-dropdown [type='text']")
WebElement value;
public void selectColor (String color){
arrow.click();
for (WebElement el : list)
if (el.getText.equals(color)) {
el.click();
break;
}
arrow.click();
}
public String getSelectedColor(){
return value.getAttribute(“value”);
}
5
Составные элементы - Selenium
@FindBy(css=".color-dropdown .caret")
WebElement arrow;
@FindBy (css=".color-dropdown. dd-menu")
List<WebElement> list;
@FindBy (css=".color-dropdown [type='text']")
WebElement value;
@FindBy(css=".color-dropdown .caret")
WebElement arrow;
@FindBy (css=".color-dropdown. dd-menu")
List<WebElement> list;
@FindBy (css=".color-dropdown [type='text']")
WebElement value;
@FindBy(css=".color-dropdown .caret")
WebElement arrow;
@FindBy (css=".color-dropdown. dd-menu")
List<WebElement> list;
@FindBy (css=".color-dropdown [type='text']")
WebElement value;
public void selectColor (String color){
arrow.click();
for (WebElement el : list)
if (el.getText.equals(color)) {
el.click();
break;
}
arrow.click();
}
public String getSelectedColor(){
return value.getAttribute(“value”);
}
public void selectColor (String color){
arrow.click();
for (WebElement el : list)
if (el.getText.equals(color)) {
el.click();
break;
}
arrow.click();
}
public String getSelectedColor(){
return value.getAttribute(“value”);
}
public void selectColor (String color){
arrow.click();
for (WebElement el : list)
if (el.getText.equals(color)) {
el.click();
break;
}
arrow.click();
}
public String getSelectedColor(){
return value.getAttribute(“value”);
} 6
Составные элементы - JDI
class MyPage extends WebPage {
@FindBy(class = "colors-dropdown")
public IDropDown<Colors> colors = new Dropdown<>(
By.className("сarret"),
By.cssSelector("li span"),
By.cssSelector("[type=‘text’]"));
@FindBy(class = " sizes-dropdown")
public MyDropdown<Sizes> sizes;
}
7
Составные элементы - JDI
myPage.colors.select("Blue");
myPage.colors.setValue(Colors.BLUE);
*А еще можно работать с Enum
String value = myPage.colors.getValue();
8
Проблема 2: Таблицы
<div class="table">
<ul class="rows">
<li class=“row">
<div>cell1</div>
<div>cell2</div>
</li>
<li class="row">
<div>cell3</div>
<div>cell4</div>
</li>
</ul>
</div>
9
Таблицы - Selenium
@FindBy(css=".root .table")
WebElement table;
@FindBy (css=".root .li .row")
List<WebElement> row;
@FindBy (css=".root .li .column")
List<WebElement> column;
public int getColumnsCount(){//TODO};
public int getRowdCount(){//TODO};
public String getRowValue (int index){//TODO};
public String getCellvalue (int index){//TODO};
public int searchRowContain(){//TODO};
public int searchRowMatch(){//TODO};
public String myGetRowValue (int index){//TODO};
public String myGetCellvalue (int index){//TODO};
public int myGetColumnCount(){//TODO};
public int myGetRowCount(){//TODO};
public String myGetRowValue (int index){//TODO};
public String myGetCellvalue (int index){//TODO};
public int myGetColumnCount(){//TODO};
public int myGetRowCount(){//TODO};
…
public String myGetCellvalue (int index){//TODO};
public void cellClick (int x, int y) {
driver.findElement(By.xpath(format("/tr[%s]/td[%s]"),x, y)).click();
}
10
Таблицы - JDI
<div class="table">
<ul class="rows">
<li class=“row">
<div>cell1</div>
<div>cell2</div>
</li>
<li class="row">
<div>cell3</div>
<div>cell4</div>
</li>
</ul>
</div>
class MyPage extends WebPage {
@FindBy(css = ".root")
ITable table = new Table(
By.xpath(".//li[%s]"),
By.xpath(".//li//div[%s]"));
}
@FindBy(css = “table”)
ITable table;
11
Таблицы - JDI
myPage.table.getText();
myPage.table.row(1);
myPage.table.cell(1, 2).getText();
myPage.table.cellsMatch
(".*JDI.*", column("Name"));
12
Проблема 3: сложные ячейки
myPage.table.cell(1, 2).get(MyCell.class)
.seeMore.click(); 13
Итоги
• Существенное уменьшение количество кода
• Экономия времени тест инженера
• Тесты пишутся быстро
• Меньше вероятность ошибки
• Проще поддержка тестов
Типизированные элементы
14
Проблема 4 - Формы
15
Формы - Selenium
public class MyPage{
@FindBy(css = ".root [jdi-name=Name]")
public WebElement name;
@FindBy(css = ".root [jdi-name=LastName]")
public WebElement lastName;
………
@FindBy(css = ".root [jdi-name=description]")
public WebElement description;
………
@FindBy(css = ".root [jdi-name=submit]")
public WebElement submit;
}
16
Формы - Selenium
void submitContactForm (Contact contacts) {
name.sendKeys(contacts.name);
lastName.sendKeys(contacts.lastName);
………
description.sendKeys(contacts.description);
………
submit.click();
}
17
myPage.submitContactForm(
new Contact(“John”, “Dow”, “desk”));
Формы - Selenium
18
Формы - Selenium
-А таких методов будет много: fill,
check, verify…
-И форм таких тоже может быть много…
19
Формы - JDI
class ContactForm extends Form<Contact> {
@FindBy(css = "[jdi-name=Name]")
public ITextField name;
@FindBy(css = "[jdi-name=LastName]")
public ITextField lastName;
@FindBy(css = "[jdi-name=description]")
public ITextArea description;
@FindBy(css = "[jdi-name=submit]")
public IButton submit;
};
class Contact{
String name;
String lastName;
String description;
};
20
Формы - JDI
@FindBy(css = "main form")
public ContactForm contactForm;
21
myPage.contactForm.fill(Contact.DEFAULT_CONTACT);
myPage.contactForm.submit(new Contact());
myPage.contactForm.check
(new Contact(“John”, “Dow”, “desk”));
myPage.contactForm.verify(Contact.DEFAULT_CONTACT);
class Contact{
String name;
String lastName;
String description;
};
EDT - Entities Driven Testing
22
Проблема 5: Списки составных элементов
23
Списки составных элементов - JDI
class MyPage{
@FindBy (css = ".petSection")
List<CatSection> catSections;
@FindBy (css = ".searchResults")
Elements<SearchBlock> searchResults;
}
myPage.catSections.get(2).price.getText();
myPage.searchResults.get(“шоколадный
красавчик”).price.getText();
24
Но и это еще не все!
25
Проблема 6: IFrame
<iframe id=‘frame’>
<div class=‘button submitButton’>
<span>Submit</span>
</div>
</iframe>
myPage.submit.click();
26
IFrame - Selenuim
driver.switchTo.frame(myFrame);
myPage.submit.click();
driver.switchTo.defaultContent();
27
IFrame - JDI
myPage.frame.submit.click();
class MyFrame extends Sections {
@FindBy(css=".submitButton")
public IButton submit;
}
@Frame(css="#frame")
public MyFrame frame;
28
Проблема 7: Стабильность
Где моя
кнопка??
29
Стабильность - Selenium
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions
.presenceOfElementLocated(By.id("myDynamicElement")));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
30
Стабильность - JDI
В JDI не нужно про это думать
31
Проблема 8: Не только Web
Mobile
или
Desktop
32
Не только Web – Интерфейсы - JDI
Интерфейсы – взгляд на элементы с точки зрения
пользователя
myButton.click();
myButton.getText();
public interface IButton {
void click();
String getText();
}
33
Не только Web
@Test
public void addContactTest() {
ContactDetails contacts =
new ContactDetails(
"Irina",
"222-22-22");
startPage.addContact.click();
addContactForm.save(contacts);
}
34
public void login(){
homePage.contactLogo.click();
homePage.userName.input("epam");
homePage.password.input("1234");
homePage.submit.click();
}
Не только Web – Desktop - Sikuli
public class HomePage extends Page {
@JLocation(filePath = "HomePage/password.png")
public TextField password;
@JLocation(filePath = "HomePage/submit.png")
public Button submit;
@JLocation(filePath = "HomePage/contactLogo.png")
public Button contactLogo;
@JLocation(filePath = "HomePage/userName.png")
public TextField userName;
}
35
UI Objects
+ Типизированные элементы
+ Типизированные Объекты (Секции)
+ Элементы-интерфейсы
UI Objects = PageObject
36
Выводы
• Меньше кода
• Экономия времени
• Увеличение производительности
• Меньше вероятность ошибки
• Проще поддержка тестов
• Легко адаптировать под свой проект
• Мультиплатформенность
• Логирование
37
Вопросы
https://jdi.epam.com
https://github.com/epam/JDI
https://vk.com/jdi_framework
Stepanovanv_87
Natalia_Grebenshchikova@epam.com
38

More Related Content

What's hot (20)

Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
sqadays8
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
Technopark
HasValue and AsyncFilter
HasValue and AsyncFilterHasValue and AsyncFilter
HasValue and AsyncFilter
qasta
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest
Tequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONTequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSON
Ivan Nemytchenko
Laravel 4 fwdays
Laravel 4 fwdaysLaravel 4 fwdays
Laravel 4 fwdays
Evgeniy Kosinskiy
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
Technopark
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
Paul Klimov
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
Paul Klimov
Приложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefestПриложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefest
Actis Wunderman
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
Zestranec
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7
Technopark
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
Paul Klimov
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
Igor Shkulipa
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
Igor Shkulipa
использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.
Asya Dudnik
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
За пределами PageObject
За пределами PageObjectЗа пределами PageObject
За пределами PageObject
automated-testing.info
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
sqadays8
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
Technopark
HasValue and AsyncFilter
HasValue and AsyncFilterHasValue and AsyncFilter
HasValue and AsyncFilter
qasta
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest
Tequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONTequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSON
Ivan Nemytchenko
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
Technopark
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
Paul Klimov
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
Paul Klimov
Приложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefestПриложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefest
Actis Wunderman
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
Zestranec
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7
Technopark
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
Paul Klimov
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
Igor Shkulipa
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
Igor Shkulipa
использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.
Asya Dudnik
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov

Similar to JDI: Автоматизировать проще, чем кажется (20)

Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
SQALab
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
Igor Shkulipa
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
dima_kuzovlev
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
Talks&Works
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
Alexander Makarov
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Yandex
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
Appium для народа
Appium для народаAppium для народа
Appium для народа
SQALab
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
Andrey Rebrov
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
Dmytro Zharii
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
GeeksLab Odessa
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
Viktor Likin
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
MoscowJS
Плюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизниПлюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизни
z-tech
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Ontico
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
SQALab
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
Igor Shkulipa
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
dima_kuzovlev
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
Talks&Works
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Yandex
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
Appium для народа
Appium для народаAppium для народа
Appium для народа
SQALab
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
Andrey Rebrov
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
Dmytro Zharii
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
GeeksLab Odessa
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
Viktor Likin
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
MoscowJS
Плюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизниПлюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизни
z-tech
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Ontico

More from SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
SQALab
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
SQALab
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
SQALab
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
SQALab
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
SQALab
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
SQALab
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
SQALab
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
SQALab
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
SQALab
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
SQALab
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
SQALab
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
SQALab
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
SQALab
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
SQALab
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
SQALab
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
SQALab
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
SQALab
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
SQALab
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
SQALab
Истинная сила тестировщика - информация
Истинная сила тестировщика - информацияИстинная сила тестировщика - информация
Истинная сила тестировщика - информация
SQALab
Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
SQALab
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
SQALab
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
SQALab
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
SQALab
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
SQALab
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
SQALab
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
SQALab
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
SQALab
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
SQALab
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
SQALab
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
SQALab
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
SQALab
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
SQALab
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
SQALab
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
SQALab
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
SQALab
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
SQALab
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
SQALab
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
SQALab
Истинная сила тестировщика - информация
Истинная сила тестировщика - информацияИстинная сила тестировщика - информация
Истинная сила тестировщика - информация
SQALab

JDI: Автоматизировать проще, чем кажется

  • 1. JDI: Автоматизировать проще, чем кажется SQA Days JDI: Автоматизировать проще, чем кажется May 2016 1
  • 5. Проблема 1: Составные элементы @FindBy(css=".colors-dropdown .caret") WebElement arrow; @FindBy (css=".colors-dropdown . dd-menu") List<WebElement> list; @FindBy (css=".colors-dropdown [type='text']") WebElement value; public void selectColor (String color){ arrow.click(); for (WebElement el : list) if (el.getText.equals(color)) { el.click(); break; } arrow.click(); } public String getSelectedColor(){ return value.getAttribute(“value”); } 5
  • 6. Составные элементы - Selenium @FindBy(css=".color-dropdown .caret") WebElement arrow; @FindBy (css=".color-dropdown. dd-menu") List<WebElement> list; @FindBy (css=".color-dropdown [type='text']") WebElement value; @FindBy(css=".color-dropdown .caret") WebElement arrow; @FindBy (css=".color-dropdown. dd-menu") List<WebElement> list; @FindBy (css=".color-dropdown [type='text']") WebElement value; @FindBy(css=".color-dropdown .caret") WebElement arrow; @FindBy (css=".color-dropdown. dd-menu") List<WebElement> list; @FindBy (css=".color-dropdown [type='text']") WebElement value; public void selectColor (String color){ arrow.click(); for (WebElement el : list) if (el.getText.equals(color)) { el.click(); break; } arrow.click(); } public String getSelectedColor(){ return value.getAttribute(“value”); } public void selectColor (String color){ arrow.click(); for (WebElement el : list) if (el.getText.equals(color)) { el.click(); break; } arrow.click(); } public String getSelectedColor(){ return value.getAttribute(“value”); } public void selectColor (String color){ arrow.click(); for (WebElement el : list) if (el.getText.equals(color)) { el.click(); break; } arrow.click(); } public String getSelectedColor(){ return value.getAttribute(“value”); } 6
  • 7. Составные элементы - JDI class MyPage extends WebPage { @FindBy(class = "colors-dropdown") public IDropDown<Colors> colors = new Dropdown<>( By.className("сarret"), By.cssSelector("li span"), By.cssSelector("[type=‘text’]")); @FindBy(class = " sizes-dropdown") public MyDropdown<Sizes> sizes; } 7
  • 8. Составные элементы - JDI myPage.colors.select("Blue"); myPage.colors.setValue(Colors.BLUE); *А еще можно работать с Enum String value = myPage.colors.getValue(); 8
  • 9. Проблема 2: Таблицы <div class="table"> <ul class="rows"> <li class=“row"> <div>cell1</div> <div>cell2</div> </li> <li class="row"> <div>cell3</div> <div>cell4</div> </li> </ul> </div> 9
  • 10. Таблицы - Selenium @FindBy(css=".root .table") WebElement table; @FindBy (css=".root .li .row") List<WebElement> row; @FindBy (css=".root .li .column") List<WebElement> column; public int getColumnsCount(){//TODO}; public int getRowdCount(){//TODO}; public String getRowValue (int index){//TODO}; public String getCellvalue (int index){//TODO}; public int searchRowContain(){//TODO}; public int searchRowMatch(){//TODO}; public String myGetRowValue (int index){//TODO}; public String myGetCellvalue (int index){//TODO}; public int myGetColumnCount(){//TODO}; public int myGetRowCount(){//TODO}; public String myGetRowValue (int index){//TODO}; public String myGetCellvalue (int index){//TODO}; public int myGetColumnCount(){//TODO}; public int myGetRowCount(){//TODO}; … public String myGetCellvalue (int index){//TODO}; public void cellClick (int x, int y) { driver.findElement(By.xpath(format("/tr[%s]/td[%s]"),x, y)).click(); } 10
  • 11. Таблицы - JDI <div class="table"> <ul class="rows"> <li class=“row"> <div>cell1</div> <div>cell2</div> </li> <li class="row"> <div>cell3</div> <div>cell4</div> </li> </ul> </div> class MyPage extends WebPage { @FindBy(css = ".root") ITable table = new Table( By.xpath(".//li[%s]"), By.xpath(".//li//div[%s]")); } @FindBy(css = “table”) ITable table; 11
  • 12. Таблицы - JDI myPage.table.getText(); myPage.table.row(1); myPage.table.cell(1, 2).getText(); myPage.table.cellsMatch (".*JDI.*", column("Name")); 12
  • 13. Проблема 3: сложные ячейки myPage.table.cell(1, 2).get(MyCell.class) .seeMore.click(); 13
  • 14. Итоги • Существенное уменьшение количество кода • Экономия времени тест инженера • Тесты пишутся быстро • Меньше вероятность ошибки • Проще поддержка тестов Типизированные элементы 14
  • 15. Проблема 4 - Формы 15
  • 16. Формы - Selenium public class MyPage{ @FindBy(css = ".root [jdi-name=Name]") public WebElement name; @FindBy(css = ".root [jdi-name=LastName]") public WebElement lastName; ……… @FindBy(css = ".root [jdi-name=description]") public WebElement description; ……… @FindBy(css = ".root [jdi-name=submit]") public WebElement submit; } 16
  • 17. Формы - Selenium void submitContactForm (Contact contacts) { name.sendKeys(contacts.name); lastName.sendKeys(contacts.lastName); ……… description.sendKeys(contacts.description); ……… submit.click(); } 17
  • 18. myPage.submitContactForm( new Contact(“John”, “Dow”, “desk”)); Формы - Selenium 18
  • 19. Формы - Selenium -А таких методов будет много: fill, check, verify… -И форм таких тоже может быть много… 19
  • 20. Формы - JDI class ContactForm extends Form<Contact> { @FindBy(css = "[jdi-name=Name]") public ITextField name; @FindBy(css = "[jdi-name=LastName]") public ITextField lastName; @FindBy(css = "[jdi-name=description]") public ITextArea description; @FindBy(css = "[jdi-name=submit]") public IButton submit; }; class Contact{ String name; String lastName; String description; }; 20
  • 21. Формы - JDI @FindBy(css = "main form") public ContactForm contactForm; 21
  • 22. myPage.contactForm.fill(Contact.DEFAULT_CONTACT); myPage.contactForm.submit(new Contact()); myPage.contactForm.check (new Contact(“John”, “Dow”, “desk”)); myPage.contactForm.verify(Contact.DEFAULT_CONTACT); class Contact{ String name; String lastName; String description; }; EDT - Entities Driven Testing 22
  • 23. Проблема 5: Списки составных элементов 23
  • 24. Списки составных элементов - JDI class MyPage{ @FindBy (css = ".petSection") List<CatSection> catSections; @FindBy (css = ".searchResults") Elements<SearchBlock> searchResults; } myPage.catSections.get(2).price.getText(); myPage.searchResults.get(“шоколадный красавчик”).price.getText(); 24
  • 25. Но и это еще не все! 25
  • 26. Проблема 6: IFrame <iframe id=‘frame’> <div class=‘button submitButton’> <span>Submit</span> </div> </iframe> myPage.submit.click(); 26
  • 28. IFrame - JDI myPage.frame.submit.click(); class MyFrame extends Sections { @FindBy(css=".submitButton") public IButton submit; } @Frame(css="#frame") public MyFrame frame; 28
  • 30. Стабильность - Selenium WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions .presenceOfElementLocated(By.id("myDynamicElement"))); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } 30
  • 31. Стабильность - JDI В JDI не нужно про это думать 31
  • 32. Проблема 8: Не только Web Mobile или Desktop 32
  • 33. Не только Web – Интерфейсы - JDI Интерфейсы – взгляд на элементы с точки зрения пользователя myButton.click(); myButton.getText(); public interface IButton { void click(); String getText(); } 33
  • 34. Не только Web @Test public void addContactTest() { ContactDetails contacts = new ContactDetails( "Irina", "222-22-22"); startPage.addContact.click(); addContactForm.save(contacts); } 34
  • 35. public void login(){ homePage.contactLogo.click(); homePage.userName.input("epam"); homePage.password.input("1234"); homePage.submit.click(); } Не только Web – Desktop - Sikuli public class HomePage extends Page { @JLocation(filePath = "HomePage/password.png") public TextField password; @JLocation(filePath = "HomePage/submit.png") public Button submit; @JLocation(filePath = "HomePage/contactLogo.png") public Button contactLogo; @JLocation(filePath = "HomePage/userName.png") public TextField userName; } 35
  • 36. UI Objects + Типизированные элементы + Типизированные Объекты (Секции) + Элементы-интерфейсы UI Objects = PageObject 36
  • 37. Выводы • Меньше кода • Экономия времени • Увеличение производительности • Меньше вероятность ошибки • Проще поддержка тестов • Легко адаптировать под свой проект • Мультиплатформенность • Логирование 37

Editor's Notes

  • #2: 1
  • #3: 2
  • #4: Для оптимизации затрат на разработку и тестирования в компании Epam мы разрабатываем различные инструменты, которые помогают нам ускорить процесс разработки и существенно сэкономить деньги и время на внедрение автоматизации. Мы также стараемся делится нашими наработками с сообществом, об одном из таких инструментов и пойдет речь. Фреймворк, который мы используем для UI тестирования в компании называется JDI. JDI имплементирует паттерн UI Objects, который расширяет всем известный паттерн Page Objects и позволяет легко адаптировать его под разные проекты отличающиеся не только версткой веб страницы, но и даже платформой (поддерживаются и мобильные устройства и Desktop) Подробнее информацию об его использовании можно поcмотреть в презентациях по ссылочкам или почитать на нашем сайте. Если вас больше интересует реализация или есть идеи по улучшению фреймворка, то welcome на Github.
  • #5: 4
  • #6: 5
  • #7: В этом случае мы получим Page Object с большим количеством элементов и методов соотнести которые друг с другом будет крайне не просто
  • #8: В JDI же мы смотрим на элементы с точки зрения пользователя. Для пользователя это 1 элемент dropdown. Так и запишем. Все необходимые локаторы указываются вместе. Также если вы обратили внимание у элемента можно указать общую часть локатора. Это позволяет сделать используемые локаторы существенно короче и нагляднее/ В случае если дропдауны в вашем проекте реализованы достаточно стандартно, то можно создать свой элемент и запись станет гораздо короче
  • #9: 8
  • #10: 9
  • #11: 10
  • #12: В JDI же таблица описывается очень просто, так же как и любой другой элемент. JDI умеет работать с «локаторами шаблонами», в которые потом подставляются значения, что сохраняет концепцию PageObjects и делает сами классы наглядными и легко поддерживаемыми У Таблиц также есть возможности для более детальной ее преднастройки, ну а в случае если таблица у вас реализована с использование стандартного подхода (тег table), вам достаточно просто указать локатор на него JDI мы предлагает взгялнуть на таблицу, как на отдельны элемент – создаем один элемент вместо трех В качестве входных параметров в конструктор передаем только локаторы для сторок и колонок таблицы, причем локаторы относительно ТАБЛИЦЫ ВЦЕЛОМ Если у нас таблицы посложнее и содержит еще и хедеры и футоры – локаторы для них также можно указывать в конструкторе – конструкторов для построения таблицы много. Реализованы Локаторы с шаблонами, куда будет подставлен индеск колоки или строки А если таблица реализована стандартным образом – еще проще – просто создаем элемент через аннотицию FindBy
  • #13: 12
  • #14: 13
  • #15: 14
  • #16: 15
  • #17: 16
  • #18: 17
  • #19: 18
  • #20: 19
  • #21: 20
  • #22: 21
  • #23: 22
  • #24: 23
  • #25: 24
  • #26: 25
  • #27: 26
  • #28: 27
  • #29: 28
  • #30: 29
  • #31: 30
  • #32: 31
  • #33: 32
  • #34: К счастью нет! Благодаря Интерфейсам используемым в JDI вам достаточно лишь подключить другой пакет (к примеру mobile) и все ваши тесты смогут работать с мобильными устройствами. Поменять придется лишь то что действительно отличается. Вот к примеру Кнопка. Кнопки бывают и в Web приложениях и в Мобильных и на Desktop. Есть ли какая-то разница между ними? С точки зрения реализации конечно да, но с точки зрения пользователя никакой. На кнопку просто можно нажать. Ну возможно у нее еще есть название. JDI смотрит на все элементы с точки зрения пользовательских действий именно по этому мы используем интерфейсы. Где же конкретно используются наши элементы это уже вопрос их реализации. Можно использовать Selenium, а можно Appium, можно даже написать имплементацию на JavaScript концептуально это неверно JDI предоставляет набор интерфейсов для работы с каждым UIObjects Для кнопки есть только click () и getText(), реализация которых зависит уже от типа прилжения и драйвера. Соответственно, интерфейсы помогают нам взглянуть на элементы с точки зрения пользователя, чего мы и добаваемся при написаниее тестов но есть проблемы и посложнее
  • #35: 34
  • #36: 35
  • #37: 36
  • #38: 37
  • #39: 38