Фреймворк html elements

Post on 29-Nov-2014

1.193 Views

Category:

Education

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Доклад Александра Толмачева на конференции SQA Days-12, 30 ноября-1 декабря, Минск

TRANSCRIPT

Фреймворк Html Elements или как удобно

взаимодействовать с веб-интерфейсами в тестах

Александр Толмачев

Yandex QA Tools

2

Yandex QA Tools

2

3

3

WebDriver

3

WebDriver

JavaБонус

4

Эволюция

5

Пример теста

5

Пример теста

SQA Days

5

Пример теста

SQA Days

6

Пример теста

6

Пример теста

7

Первый тест

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

8

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { driver.findElement(By.id("text")).sendKeys("SQA Days"); driver.findElement(By.className("b-form-button__input")).click(); assertTrue(driver.findElement(By.className("b-serp-list")). isDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

9

Недостатки

9

Читаемость

Переиспользование

Поддержка

Недостатки

10

Page Object

11

Страница

12

public class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Page Object

12

public class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Page Object

12

public class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Page Object

12

public class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Page Object

12

public class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Page Object

12

public class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Page Object

13

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); private SearchPage searchPage = new SearchPage(driver); private SearchResultsPage searchResultsPage = new SearchResultsPage(driver); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); assertTrue(searchResultsPage.isSearchResultsBlockDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

13

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); private SearchPage searchPage = new SearchPage(driver); private SearchResultsPage searchResultsPage = new SearchResultsPage(driver); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); assertTrue(searchResultsPage.isSearchResultsBlockDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

13

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); private SearchPage searchPage = new SearchPage(driver); private SearchResultsPage searchResultsPage = new SearchResultsPage(driver); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); assertTrue(searchResultsPage.isSearchResultsBlockDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

13

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); private SearchPage searchPage = new SearchPage(driver); private SearchResultsPage searchResultsPage = new SearchResultsPage(driver); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); assertTrue(searchResultsPage.isSearchResultsBlockDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

13

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); private SearchPage searchPage = new SearchPage(driver); private SearchResultsPage searchResultsPage = new SearchResultsPage(driver); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); assertTrue(searchResultsPage.isSearchResultsBlockDisplayed()); } @After public void closeDriver() { driver.quit(); } }

Код теста

14

Дублирование

14

Дублирование

14

Дублирование

14

Дублирование

14

Дублирование

14

Дублирование

14

Дублирование

14

Дублирование

15

Загромождение

Загромождениеpublic class AutoHomePage { @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "twoweeks") private WebElement rememberMeCheckBox; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

}

16

Загромождениеpublic class AutoHomePage { @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "twoweeks") private WebElement rememberMeCheckBox; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

}

16

Загромождениеpublic class AutoHomePage { @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "twoweeks") private WebElement rememberMeCheckBox; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

}

16

17

Отсутствие типизации

17

Отсутствие типизации

17

Select selectByIndex()

selectByValue()

...

Отсутствие типизации

public class PageWithSelect { @FindBy(xpath = "select-xpath") private WebElement select; public PageWithSelect(WebDriver driver) { PageFactory.initElements(driver, this); } private Select getSelect() { return new Select(select); } // Other methods using getSelect() method}

18

Отсутствие типизации

public class PageWithSelect { @FindBy(xpath = "select-xpath") private WebElement select; public PageWithSelect(WebDriver driver) { PageFactory.initElements(driver, this); } private Select getSelect() { return new Select(select); } // Other methods using getSelect() method}

18

Отсутствие типизации

public class PageWithSelect { @FindBy(xpath = "select-xpath") private WebElement select; public PageWithSelect(WebDriver driver) { PageFactory.initElements(driver, this); } private Select getSelect() { return new Select(select); } // Other methods using getSelect() method}

18

Отсутствие типизации

18

Отсутствие типизации

public class PageWithSelect { @FindBy(xpath = "select-xpath") private Select select; public PageWithSelect(WebDriver driver) { PageFactory.initElements(driver, this); } // Other methods using select }

18

Отсутствие типизации

public class PageWithSelect { @FindBy(xpath = "select-xpath") private Select select; public PageWithSelect(WebDriver driver) { PageFactory.initElements(driver, this); } // Other methods using select }

19

Недостатки

19

Дублирование кода

Недостатки

19

Дублирование кода

Загромождение

Недостатки

19

Дублирование кода

Отсутствие типизации

Загромождение

Недостатки

20

20

Html Elements

21

Блоки элементов

Типизация элементов

Библиотека матчеров

22

Блоки элементов

Типизация элементов

Библиотека матчеров

23

Структура страницы

23

Структура страницы

24

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Поисковая форма

24

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Поисковая форма

Блок

24

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Поисковая форма

Блок

Селектор блока

24

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Поисковая форма

Блок

Селектор блока

Элементы

24

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Поисковая форма

Блок

Селектор блока

Элементы

Логика взаимодействия

25

@Block(@FindBy(className = "b-domik")) public class AuthorizationForm extends HtmlElement { @FindBy(name = "login") WebElement loginFiled; @FindBy(name = "passwd") WebElement passwordFiled; @FindBy(className = "b-form-button__input") WebElement submitButton; public void login(String login, String password) { loginFiled.sendKeys(login); passwordFiled.sendKeys(password); submitButton.click(); }}

Форма авторизации

26

public class SearchPage { private SearchArrow searchArrow; private AuthorizationForm authorizationForm; // ...

public SearchPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public void login(String login, String password) { authorizationForm.login(login, password); } // ... }

Главная страница

26

public class SearchPage { private SearchArrow searchArrow; private AuthorizationForm authorizationForm; // ...

public SearchPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public void login(String login, String password) { authorizationForm.login(login, password); } // ... }

Главная страница

26

public class SearchPage { private SearchArrow searchArrow; private AuthorizationForm authorizationForm; // ...

public SearchPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public void login(String login, String password) { authorizationForm.login(login, password); } // ... }

Главная страница

26

public class SearchPage { private SearchArrow searchArrow; private AuthorizationForm authorizationForm; // ...

public SearchPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public void login(String login, String password) { authorizationForm.login(login, password); } // ... }

Главная страница

26

public class SearchPage { private SearchArrow searchArrow; private AuthorizationForm authorizationForm; // ...

public SearchPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public void login(String login, String password) { authorizationForm.login(login, password); } // ... }

Главная страница

27

Структура

28

Контекст поиска

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

28

Контекст поиска

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Селектор блока

Отностиельные селекторы

29

public class SearchResultsPage { @FindBy(className = "b-search") private SearchArrow searchArrow; private SearchResultsBlock searchResultsBlock; public SearchResultsPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public boolean isSearchResultsBlockDisplayed() { return searchResultsBlock.isDisplayed(); } }

Контекст поиска

29

public class SearchResultsPage { @FindBy(className = "b-search") private SearchArrow searchArrow; private SearchResultsBlock searchResultsBlock; public SearchResultsPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public boolean isSearchResultsBlockDisplayed() { return searchResultsBlock.isDisplayed(); } }

Контекст поискаПереопределение

селектора

30

Блоки элементов

Типизация элементов

Библиотека матчеров

31

Типизация

31

SQA

Типизация

32

SQA

Типизация

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton;

@FindBy(xpath = "//div[@class='i-popup__content']//li") private List<WebElement> suggest; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); }

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.get(suggestItemNumber).click(); } } 33

Поисковая форма

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton;

@FindBy(xpath = "//div[@class='i-popup__content']//li") private List<WebElement> suggest; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); }

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.get(suggestItemNumber).click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); }

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } } 33

Поисковая форма

34

Ленивая инициализация

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }

34

Ленивая инициализация

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }

Поиск при обращении

Элемент

35

Text Input

Button

CheckBox

Radio

Select

Стандартные элементы

36

Добавление элементовpublic class Suggest extends TypifiedElement { public Suggest(WebElement wrappedElement) { super(wrappedElement); } private List<WebElement> getItems() { return getWrappedElement().findElements(By.xpath("//li")); } public void selectByIndex(int itemIndex) { getItems().get(itemIndex).click(); } public void selectByValue(String itemValue) { for (WebElement item : getItems()) { if (itemValue.equals(item.getText())) { item.click(); return; } } throw new NoSuchElementException(); } }

36

Добавление элементовpublic class Suggest extends TypifiedElement { public Suggest(WebElement wrappedElement) { super(wrappedElement); } private List<WebElement> getItems() { return getWrappedElement().findElements(By.xpath("//li")); } public void selectByIndex(int itemIndex) { getItems().get(itemIndex).click(); } public void selectByValue(String itemValue) { for (WebElement item : getItems()) { if (itemValue.equals(item.getText())) { item.click(); return; } } throw new NoSuchElementException(); } }

36

Добавление элементовpublic class Suggest extends TypifiedElement { public Suggest(WebElement wrappedElement) { super(wrappedElement); } private List<WebElement> getItems() { return getWrappedElement().findElements(By.xpath("//li")); } public void selectByIndex(int itemIndex) { getItems().get(itemIndex).click(); } public void selectByValue(String itemValue) { for (WebElement item : getItems()) { if (itemValue.equals(item.getText())) { item.click(); return; } } throw new NoSuchElementException(); } }

36

Добавление элементовpublic class Suggest extends TypifiedElement { public Suggest(WebElement wrappedElement) { super(wrappedElement); } private List<WebElement> getItems() { return getWrappedElement().findElements(By.xpath("//li")); } public void selectByIndex(int itemIndex) { getItems().get(itemIndex).click(); } public void selectByValue(String itemValue) { for (WebElement item : getItems()) { if (itemValue.equals(item.getText())) { item.click(); return; } } throw new NoSuchElementException(); } }

36

Добавление элементовpublic class Suggest extends TypifiedElement { public Suggest(WebElement wrappedElement) { super(wrappedElement); } private List<WebElement> getItems() { return getWrappedElement().findElements(By.xpath("//li")); } public void selectByIndex(int itemIndex) { getItems().get(itemIndex).click(); } public void selectByValue(String itemValue) { for (WebElement item : getItems()) { if (itemValue.equals(item.getText())) { item.click(); return; } } throw new NoSuchElementException(); } }

36

Добавление элементовpublic class Suggest extends TypifiedElement { public Suggest(WebElement wrappedElement) { super(wrappedElement); } private List<WebElement> getItems() { return getWrappedElement().findElements(By.xpath("//li")); } public void selectByIndex(int itemIndex) { getItems().get(itemIndex).click(); } public void selectByValue(String itemValue) { for (WebElement item : getItems()) { if (itemValue.equals(item.getText())) { item.click(); return; } } throw new NoSuchElementException(); } }

37

Конструктор

37

Конструктор

Типизированные элементы

37

Конструктор

Типизированные элементы

Page-объект

38

Блоки элементов

Типизация элементов

Библиотека матчеров

39

Матчеры

39

Матчеры

assertThat(audience, isPayingAttention())

39

Матчеры

assertThat(audience, isPayingAttention())

assertThat(audience, is(not(sleeping())))

40

Наши матчеры

40

assertThat(element, exists())

Наши матчеры

40

assertThat(element, exists())

assertThat(element, hasText(“SQA Days”))

Наши матчеры

40

assertThat(element, exists())

assertThat(element, hasText(“SQA Days”))

assertThat(checkBox, isSelected())

Наши матчеры

40

assertThat(element, exists())

assertThat(element, hasText(“SQA Days”))

assertThat(checkBox, isSelected())

assertThat(radio, hasSelectedButton(3))

Наши матчеры

41

@Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); assertThat(searchResultsPage.getSearchResultsBlock(), exists()); }

Матчеры в тестах

42

@Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); assertThat(searchResultsPage.getSearchResultsBlock(), both(exists()).and(isDisplayed())); }

Матчеры в тестах

43

Матчеры в тестах@Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); String message = String.format( "Элемент '%s' должен присутсвовать на странице", searchResultsPage.getSearchResultsBlock() ); assertThat(message, searchResultsPage.getSearchResultsBlock(), exists()); }

43

Матчеры в тестах@Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); String message = String.format( "Элемент '%s' должен присутсвовать на странице", searchResultsPage.getSearchResultsBlock() ); assertThat(message, searchResultsPage.getSearchResultsBlock(), exists()); }

Assert: Элемент ‘[FirefoxDriver: firefox on MAC (e63b162c-853a-a243-999e-2266c9d52499)]’ должен присутсвовать на странице

@Name("Форма поиска") @Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @Name("Поисковая строка") @FindBy(id = "text") private TextInput requestInput; @Name("Кнопка 'Haйти'") @FindBy(className = "b-form-button__input") private Button searchButton;

@FindBy(className = "i-popup__content") private Suggest suggest; // ...

44

Именование элементов

@Name("Форма поиска") @Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @Name("Поисковая строка") @FindBy(id = "text") private TextInput requestInput; @Name("Кнопка 'Haйти'") @FindBy(className = "b-form-button__input") private Button searchButton;

@FindBy(className = "i-popup__content") private Suggest suggest; // ...

44

Именование элементов

Имя по аннотации

@Name("Форма поиска") @Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @Name("Поисковая строка") @FindBy(id = "text") private TextInput requestInput; @Name("Кнопка 'Haйти'") @FindBy(className = "b-form-button__input") private Button searchButton;

@FindBy(className = "i-popup__content") private Suggest suggest; // ...

44

Именование элементов

Имя по аннотации

Имя поназванию поля

45

public class SearchResultsPage { @FindBy(className = "b-search") private SearchArrow searchArrow; @Name("Блок результатов поиска") private SearchResultsBlock searchResultsBlock; public SearchResultsPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public SearchResultsBlock getSearchResultsBlock() { return searchResultsBlock; } }

Именование элементов

45

public class SearchResultsPage { @FindBy(className = "b-search") private SearchArrow searchArrow; @Name("Блок результатов поиска") private SearchResultsBlock searchResultsBlock; public SearchResultsPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public SearchResultsBlock getSearchResultsBlock() { return searchResultsBlock; } }

Именование элементовПереопределение

имени

46

Имена в тестах@Test public void shouldSeeSearchResultsWhenLookingUp() { searchPage.searchFor("SQA Days"); String message = String.format( "Элемент '%s' должен присутсвовать на странице", searchResultsPage.getSearchResultsBlock() ); assertThat(message, searchResultsPage.getSearchResultsBlock(), exists()); }

Assert: Элемент “Блок результатов поиска” должен присутствовать на странице

47

Блоки элементов

Типизация элементов

Библиотека матчеров

Жизнь стала такой48

49

Будущее

50

Библиотека элементов

50

Библиотека элементов

51

Динамические селекторы@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); }

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }

51

Динамические селекторы@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); }

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }

Статические селекторы

52

Динамические селекторы

53

Динамические селекторы

54

Понятные логи

54

1.Ввожу в элемент “Поисковая строка” текст “SQA Days”...

Понятные логи

54

1.Ввожу в элемент “Поисковая строка” текст “SQA Days”...

2.Кликаю на элемент “Кнопка ‘Найти’”...

Понятные логи

54

1.Ввожу в элемент “Поисковая строка” текст “SQA Days”...

2.Кликаю на элемент “Кнопка ‘Найти’”...

3.Проверяю наличие элемента “Блок результатов поиска”...

Понятные логи

54

1.Ввожу в элемент “Поисковая строка” текст “SQA Days”...

2.Кликаю на элемент “Кнопка ‘Найти’”...

3.Проверяю наличие элемента “Блок результатов поиска”...

Assert: Элемент “Блок результатов поиска” должен присутствовать на странице

Понятные логи

55

Генерация блоков

55

Страница

Генерация блоков

55

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Страница Блоки

Генерация блоков

56

И другое многое будет там

57

57

https://github.com/yandex-qatools/htmlelements

57

https://github.com/yandex-qatools/htmlelements

qa-tools@yandex-team.ru

starlight@yandex-team.ru

@alex_tolmachev

Cпасибо

top related