QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe

Q
UI Automation:

Page Objects
Лучше проще, да лучше
Alexei Vinogradov
Alexei Vinogradov

IT-Kонсультант



тестирование, управление тестированием,
автоматизация в тестировании, коучинг
15+ лет в IT, докладчик SQA Days / Codefest
Студент-практикант -> Программист -> Тестировщик ->…
! !
http://radio-qa.com
Page Objects: идея
Разделить код тестов и 

код нахождения и 

управления элементами страниц
Page Objects: преимущества
Уменьшает дублирование кода
Улучшает читаемость и стабильность
Уменьшает расходы на поддержку изменений
UI Автоматизация - это скучно
UI Автоматизация
1. Составить тест-кейсы (не все)
2. Сражаться с тулзами
3. Сражаться с изменениями
4. Повторять 1-3
Лекарство
Пишем свои фреймворки
Justin Searls
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
Анти-паттерны в Page Objects:
типизированные элементы
Yandex HtmlElements
testIT WebTester
JDI
Button
Link
Image
Checkbox
Типизированные элементы
Это что за элемент?
<a class=„fancy“ href=„javascript:doSmth()“>
Типизированные элементы
A это что за элемент?
<input type=„button“>
Типизированные элементы
A это? :)
<div style=„..some-qooxdoo-magic..“>
Проблемы типизирования
Проверка валидности в Runtime, не Compile-time
Проблемы типизирования
Один элемент - несколько типов
Проблемы типизирования
Нужно задумываться о типе элемента
Усложняет поддержку, если тип „несовершенен“
Вывод
Тотальное типизирование элементов - зло!
Но…
Поддержка стандартных ситуаций - польза:
• Uploads
• Select/Dropdown
• Tables
• …
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
Static Page Objects (Page Modules)
Void Page Objects
Fluent Page Objects
Реализация
http://selenide.org
Selenium inside
UI Testing Framework
open(url)
open(relativeUrl)
Selenide


WebDriver driver=new FirefoxDriver();

driver.get(url);



driver.get(SystemProperties.get(„hostname“)

+ relativeUrl);
$(„cssSelector“)
Selenide
driver.findElement(By.cssSelector("cssSelector"))



или


@FindBy (css="cssSelector")
shouldBe(…), shouldHave(…), should(…)
shouldNotBe(…), etc.
Selenide
Assert + implicit wait +
StaleElementReferenceException retry +

smart logging + screenshot + source code save
Приложение
LoginPage HomePage
Static Page Objects
Все элементы и методы - static
Методы возвращают void или сущности
Другое название PageModules*
* Яков Крамаренко, „KISS Automation“ (2015)
Static (Page Modules)
public class LoginPage {



public static SelenideElement welcomeMsg=$("#welcome"),

username=$("#username"),

password=$("#password"),

loginBtn=$("#login");



public static void login(String user, String pwd){

username.setValue(user);

password.setValue(pwd);

loginBtn.click();

}

}


public class HomePage {


public static SelenideElement welcomeMsg=$("#welcome");

}
Static (Page Modules)
public class LoginPage {



public static SelenideElement welcomeMsg=$("#welcome"),

username=$("#username"),

password=$("#password"),

loginBtn=$("#login");



public static void login(String user, String pwd){

username.setValue(user);

password.setValue(pwd);

loginBtn.click();

}

}


public class HomePage {


public static SelenideElement welcomeMsg=$("#welcome");

}
Static (Page Modules)
public class LoginTest {



@Test

public void testLogin(){

open("/");

LoginPage.welcomeMsg.shouldBe(visible);

LoginPage.login("admin","12345");

HomePage.welcomeMsg.shouldBe(visible);

}

}

Паттерн public/private (or default)
…

// elements to be used in tests

public static SelenideElement welcomeMsg = $("#welcome");



// elements to be used in pageObject only

static SelenideElement username = $("#username"),

password = $("#password"),

loginBtn = $("#login");

…







Антипаттерн Getter/Setter
public class LoginPage {



public static SelenideElement welcomeMsg=$("#welcome"),

username=$("#username"),

password=$("#password"),

loginBtn=$("#login");



public static SelenideElement getWelcomeMsg() {

return welcomeMsg;

}



public static SelenideElement getUsername() {

return username;

}



public static SelenideElement getPassword() {

return password;

}



public static SelenideElement getLoginBtn() {

return loginBtn;

}



public static void login(String username, String pwd){

getUsername().setValue(username);

getPassword().setValue(pwd);

getLoginBtn().click();

}

}

Антипаттерн Getter/Setter
Ненужные строчки кода
Увеличивает „шум“ в полезном коде
Static imports
import static com.app.pages.LoginPage.*;



public class LoginTest {



@Test

public void testLogin(){

open("/");

welcomeMsg.shouldBe(visible);

login("admin","12345");

HomePage.welcomeMsg.shouldBe(visible);

}

}

Не всегда хороши:
Static imports
import static com.app.pages.FormElement.*;


public class FormTest {



@Test

public void shouldBeInitiallyEmpty(){

firstname.shouldBe(empty);

lastname.shouldBe(empty);
addressLine1.shouldBe(empty);
addressLine2.shouldBe(empty);
mobilePhone.shouldBe(empty);
}

}

Иногда полезны:
Преимущества - недостатки
+ Очень просто и доступно для начинающих
- (очень редко) Проблемы при параллелизации 

(может зависеть от фреймворка, из-за static)
? меньше гибкости: 

не рекомендуется хранить состояние 

нельзя сделать текучий (fluent) интерфейс
Приложение
LoginPage HomePage
Void Page Objects
Убираем static из описания полей и методов
Добавляем конструктор
Void Page Objectspublic class LoginPage {



public SelenideElement welcomeMsg = $("#welcome");



SelenideElement username = $("#username"),

password = $("#password"),

loginBtn = $("#login");



public void login(String username, String pwd) {

…

}



public LoginPage(){

welcomeMsg.shouldBe(visible);

}

}
public class HomePage {



SelenideElement welcomeMsg=$("#welcome");



public SelenideElement loggedInUser=$("#loggedInUser");



public HomePage(){

welcomeMsg.shouldBe(visible);

}

}
Void Page Objects
public class LoginTest {



@Test

public void testLogin(){

open("/");

new LoginPage().login("admin","12345");

HomePage homePage=new HomePage();

homePage.loggedInUser.shouldHave(text("admin"));

}

}
Преимущества - недостатки
+ Очень просто и доступно для начинающих
+/? Проверки в конструкторе
+/? можно хранить состояние 

(пример - выбранная строка таблицы)
Fluent Page Objects
Методы возвращают PageObject страницы перехода
Если перехода нет - возвращается текущий
PageObject
Fluent Page Objects
public class LoginPage {



public SelenideElement welcomeMsg = $("#welcome");

…

public HomePage login(String username, String pwd) {

this.username.setValue(username);

password.setValue(pwd);

loginBtn.click();

return new HomePage();

}



public LoginPage(){

welcomeMsg.shouldBe(visible);

}

}

Приложение
HomePage
Fluent Page Objects
public class HomePage {



SelenideElement welcomeMsg=$("#welcome"),

reloadBalanceBtn=$("#reloadBalance"),

balanceDetailsBtn=$("#balanceDetails");



…
}



public HomePage reloadBalance(){

reloadBalanceBtn.click();

return this; // return new HomePage();

}



public BalanceDetailsPage openBalanceDetails(){

balanceDetailsBtn.click();

return new BalanceDetailsPage();

}

}

Fluent Page Objects
public class LoginTest {



@Test

public void testLogin(){

open("/");

HomePage homePage=new LoginPage().login("admin","12345");

homePage.loggedInUser.shouldHave(text("admin"));

}

}
Fluent Page Objects
public class FlowTest {



@Test

public void fluentTest(){

new LoginPage().login("admin","12345")

.reloadBalance()

.openBalanceDetails();

}



@Test

public void nonfluentTest(){

HomePage homePage=new LoginPage().login("admin","12345");

homePage.reloadBalance();

BalanceDetailsPage balancePage=homePage.openBalanceDetails();

}

}

Абсолютно неоднозначно, какой из вариантов лучше
Преимущества - недостатки
? переходы между страницами определены в
Page Object - анализ тулзами
-/? некоторые сложности, если метод
возвращает сущности
Приложение
LoginPage
Методы на распутье (Void)
public class LoginTest {



@Test

public void testLogin(){

new LoginPage().login("admin","12345");

HomePage homePage=new HomePage();

homePage.loggedInUser.shouldHave(text("admin"));

}



@Test

public void testBadLogin(){

LoginPage loginPage=new LoginPage();

loginPage.errorMsg.shouldNotBe(visible);

loginPage.login("admin","admin");

new LoginPage().errorMsg.shouldBe(visible);

//loginPage.errorMsg.shouldBe(visible);

}

}
Методы на распутье (Fluent)


…



public HomePage login(String username, String pwd) {

doLogin(username, pwd);

return new HomePage();

}



public LoginPage badLogin(String username, String pwd) {

doLogin(username, pwd);

return new LoginPage(); //return this;

}



private void doLogin(String username, String pwd) {

this.username.setValue(username);

password.setValue(pwd);

loginBtn.click();

}



… 

}
Методы на распутье (Fluent)
public class LoginTest {



@Test

public void testLogin(){

HomePage homePage=new LoginPage().login("admin","12345");

homePage.loggedInUser.shouldHave(text("admin"));

}



@Test

public void testBadLogin(){

LoginPage loginPage=new LoginPage().badLogin("admin","admin");

loginPage.errorMsg.shouldHave(text("Error"));

}

}

Немецкая шутка
Сколько немцев нужно, чтобы вкрутить лампочку?
Анти-паттерны: наследование
Наследование сущностей - О.К.
Анти-паттерны: наследование
Наследование страниц - плохо
Анти-паттерны: наследование
Усложняет поддержку
Лучше пользуйте композицией
Или элементами без композиции
Или копипейстом…*
S.O.L.I.D.
Правила SOLID для тестов - зло!
потому что тестовый код ПОСТОЯННО исполняется
Паттерн Page Elements (Page Blocks)
сложно или невозможно обозначить страницы
блоки элементов повторяются на разных страницах
поддержка в Yandex HTMLElements и др.
паттерн можно использовать без композиции
Тесты с Page Elements без композиции
public class NonCompositeTest {



@Test

public void elementTest(){

new LoginPage().login(„admin“,"12345");
HomePage page=new HomePage();

AddressElement address=new AddressElement();

page.userName.shouldBe(visible);

address.zipCode.shouldBe(visible); 

}



}

Композиция с Page Elements
public class HomePage {



…
public AddressElement addressElement;



public HomePage(){

addressElement=new AddressElement();
…

}



}

Сложности с Page Elements
<div id=„address1“>
…
// code of addressElement
…
</div>
<div id=„address2“>
…
// code of addressElement
…
</div>
SavingAccountPage VisaAccountPage
Посмотрите Yandex HtmlElements
Или напишите своё решение
Или …
4 стадии развития
1. Знаю как сделать
2. Знаю как сделать эффективно
3. Знаю как сделать изящно
4. Знаю как не делать
Дублирование кода
SavingAccountPage VisaAccountPage
public class SavingAccountPage {
SelenideElement page=$("#address1"),

street=page.$(„#street“),
city=page.$(„#city“),

zipCode=page.$(„#zipCode“)
…

}
public class VisaAccountPage {
SelenideElement page=$("#address2"),

street=page.$(„#street“),
city=page.$(„#city“),

zipCode=page.$(„#zipCode“)
…

}
Дублирование кода
Сopy & Paste безопаснее в Page Object классах,

чем в прочем коде
потому что тестовый код ПОСТОЯННО исполняется
Дублирование кода
опасность при рефакторинге
когда код Page Object простой - его редко нужно
рефакторить
Анти-паттерны: чрезмерное
разделение обязанностей
Разделение локаторов и методов в разные файлы
Выделение констант в properties файлы
Резюме
3 паттерна для написания Page Objects:
Вспомогательные паттерны:
Static
Void
Fluent
public/private доступ
Page Element (Page Blocks)
дублирование кода
Резюме
анти-паттерны для Page Objects:
типизированные объекты
наследование
getter/setter
чрезмерное распределение обязанностей
Резюме
темы, не попавшие в доклад
Возвращение методами сущностей
Паттерн DataTransferObjects
Сохранения состояния
Простая реализация паттерна композиции
Три простые мысли*
В нашем мире не всё, всегда и везде, а кое-что,
иногда и местами. Из любых правил есть
исключения. И при принятии решений нужно
всегда держать голову включенной.
* (с) Дорофеев „Вебинар: Джедайская техника доведения дел до конца“
Три простые мысли*
Сложность порождает проблемы, а простые
вещи зачастую самые действенные.
* (с) Дорофеев „Вебинар: Джедайская техника доведения дел до конца“
Три простые мысли*
Освоен метод или нет становится понятно,
только когда начинаешь его применять. Только
через практику можно освоить написание
хороших тестов.
* (с) Дорофеев „Вебинар: Джедайская техника доведения дел до конца“
Напоследок
Всем позитива!
Photo: Sekhar, India ©
The End.
Questions?
skype: alexejv

email: alexei@vinogradov-it.de
twitter: @vinogradoff
1 of 75

Recommended

Kiss PageObjects [01-2017] by
Kiss PageObjects [01-2017]Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Iakiv Kramarenko
6K views132 slides
Page object with selenide by
Page object with selenidePage object with selenide
Page object with selenideCOMAQA.BY
5.7K views28 slides
QA Fest 2019. Андрей Солнцев. Selenide для профи by
QA Fest 2019. Андрей Солнцев. Selenide для профиQA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профиQAFest
3K views85 slides
Javascript Basic by
Javascript BasicJavascript Basic
Javascript BasicKang-min Liu
1.8K views36 slides
Clean coding-practices by
Clean coding-practicesClean coding-practices
Clean coding-practicesJohn Ferguson Smart Limited
32.8K views62 slides
Fundamental JavaScript [UTC, March 2014] by
Fundamental JavaScript [UTC, March 2014]Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Aaron Gustafson
8.5K views105 slides

More Related Content

What's hot

Jsp/Servlet by
Jsp/ServletJsp/Servlet
Jsp/ServletSunil OS
528K views93 slides
JavaScript Basics by
JavaScript BasicsJavaScript Basics
JavaScript BasicsMats Bryntse
1.6K views18 slides
Webinar: Working with Graph Data in MongoDB by
Webinar: Working with Graph Data in MongoDBWebinar: Working with Graph Data in MongoDB
Webinar: Working with Graph Data in MongoDBMongoDB
29K views73 slides
CSS framework By Palash by
CSS framework By PalashCSS framework By Palash
CSS framework By PalashPalashBajpai
400 views21 slides
Use Node.js to create a REST API by
Use Node.js to create a REST APIUse Node.js to create a REST API
Use Node.js to create a REST APIFabien Vauchelles
2.6K views54 slides
A Deeper look into Javascript Basics by
A Deeper look into Javascript BasicsA Deeper look into Javascript Basics
A Deeper look into Javascript BasicsMindfire Solutions
1.1K views15 slides

What's hot(20)

Jsp/Servlet by Sunil OS
Jsp/ServletJsp/Servlet
Jsp/Servlet
Sunil OS528K views
JavaScript Basics by Mats Bryntse
JavaScript BasicsJavaScript Basics
JavaScript Basics
Mats Bryntse1.6K views
Webinar: Working with Graph Data in MongoDB by MongoDB
Webinar: Working with Graph Data in MongoDBWebinar: Working with Graph Data in MongoDB
Webinar: Working with Graph Data in MongoDB
MongoDB29K views
CSS framework By Palash by PalashBajpai
CSS framework By PalashCSS framework By Palash
CSS framework By Palash
PalashBajpai400 views
Angular - Chapter 4 - Data and Event Handling by WebStackAcademy
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
WebStackAcademy423 views
JavaScript Tutorial by Bui Kiet
JavaScript  TutorialJavaScript  Tutorial
JavaScript Tutorial
Bui Kiet8.1K views
Intro to HTML and CSS basics by Eliran Eliassy
Intro to HTML and CSS basicsIntro to HTML and CSS basics
Intro to HTML and CSS basics
Eliran Eliassy2.3K views
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An... by Doug Jones
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
Doug Jones1.5K views
Automation Abstraction Layers: Page Objects and Beyond by Alan Richardson
Automation Abstraction Layers: Page Objects and BeyondAutomation Abstraction Layers: Page Objects and Beyond
Automation Abstraction Layers: Page Objects and Beyond
Alan Richardson67.3K views
Your code sucks, let's fix it by Rafael Dohms
Your code sucks, let's fix itYour code sucks, let's fix it
Your code sucks, let's fix it
Rafael Dohms36.3K views
Pipeline oriented programming by Scott Wlaschin
Pipeline oriented programmingPipeline oriented programming
Pipeline oriented programming
Scott Wlaschin8.3K views
JDBC by Sunil OS
JDBCJDBC
JDBC
Sunil OS458.2K views
NestJS by Wilson Su
NestJSNestJS
NestJS
Wilson Su1.3K views

Similar to QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe

SECON'2016. Иовлев Роман, JDI is UI Automation Future by
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON
569 views28 slides
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG by
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
1.3K views27 slides
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев. by
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.TKConf
175 views48 slides
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо... by
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
5.2K views35 slides
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1) by
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
51.1K views40 slides
Let’s talk about Atlas by
Let’s talk about AtlasLet’s talk about Atlas
Let’s talk about AtlasArtem Sokovets
642 views94 slides

Similar to QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe(20)

SECON'2016. Иовлев Роман, JDI is UI Automation Future by SECON
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON569 views
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG by Andrey Rebrov
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
Andrey Rebrov1.3K views
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев. by TKConf
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TKConf175 views
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо... by Andrey Rebrov
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov5.2K views
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1) by ZFConf Conference
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference51.1K views
MyBatis на практике by Vitebsk Miniq
MyBatis на практикеMyBatis на практике
MyBatis на практике
Vitebsk Miniq1.1K views
Руководство по приготовлению бутербродов из Selenium by Uladzimir Kryvenka
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из Selenium
Uladzimir Kryvenka2.2K views
Mobile automation uamobile by UA Mobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile2.8K views
automation is iOS development by Ivan Trifonov
automation is iOS developmentautomation is iOS development
automation is iOS development
Ivan Trifonov488 views
iOS and Android Mobile Test Automation by Andrii Dzynia
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia3.5K views
ненавязчивый Java Script алексей сергеев by Media Gorod
ненавязчивый Java Script   алексей сергеевненавязчивый Java Script   алексей сергеев
ненавязчивый Java Script алексей сергеев
Media Gorod308 views

More from QAFest

QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин by
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQAFest
979 views44 slides
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future by
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQAFest
931 views44 slides
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe... by
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QAFest
322 views131 slides
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и... by
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QAFest
336 views92 slides
QA Fest 2019. Никита Галкин. Как зарабатывать больше by
QA Fest 2019. Никита Галкин. Как зарабатывать большеQA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать большеQAFest
389 views40 slides
QA Fest 2019. Сергей Пирогов. Why everything is spoiled by
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQAFest
342 views33 slides

More from QAFest(20)

QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин by QAFest
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QAFest979 views
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future by QAFest
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QAFest931 views
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe... by QAFest
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QAFest322 views
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и... by QAFest
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QAFest336 views
QA Fest 2019. Никита Галкин. Как зарабатывать больше by QAFest
QA Fest 2019. Никита Галкин. Как зарабатывать большеQA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать больше
QAFest389 views
QA Fest 2019. Сергей Пирогов. Why everything is spoiled by QAFest
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiled
QAFest342 views
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием by QAFest
QA Fest 2019. Сергей Новик. Между мотивацией и выгораниемQA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QAFest249 views
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н... by QAFest
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QAFest338 views
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV... by QAFest
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QAFest227 views
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster by QAFest
QA Fest 2019. Иван Крутов. Bulletproof Selenium ClusterQA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QAFest282 views
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе... by QAFest
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QAFest251 views
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз... by QAFest
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QAFest301 views
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation by QAFest
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automationQA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QAFest225 views
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в... by QAFest
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QAFest243 views
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa... by QAFest
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QAFest376 views
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT by QAFest
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях ITQA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QAFest209 views
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении by QAFest
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложенииQA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QAFest607 views
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр... by QAFest
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QAFest321 views
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр... by QAFest
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QAFest296 views
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22 by QAFest
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QAFest164 views

QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe