SlideShare ist ein Scribd-Unternehmen logo
1 von 38
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

Weitere ähnliche Inhalte

Was ist angesagt?

Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...Игорь Любин -- Об опыте тестирования программного компонента без пользователь...
Игорь Любин -- Об опыте тестирования программного компонента без пользователь...sqadays8
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4Technopark
 
HasValue and AsyncFilter
HasValue and AsyncFilterHasValue and AsyncFilter
HasValue and AsyncFilterqasta
 
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...CodeFest
 
Tequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONTequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONIvan Nemytchenko
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8Technopark
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииPaul Klimov
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Paul Klimov
 
Приложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefestПриложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefestActis Wunderman
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложенийZestranec
 
Web осень 2013 лекция 7
Web осень 2013 лекция 7Web осень 2013 лекция 7
Web осень 2013 лекция 7Technopark
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2Paul 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
Виталий Каторгин, WambaOntico
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Paul Klimov
 

Was ist angesagt? (20)

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

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

Оптимизация 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 #1dima_kuzovlev
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование версткиTalks&Works
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкRoman Dvornov
 
Beminar js
Beminar jsBeminar js
Beminar jsYandex
 
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"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 и TestNGAndrey Rebrov
 
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013Dmytro 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 лекция 4Technopark
 
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 14MoscowJS
 
Плюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизниПлюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизниz-tech
 
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Ontico
 

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

Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1Вёрстка WordPress тем - WP Kharkiv Meetup #1
Вёрстка WordPress тем - WP Kharkiv Meetup #1
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Beminar js
Beminar jsBeminar js
Beminar js
 
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
Сергей Бережной, Варвара Степанова "Как использовать БЭМ! вне Яндекса"
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
JavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программированияJavaScript как объектно-ориентированный язык программирования
JavaScript как объектно-ориентированный язык программирования
 
Appium для народа
Appium для народаAppium для народа
Appium для народа
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013За пределами Page Object. ATDays 2013 Киев. Февраль 2013
За пределами Page Object. ATDays 2013 Киев. Февраль 2013
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
 
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
Разработка бизнес приложений на OpenUI5. Николай Надоричев. MoscowJS 14
 
Плюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизниПлюсы и минусы автоматизации, пример из жизни
Плюсы и минусы автоматизации, пример из жизни
 
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
Basis.js — почему я не бросил разрабатывать свой фреймворк / Роман Дворнов (О...
 

Mehr von 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 testingSQALab
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженSQALab
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииSQALab
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовSQALab
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовSQALab
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsSQALab
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте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
 

Mehr von SQALab (20)

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

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

Hinweis der Redaktion

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