SlideShare una empresa de Scribd logo
1 de 83
Descargar para leer sin conexión
HtmlElements
PageObjects
Steps
PageObjects
Steps
Tests
PageObjects
Рецепт приготовления
Вкусных тестов
PageObjects
public class SearchPage {
@FindBy(id = "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(name = "b-form-button__input")
private WebElement authorizeButton;
public SearchPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void searchFor(String request) {
requestInput.sendKeys(request);
searchButton.click();
}
public void authorize (String login, String password) {
loginInput.sendKeys(login);
passwordInput.sendKeys(login);
authorizeButton.click();
}
}
Steps
public class CommonUserSteps {
public CommonUserSteps(WebDriver driver) {
...
}
public SearchPage onSearchPage() {
return searchPage;
}
public void loginAsCommonUser() {
User user = UserFactory.getCommonUser();
onSearchPage().authorize(user.getLogin, user.getPassword);
}
public void searchFor(String request) {
onSearchPage().searchFor(request);
}
public void shouldSeeSearchResults() {
assertTrue(onSearchPage().isSearchResultsBlockDisplayed());
}
}
Tests
public class SearchResultsTest {
private WebDriver driver = new FirefoxDriver();
private CommonUserSteps user = new CommonUserSteps(driver);
@Before
public void loadPage() {
driver.get("http://www.yandex.ru");
}
@Test
public void shouldSeeSearchResultsWhenLookingUp() {
user.searchFor("PageObject");
user.shouldSeeSearchResults();
}
@After
public void closeDriver() {
driver.quit();
}
}
Steps
Tests
PageObjects
Steps
Tests
PageObjects
Модель устойчива
Steps
Tests
PageObjects
Шаблонизаторы
Шаблонизаторы
Шаблонизаторы
Загромождение
Загромождение
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")
Загромождение
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;
Загромождение
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;
Загромождение
Недостатки
Дублирование кода
Недостатки
Дублирование кода
Загромождение
Недостатки
Коронное
блюдо
Steps
Tests
Element
PageObject
Element
PageObject
HtmlElements
Блоки элементов
Типизация элементов
Библиотека матчеров
Блоки элементов
Типизация элементов
Библиотека матчеров
Element
PageObject
@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-domik"))
public class AuthorizationForm extends HtmlElement {
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(className = "b-form-button__input")
private WebElement authorizeButton;
public void authorize(String login, String pass) {
loginInput.sendKeys(login);
passwordInput.sendKeys(password);
authorizeButton.click();
}
}
Форма авторизации
Element
PageObject
Главная страница
public class SearchPage {
@FindBy(id = "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(name = "b-form-button__input")
private WebElement authorizeButton;
public SearchPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
...
}
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);
}
}
Главная страница
Структура страницы
public class AutoSearchPage {
@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();
}
}
Переопределение
@Block(@FindBy(className = "b-head-search"))
public class SearchArrow extends HtmlElement {
...
}
Переопределение
public class SearchPage {
@FindBy(className = "b-search")
private SearchArrow searchArrow;
}
Блоки элементов
Типизация элементов
Библиотека матчеров
Типизация
в чем смысл
Типизация
в чем смысл
Типизация
Поисковая форма
в чем смысл
@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 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 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 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 searchBySuggest(String request, int suggestItemNumber) {
requestInput.sendKeys(request);
suggest.selectByIndex(suggestItemNumber);
}
}
Стандартные
TextBlock
TextInput
Link
Button
FileInput
Расширенные
Select
Radio
Table
Form
Checkbox
public class Checkbox extends TypifiedElement {
public WebElement getLabel(){...}
public String getLabelText(){...}
public String getText(){...}
public void select(){...}
public void deselect(){...}
public void set(boolean checked){...}
public boolean isSelected(){...}
}
Checkbox
public class Radio extends TypifiedElement {
public List<WebElement> getButtons(){...}
public WebElement getSelectedButton(){...}
public void selectByValue(String value){...}
public void selectByIndex(int index){...}
}
Radio
public class Select extends TypifiedElement {
public boolean isMultiple(){...}
public List<WebElements> getOptions(){...}
public List<WebElement> getAllSelectedOptions(){...}
public WebElement getFirstSelectedOption(){...}
public void selectByVisibleText(String text){...}
public void selectByIndex(int index){...}
public void selectByValue(String value){...}
public void deselectAll(){...}
public void deselectByValue(String value){...}
public void deselectByIndex(int index){...}
public void deselectByVisibleText(String text){...}
}
Select
Form
public class Form extends TypifiedElement {
public void fill(Map<String, Object> data){...}
public <T> void fill(T bean, Converter Converter){...}
protected WebElement findFiledByKey(String key){...}
protected void fillField(WebElement e, Object value){...}
public WebElement findFirstField(By by){...}
public List<WebElement> findFields(By by){...}
public List<WebElement> findSelectsBy(By by){...}
}
<form>
<some_style_tags>
<input name=”login” ...>
</some_style_tags>
<some_style_tags>
<input name=”passwd” ...>
</some_style_tags>
</form>
public class User {
@WebInput("login")
public String login;
@WebInput("passwd")
public String password;
}
public class SearchPage {
@FindBy(className = "b-domik")
private Form authorizationForm;
}
public class CommonUserSteps {
public void loginAsCommonUser() {
User user = UserFactory.getCommonUser();
HashMap<String, Object> userHash = convert(user);
onSearchPage().getAuthorizationForm.fill(userHash);
}
}
public class CommonUserSteps {
public void loginAsCommonUser() {
User user = UserFactory.getCommonUser();
HashMap<String, Object> userHash = convert(user);
onSearchPage().getAuthorizationForm.fill(userHash);
}
}
public class User {
@WebInput("login")
public String login;
@WebInput("passwd")
public String password;
}
public class Table extends TypifiedElement {
public List<WebElement> getHeadings(){...}
public List<String> getHeadingsAsString(){...}
public List<List<WebElement>> getRows(){...}
public List<List<WebElement>> getColumns(){...}
public WebElement getCellAt(int i, int j){...}
public List<Map> getRowsMappedToHeadings() {...}
public List<Map> getRowsMappedToHeadings(List<String> h){...}
public List<Map> getRowsAsStringMappedToHeadings(){...}
public List<Map> getRowsAsStringMappedToHeadings(List h){...}
}
Table
public class User {
@WebInput("login")
public String login;
@WebInput("passwd")
public String password;
}
Login Passwd
eroshenkoam c4fmUDTmbCzy8d
autotester 7cRrTT7g
public class User {
@WebInput("login")
public String login;
@WebInput("passwd")
public String password;
}
public class SearchUserSteps {
public List<User> findAllUsers() {
Table usersTable = onSomeSecretPage().getUsersTable();
List<Map> hash = usersTable.getRowsMappedToHeadings();
List<User> users = convert(hash);
return users;
}
}
public class SomeSecretePage {
@FindBy(className = "b-secret")
private Table users;
}
Converters
Поисковая форма
в чем смысл
@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);
}
}
Поисковая форма
в чем смысл
@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);
}
}
Добавление элементов
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();
}
}
Конструктор
Типизированные элементы
Страница
Блоки элементов
Типизация элементов
Библиотека матчеров
Матчеры
Матчеры
assertThat(audience, isPayingAttention())
Матчеры
assertThat(audience, isPayingAttention())
assertThat(audience, is(not(sleeping())))
Матчеры элементов
assertThat(element, exists())
Матчеры элементов
assertThat(element, exists())
assertThat(element, hasText(“Yandex”))
Матчеры элементов
assertThat(element, exists())
assertThat(element, hasText(“Yandex”))
assertThat(checkBox, isSelected())
Матчеры элементов
assertThat(element, exists())
assertThat(element, hasText(“Yandex”))
assertThat(checkBox, isSelected())
assertThat(radio, hasSelectedButton(3))
Матчеры элементов
Блоки элементов
Типизация элементов
Библиотека матчеров
Попробуйте
сами
Steps
Tests
Element
PageObject
HtmlElements
Технологии
Converter = LambdaJ
Step FRWK = 2CDDs
Matchers = Hamcrest
https://groups.google.com/forum/?fromgroups#!
forum/yandex-qatools-htmlelements
qa-tools@yandex-team.ru
@eroshenkoam
https://github.com/yandex-qatools/htmlelements

Más contenido relacionado

La actualidad más candente

Test-driven Development with AEM
Test-driven Development with AEMTest-driven Development with AEM
Test-driven Development with AEMJan Wloka
 
Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014Oren Rubin
 
google drive and the google drive sdk
google drive and the google drive sdkgoogle drive and the google drive sdk
google drive and the google drive sdkfirenze-gtug
 
Experienced Selenium Interview questions
Experienced Selenium Interview questionsExperienced Selenium Interview questions
Experienced Selenium Interview questionsarchana singh
 
Webinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDBWebinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDBMongoDB
 
Remote code-with-expression-language-injection
Remote code-with-expression-language-injectionRemote code-with-expression-language-injection
Remote code-with-expression-language-injectionMickey Jack
 
Spring Framework - Web Flow
Spring Framework - Web FlowSpring Framework - Web Flow
Spring Framework - Web FlowDzmitry Naskou
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBMongoDB
 
Simple Web Development in Java
Simple Web Development in JavaSimple Web Development in Java
Simple Web Development in JavaVincent Tencé
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testingdrewz lin
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in SwiftPeter Friese
 
10 sharing files and data in windows phone 8
10   sharing files and data in windows phone 810   sharing files and data in windows phone 8
10 sharing files and data in windows phone 8WindowsPhoneRocks
 
Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCABeginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCAWhymca
 
Nk API - examples
Nk API - examplesNk API - examples
Nk API - examplesnasza-klasa
 
Java. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax ApplicationsJava. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax ApplicationsМарія Русин
 

La actualidad más candente (20)

Test-driven Development with AEM
Test-driven Development with AEMTest-driven Development with AEM
Test-driven Development with AEM
 
Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014
 
google drive and the google drive sdk
google drive and the google drive sdkgoogle drive and the google drive sdk
google drive and the google drive sdk
 
Experienced Selenium Interview questions
Experienced Selenium Interview questionsExperienced Selenium Interview questions
Experienced Selenium Interview questions
 
SOLID Principles
SOLID PrinciplesSOLID Principles
SOLID Principles
 
Webinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDBWebinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDB
 
Remote code-with-expression-language-injection
Remote code-with-expression-language-injectionRemote code-with-expression-language-injection
Remote code-with-expression-language-injection
 
Ajax chap 4
Ajax chap 4Ajax chap 4
Ajax chap 4
 
Spring Framework - Web Flow
Spring Framework - Web FlowSpring Framework - Web Flow
Spring Framework - Web Flow
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
 
Simple Web Development in Java
Simple Web Development in JavaSimple Web Development in Java
Simple Web Development in Java
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testing
 
Javascript in Plone
Javascript in PloneJavascript in Plone
Javascript in Plone
 
Ajax chap 5
Ajax chap 5Ajax chap 5
Ajax chap 5
 
Di and Dagger
Di and DaggerDi and Dagger
Di and Dagger
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in Swift
 
10 sharing files and data in windows phone 8
10   sharing files and data in windows phone 810   sharing files and data in windows phone 8
10 sharing files and data in windows phone 8
 
Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCABeginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCA
 
Nk API - examples
Nk API - examplesNk API - examples
Nk API - examples
 
Java. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax ApplicationsJava. Explicit and Implicit Wait. Testing Ajax Applications
Java. Explicit and Implicit Wait. Testing Ajax Applications
 

Destacado

Фреймворк Html Elements
Фреймворк Html ElementsФреймворк Html Elements
Фреймворк Html ElementsSQALab
 
Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...
Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...
Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...AlexanderTolmachev
 
Реалистичное нагрузочное тестирование
Реалистичное нагрузочное тестированиеРеалистичное нагрузочное тестирование
Реалистичное нагрузочное тестированиеSQALab
 
Проект Роботестер
Проект РоботестерПроект Роботестер
Проект РоботестерSQALab
 
Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...
Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...
Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...SQALab
 
Использование игровых элементов и методов в процессе тестирования
Использование игровых элементов и методов в процессе тестированияИспользование игровых элементов и методов в процессе тестирования
Использование игровых элементов и методов в процессе тестированияSQALab
 
Нагрузочное тестирование web проектов
Нагрузочное тестирование web проектовНагрузочное тестирование web проектов
Нагрузочное тестирование web проектовSQALab
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...WrikeTechClub
 
Битва при юзабилити
Битва при юзабилитиБитва при юзабилити
Битва при юзабилитиSQALab
 
Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...
Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...
Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...SQALab
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»WrikeTechClub
 
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...WrikeTechClub
 
Будни тестирования Cassandr-ы
Будни тестирования Cassandr-ыБудни тестирования Cassandr-ы
Будни тестирования Cassandr-ыSQALab
 
Правила роста команды тестирования – мифы и реальность
Правила роста команды тестирования – мифы и реальностьПравила роста команды тестирования – мифы и реальность
Правила роста команды тестирования – мифы и реальностьSQALab
 
Простой взгляд на автоматизацию или Как не изобретать велосипед
Простой взгляд на автоматизацию или Как не изобретать велосипедПростой взгляд на автоматизацию или Как не изобретать велосипед
Простой взгляд на автоматизацию или Как не изобретать велосипедSQALab
 
Грабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибкахГрабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибкахSQALab
 
Организация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграцииОрганизация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграцииSQALab
 
Математика для тестировщиков
Математика для тестировщиковМатематика для тестировщиков
Математика для тестировщиковSQALab
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияSQALab
 
10 способов как не надо тестировать высоконагруженный веб-сервис
10 способов как не надо тестировать высоконагруженный веб-сервис10 способов как не надо тестировать высоконагруженный веб-сервис
10 способов как не надо тестировать высоконагруженный веб-сервисSQALab
 

Destacado (20)

Фреймворк Html Elements
Фреймворк Html ElementsФреймворк Html Elements
Фреймворк Html Elements
 
Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...
Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...
Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в...
 
Реалистичное нагрузочное тестирование
Реалистичное нагрузочное тестированиеРеалистичное нагрузочное тестирование
Реалистичное нагрузочное тестирование
 
Проект Роботестер
Проект РоботестерПроект Роботестер
Проект Роботестер
 
Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...
Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...
Тестирование по жесткой схеме! Или 27 + 2 фишки в построении процесса тестиро...
 
Использование игровых элементов и методов в процессе тестирования
Использование игровых элементов и методов в процессе тестированияИспользование игровых элементов и методов в процессе тестирования
Использование игровых элементов и методов в процессе тестирования
 
Нагрузочное тестирование web проектов
Нагрузочное тестирование web проектовНагрузочное тестирование web проектов
Нагрузочное тестирование web проектов
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
 
Битва при юзабилити
Битва при юзабилитиБитва при юзабилити
Битва при юзабилити
 
Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...
Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...
Перестаньте спрашивать «КОГДА?» Или как перестать закапывать свои проекты в д...
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
 
Будни тестирования Cassandr-ы
Будни тестирования Cassandr-ыБудни тестирования Cassandr-ы
Будни тестирования Cassandr-ы
 
Правила роста команды тестирования – мифы и реальность
Правила роста команды тестирования – мифы и реальностьПравила роста команды тестирования – мифы и реальность
Правила роста команды тестирования – мифы и реальность
 
Простой взгляд на автоматизацию или Как не изобретать велосипед
Простой взгляд на автоматизацию или Как не изобретать велосипедПростой взгляд на автоматизацию или Как не изобретать велосипед
Простой взгляд на автоматизацию или Как не изобретать велосипед
 
Грабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибкахГрабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибках
 
Организация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграцииОрганизация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграции
 
Математика для тестировщиков
Математика для тестировщиковМатематика для тестировщиков
Математика для тестировщиков
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестирования
 
10 способов как не надо тестировать высоконагруженный веб-сервис
10 способов как не надо тестировать высоконагруженный веб-сервис10 способов как не надо тестировать высоконагруженный веб-сервис
10 способов как не надо тестировать высоконагруженный веб-сервис
 

Similar a HtmlElements – естественное расширение PageObject

CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...CodeFest
 
Session on "The Screenplay Pattern: Better Interactions for Better Automation...
Session on "The Screenplay Pattern: Better Interactions for Better Automation...Session on "The Screenplay Pattern: Better Interactions for Better Automation...
Session on "The Screenplay Pattern: Better Interactions for Better Automation...Agile Testing Alliance
 
QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...
QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...
QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...QAFest
 
A test framework out of the box - Geb for Web and mobile
A test framework out of the box - Geb for Web and mobileA test framework out of the box - Geb for Web and mobile
A test framework out of the box - Geb for Web and mobileGlobalLogic Ukraine
 
Обзор автоматизации тестирования на JavaScript
Обзор автоматизации тестирования на JavaScriptОбзор автоматизации тестирования на JavaScript
Обзор автоматизации тестирования на JavaScriptCOMAQA.BY
 
InheritedWidget is your friend - GDG London (2018-08-08)
InheritedWidget is your friend - GDG London (2018-08-08)InheritedWidget is your friend - GDG London (2018-08-08)
InheritedWidget is your friend - GDG London (2018-08-08)Andrea Bizzotto
 
Creating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdfCreating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdfShaiAlmog1
 
[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji
[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji
[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcjiFuture Processing
 
Week 4 - jQuery + Ajax
Week 4 - jQuery + AjaxWeek 4 - jQuery + Ajax
Week 4 - jQuery + Ajaxbaygross
 
The love child of Android and .NET: App development with Xamarin
The love child of Android and .NET: App development with XamarinThe love child of Android and .NET: App development with Xamarin
The love child of Android and .NET: App development with XamarinLorenz Cuno Klopfenstein
 
Windows ストアーアプリで SQLite を使ってみよう
Windows ストアーアプリで SQLite を使ってみようWindows ストアーアプリで SQLite を使ってみよう
Windows ストアーアプリで SQLite を使ってみようShinichiAoyagi
 
Web Automation Testing Using Selenium
Web Automation Testing Using SeleniumWeb Automation Testing Using Selenium
Web Automation Testing Using SeleniumPete Chen
 
Create an advance data type to represent web page history. Name this .pdf
Create an advance data type to represent web page history. Name this .pdfCreate an advance data type to represent web page history. Name this .pdf
Create an advance data type to represent web page history. Name this .pdfsanuoptical
 
Introduction to Parse backend for mobile developers
Introduction to Parse backend for mobile developersIntroduction to Parse backend for mobile developers
Introduction to Parse backend for mobile developersGrigor Yeghiazaryan
 
Тройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOSТройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOSAndrei Solntsev
 
Роман Иовлев «Open Source UI Automation Tests on C#»
Роман Иовлев «Open Source UI Automation Tests on C#»Роман Иовлев «Open Source UI Automation Tests on C#»
Роман Иовлев «Open Source UI Automation Tests on C#»SpbDotNet Community
 

Similar a HtmlElements – естественное расширение PageObject (20)

CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
 
Session on "The Screenplay Pattern: Better Interactions for Better Automation...
Session on "The Screenplay Pattern: Better Interactions for Better Automation...Session on "The Screenplay Pattern: Better Interactions for Better Automation...
Session on "The Screenplay Pattern: Better Interactions for Better Automation...
 
QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...
QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...
QA Fest 2017. Ярослав Святкин. Тестовый фреймворк GEB для тестирования WEB пр...
 
Geb qa fest2017
Geb qa fest2017Geb qa fest2017
Geb qa fest2017
 
A test framework out of the box - Geb for Web and mobile
A test framework out of the box - Geb for Web and mobileA test framework out of the box - Geb for Web and mobile
A test framework out of the box - Geb for Web and mobile
 
Обзор автоматизации тестирования на JavaScript
Обзор автоматизации тестирования на JavaScriptОбзор автоматизации тестирования на JavaScript
Обзор автоматизации тестирования на JavaScript
 
InheritedWidget is your friend - GDG London (2018-08-08)
InheritedWidget is your friend - GDG London (2018-08-08)InheritedWidget is your friend - GDG London (2018-08-08)
InheritedWidget is your friend - GDG London (2018-08-08)
 
Creating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdfCreating a Facebook Clone - Part XXXI - Transcript.pdf
Creating a Facebook Clone - Part XXXI - Transcript.pdf
 
[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji
[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji
[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji
 
Week 4 - jQuery + Ajax
Week 4 - jQuery + AjaxWeek 4 - jQuery + Ajax
Week 4 - jQuery + Ajax
 
The love child of Android and .NET: App development with Xamarin
The love child of Android and .NET: App development with XamarinThe love child of Android and .NET: App development with Xamarin
The love child of Android and .NET: App development with Xamarin
 
Windows ストアーアプリで SQLite を使ってみよう
Windows ストアーアプリで SQLite を使ってみようWindows ストアーアプリで SQLite を使ってみよう
Windows ストアーアプリで SQLite を使ってみよう
 
Error found
Error foundError found
Error found
 
Jquery introduction
Jquery introductionJquery introduction
Jquery introduction
 
Web Automation Testing Using Selenium
Web Automation Testing Using SeleniumWeb Automation Testing Using Selenium
Web Automation Testing Using Selenium
 
Create an advance data type to represent web page history. Name this .pdf
Create an advance data type to represent web page history. Name this .pdfCreate an advance data type to represent web page history. Name this .pdf
Create an advance data type to represent web page history. Name this .pdf
 
Introduction to Parse backend for mobile developers
Introduction to Parse backend for mobile developersIntroduction to Parse backend for mobile developers
Introduction to Parse backend for mobile developers
 
Тройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOSТройничок: Selenide для Web, Android и iOS
Тройничок: Selenide для Web, Android и iOS
 
Роман Иовлев «Open Source UI Automation Tests on C#»
Роман Иовлев «Open Source UI Automation Tests on C#»Роман Иовлев «Open Source UI Automation Tests on C#»
Роман Иовлев «Open Source UI Automation Tests on C#»
 
Beyond pageobjects
Beyond pageobjectsBeyond pageobjects
Beyond pageobjects
 

Más de SQALab

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки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
 

Más de SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
Автоматизация 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 или как тест-менеджеру перекроить внут...
 

Último

Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfInclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfTechSoup
 
Proudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxProudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxthorishapillay1
 
Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17Celine George
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONHumphrey A Beña
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfphamnguyenenglishnb
 
HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...
HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...
HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...Nguyen Thanh Tu Collection
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfMr Bounab Samir
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxiammrhaywood
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designMIPLM
 
Judging the Relevance and worth of ideas part 2.pptx
Judging the Relevance  and worth of ideas part 2.pptxJudging the Relevance  and worth of ideas part 2.pptx
Judging the Relevance and worth of ideas part 2.pptxSherlyMaeNeri
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxnelietumpap1
 
ACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdfACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdfSpandanaRallapalli
 
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Celine George
 
Gas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxGas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxDr.Ibrahim Hassaan
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPCeline George
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomnelietumpap1
 
Choosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for ParentsChoosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for Parentsnavabharathschool99
 
Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Mark Reed
 

Último (20)

Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdfInclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
Inclusivity Essentials_ Creating Accessible Websites for Nonprofits .pdf
 
Proudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxProudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptx
 
Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17Difference Between Search & Browse Methods in Odoo 17
Difference Between Search & Browse Methods in Odoo 17
 
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATIONTHEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
THEORIES OF ORGANIZATION-PUBLIC ADMINISTRATION
 
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdfAMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
AMERICAN LANGUAGE HUB_Level2_Student'sBook_Answerkey.pdf
 
HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...
HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...
HỌC TỐT TIẾNG ANH 11 THEO CHƯƠNG TRÌNH GLOBAL SUCCESS ĐÁP ÁN CHI TIẾT - CẢ NĂ...
 
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdfLike-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
Like-prefer-love -hate+verb+ing & silent letters & citizenship text.pdf
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
 
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptxLEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-design
 
Judging the Relevance and worth of ideas part 2.pptx
Judging the Relevance  and worth of ideas part 2.pptxJudging the Relevance  and worth of ideas part 2.pptx
Judging the Relevance and worth of ideas part 2.pptx
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptx
 
ACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdfACC 2024 Chronicles. Cardiology. Exam.pdf
ACC 2024 Chronicles. Cardiology. Exam.pdf
 
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
 
Gas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxGas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptx
 
YOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptx
YOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptxYOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptx
YOUVE_GOT_EMAIL_PRELIMS_EL_DORADO_2024.pptx
 
What is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERPWhat is Model Inheritance in Odoo 17 ERP
What is Model Inheritance in Odoo 17 ERP
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choom
 
Choosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for ParentsChoosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for Parents
 
Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)Influencing policy (training slides from Fast Track Impact)
Influencing policy (training slides from Fast Track Impact)
 

HtmlElements – естественное расширение PageObject

  • 2.
  • 8.
  • 10. public class SearchPage { @FindBy(id = "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(name = "b-form-button__input") private WebElement authorizeButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void authorize (String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(login); authorizeButton.click(); } }
  • 11. Steps
  • 12. public class CommonUserSteps { public CommonUserSteps(WebDriver driver) { ... } public SearchPage onSearchPage() { return searchPage; } public void loginAsCommonUser() { User user = UserFactory.getCommonUser(); onSearchPage().authorize(user.getLogin, user.getPassword); } public void searchFor(String request) { onSearchPage().searchFor(request); } public void shouldSeeSearchResults() { assertTrue(onSearchPage().isSearchResultsBlockDisplayed()); } }
  • 13. Tests
  • 14. public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); private CommonUserSteps user = new CommonUserSteps(driver); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("PageObject"); user.shouldSeeSearchResults(); } @After public void closeDriver() { driver.quit(); } }
  • 24. 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") Загромождение
  • 25. 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; Загромождение
  • 26. 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; Загромождение
  • 36.
  • 37.
  • 39. @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(); } } Поисковая форма
  • 40. @Block(@FindBy(className = "b-domik")) public class AuthorizationForm extends HtmlElement { @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(className = "b-form-button__input") private WebElement authorizeButton; public void authorize(String login, String pass) { loginInput.sendKeys(login); passwordInput.sendKeys(password); authorizeButton.click(); } } Форма авторизации
  • 42. Главная страница public class SearchPage { @FindBy(id = "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(name = "b-form-button__input") private WebElement authorizeButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); } ... }
  • 43. 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); } } Главная страница
  • 45. public class AutoSearchPage { @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(); } } Переопределение
  • 46. @Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { ... } Переопределение public class SearchPage { @FindBy(className = "b-search") private SearchArrow searchArrow; }
  • 51. Поисковая форма в чем смысл @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 searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.get(suggestItemNumber).click(); } }
  • 52. Поисковая форма в чем смысл @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 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 searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }
  • 55. public class Checkbox extends TypifiedElement { public WebElement getLabel(){...} public String getLabelText(){...} public String getText(){...} public void select(){...} public void deselect(){...} public void set(boolean checked){...} public boolean isSelected(){...} } Checkbox
  • 56. public class Radio extends TypifiedElement { public List<WebElement> getButtons(){...} public WebElement getSelectedButton(){...} public void selectByValue(String value){...} public void selectByIndex(int index){...} } Radio
  • 57. public class Select extends TypifiedElement { public boolean isMultiple(){...} public List<WebElements> getOptions(){...} public List<WebElement> getAllSelectedOptions(){...} public WebElement getFirstSelectedOption(){...} public void selectByVisibleText(String text){...} public void selectByIndex(int index){...} public void selectByValue(String value){...} public void deselectAll(){...} public void deselectByValue(String value){...} public void deselectByIndex(int index){...} public void deselectByVisibleText(String text){...} } Select
  • 58. Form public class Form extends TypifiedElement { public void fill(Map<String, Object> data){...} public <T> void fill(T bean, Converter Converter){...} protected WebElement findFiledByKey(String key){...} protected void fillField(WebElement e, Object value){...} public WebElement findFirstField(By by){...} public List<WebElement> findFields(By by){...} public List<WebElement> findSelectsBy(By by){...} }
  • 59. <form> <some_style_tags> <input name=”login” ...> </some_style_tags> <some_style_tags> <input name=”passwd” ...> </some_style_tags> </form> public class User { @WebInput("login") public String login; @WebInput("passwd") public String password; }
  • 60. public class SearchPage { @FindBy(className = "b-domik") private Form authorizationForm; } public class CommonUserSteps { public void loginAsCommonUser() { User user = UserFactory.getCommonUser(); HashMap<String, Object> userHash = convert(user); onSearchPage().getAuthorizationForm.fill(userHash); } } public class CommonUserSteps { public void loginAsCommonUser() { User user = UserFactory.getCommonUser(); HashMap<String, Object> userHash = convert(user); onSearchPage().getAuthorizationForm.fill(userHash); } } public class User { @WebInput("login") public String login; @WebInput("passwd") public String password; }
  • 61. public class Table extends TypifiedElement { public List<WebElement> getHeadings(){...} public List<String> getHeadingsAsString(){...} public List<List<WebElement>> getRows(){...} public List<List<WebElement>> getColumns(){...} public WebElement getCellAt(int i, int j){...} public List<Map> getRowsMappedToHeadings() {...} public List<Map> getRowsMappedToHeadings(List<String> h){...} public List<Map> getRowsAsStringMappedToHeadings(){...} public List<Map> getRowsAsStringMappedToHeadings(List h){...} } Table
  • 62. public class User { @WebInput("login") public String login; @WebInput("passwd") public String password; } Login Passwd eroshenkoam c4fmUDTmbCzy8d autotester 7cRrTT7g
  • 63. public class User { @WebInput("login") public String login; @WebInput("passwd") public String password; } public class SearchUserSteps { public List<User> findAllUsers() { Table usersTable = onSomeSecretPage().getUsersTable(); List<Map> hash = usersTable.getRowsMappedToHeadings(); List<User> users = convert(hash); return users; } } public class SomeSecretePage { @FindBy(className = "b-secret") private Table users; }
  • 65. Поисковая форма в чем смысл @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); } }
  • 66. Поисковая форма в чем смысл @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); } }
  • 67. Добавление элементов 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(); } }
  • 77. assertThat(element, exists()) assertThat(element, hasText(“Yandex”)) assertThat(checkBox, isSelected()) assertThat(radio, hasSelectedButton(3)) Матчеры элементов
  • 82. Технологии Converter = LambdaJ Step FRWK = 2CDDs Matchers = Hamcrest