jdi: Автоматизировать проще, чем кажется
TRANSCRIPT
JDI: Автоматизировать проще, чем кажетсяSQA Days
JDI: Автоматизировать проще, чем кажется
May 2016
1
Senior QA Automation
Гребенщикова Наталья
2
Вопросы
https://jdi.epam.comhttps://vk.com/jdi_frameworkhttps://github.com/epam/JDI
JDI
3
https://vk.com/jdi_framework4
Проблема 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
@Testpublic 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