Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 . d...
Составные элементы - Selenium
@FindBy(css=".color-dropdown .caret")
WebElement arrow;
@FindBy (css=".color-dropdown. dd-me...
Составные элементы - JDI
class MyPage extends WebPage {
@FindBy(class = "colors-dropdown")
public IDropDown<Colors> colors...
Составные элементы - JDI
myPage.colors.select("Blue");
myPage.colors.setValue(Colors.BLUE);
*А еще можно работать с Enum
S...
Проблема 2: Таблицы
<div class="table">
<ul class="rows">
<li class=“row">
<div>cell1</div>
<div>cell2</div>
</li>
<li cla...
Таблицы - Selenium
@FindBy(css=".root .table")
WebElement table;
@FindBy (css=".root .li .row")
List<WebElement> row;
@Fin...
Таблицы - JDI
<div class="table">
<ul class="rows">
<li class=“row">
<div>cell1</div>
<div>cell2</div>
</li>
<li class="ro...
Таблицы - JDI
myPage.table.getText();
myPage.table.row(1);
myPage.table.cell(1, 2).getText();
myPage.table.cellsMatch
(".*...
Проблема 3: сложные ячейки
myPage.table.cell(1, 2).get(MyCell.class)
.seeMore.click(); 13
Итоги
• Существенное уменьшение количество кода
• Экономия времени тест инженера
• Тесты пишутся быстро
• Меньше вероятнос...
Проблема 4 - Формы
15
Формы - Selenium
public class MyPage{
@FindBy(css = ".root [jdi-name=Name]")
public WebElement name;
@FindBy(css = ".root ...
Формы - Selenium
void submitContactForm (Contact contacts) {
name.sendKeys(contacts.name);
lastName.sendKeys(contacts.last...
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
@FindBy(css = "main form")
public ContactForm contactForm;
21
myPage.contactForm.fill(Contact.DEFAULT_CONTACT);
myPage.contactForm.submit(new Contact());
myPage.contactForm.check
(new ...
Проблема 5: Списки составных элементов
23
Списки составных элементов - JDI
class MyPage{
@FindBy (css = ".petSection")
List<CatSection> catSections;
@FindBy (css = ...
Но и это еще не все!
25
Проблема 6: IFrame
<iframe id=‘frame’>
<div class=‘button submitButton’>
<span>Submit</span>
</div>
</iframe>
myPage.submi...
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 sub...
Проблема 7: Стабильность
Где моя
кнопка??
29
Стабильность - Selenium
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions
.presenceO...
Стабильность - JDI
В JDI не нужно про это думать
31
Проблема 8: Не только Web
Mobile
или
Desktop
32
Не только Web – Интерфейсы - JDI
Интерфейсы – взгляд на элементы с точки зрения
пользователя
myButton.click();
myButton.ge...
Не только Web
@Test
public void addContactTest() {
ContactDetails contacts =
new ContactDetails(
"Irina",
"222-22-22");
st...
public void login(){
homePage.contactLogo.click();
homePage.userName.input("epam");
homePage.password.input("1234");
homeP...
UI Objects
+ Типизированные элементы
+ Типизированные Объекты (Секции)
+ Элементы-интерфейсы
UI Objects = PageObject
36
Выводы
• Меньше кода
• Экономия времени
• Увеличение производительности
• Меньше вероятность ошибки
• Проще поддержка тест...
Вопросы
https://jdi.epam.com
https://github.com/epam/JDI
https://vk.com/jdi_framework
Stepanovanv_87
Natalia_Grebenshchiko...
Upcoming SlideShare
Loading in …5
×

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

11,377 views

Published on

Доклад Натальи Гребенщиковой на конференции SQA Days-19, 20-21 мая 2016 г., Санкт-Петербург

Published in: Education
  • Be the first to comment

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

  1. 1. JDI: Автоматизировать проще, чем кажется SQA Days JDI: Автоматизировать проще, чем кажется May 2016 1
  2. 2. Senior QA Automation Гребенщикова Наталья 2
  3. 3. Вопросы https://jdi.epam.com https://vk.com/jdi_framework https://github.com/epam/JDI JDI 3
  4. 4. https://vk.com/jdi_framework 4
  5. 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. 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. 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. 8. Составные элементы - JDI myPage.colors.select("Blue"); myPage.colors.setValue(Colors.BLUE); *А еще можно работать с Enum String value = myPage.colors.getValue(); 8
  9. 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. 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. 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. 12. Таблицы - JDI myPage.table.getText(); myPage.table.row(1); myPage.table.cell(1, 2).getText(); myPage.table.cellsMatch (".*JDI.*", column("Name")); 12
  13. 13. Проблема 3: сложные ячейки myPage.table.cell(1, 2).get(MyCell.class) .seeMore.click(); 13
  14. 14. Итоги • Существенное уменьшение количество кода • Экономия времени тест инженера • Тесты пишутся быстро • Меньше вероятность ошибки • Проще поддержка тестов Типизированные элементы 14
  15. 15. Проблема 4 - Формы 15
  16. 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. 17. Формы - Selenium void submitContactForm (Contact contacts) { name.sendKeys(contacts.name); lastName.sendKeys(contacts.lastName); ……… description.sendKeys(contacts.description); ……… submit.click(); } 17
  18. 18. myPage.submitContactForm( new Contact(“John”, “Dow”, “desk”)); Формы - Selenium 18
  19. 19. Формы - Selenium -А таких методов будет много: fill, check, verify… -И форм таких тоже может быть много… 19
  20. 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. 21. Формы - JDI @FindBy(css = "main form") public ContactForm contactForm; 21
  22. 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. 23. Проблема 5: Списки составных элементов 23
  24. 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. Но и это еще не все! 25
  26. 26. Проблема 6: IFrame <iframe id=‘frame’> <div class=‘button submitButton’> <span>Submit</span> </div> </iframe> myPage.submit.click(); 26
  27. 27. IFrame - Selenuim driver.switchTo.frame(myFrame); myPage.submit.click(); driver.switchTo.defaultContent(); 27
  28. 28. IFrame - JDI myPage.frame.submit.click(); class MyFrame extends Sections { @FindBy(css=".submitButton") public IButton submit; } @Frame(css="#frame") public MyFrame frame; 28
  29. 29. Проблема 7: Стабильность Где моя кнопка?? 29
  30. 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. 31. Стабильность - JDI В JDI не нужно про это думать 31
  32. 32. Проблема 8: Не только Web Mobile или Desktop 32
  33. 33. Не только Web – Интерфейсы - JDI Интерфейсы – взгляд на элементы с точки зрения пользователя myButton.click(); myButton.getText(); public interface IButton { void click(); String getText(); } 33
  34. 34. Не только Web @Test public void addContactTest() { ContactDetails contacts = new ContactDetails( "Irina", "222-22-22"); startPage.addContact.click(); addContactForm.save(contacts); } 34
  35. 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. 36. UI Objects + Типизированные элементы + Типизированные Объекты (Секции) + Элементы-интерфейсы UI Objects = PageObject 36
  37. 37. Выводы • Меньше кода • Экономия времени • Увеличение производительности • Меньше вероятность ошибки • Проще поддержка тестов • Легко адаптировать под свой проект • Мультиплатформенность • Логирование 37
  38. 38. Вопросы https://jdi.epam.com https://github.com/epam/JDI https://vk.com/jdi_framework Stepanovanv_87 Natalia_Grebenshchikova@epam.com 38

×