SlideShare a Scribd company logo
1 of 32
public class LoginPage
{
private By username = By.Id("username"); [...]
public void SetUsername(string username) { [...] }
public HomePage Login(string username, string password) { [...] }
}
SchedulerPage.java
(243 LOC)
ACTOR
ABILITIES INTERACTIONS
TASKS
QUESTIONS
ELEMENTS SCREENon aperforms
enable
has
made up
of
public void UserIsAbleToFilterTheList( )
{
Actor james = Actor.Named("James");
james.Can(BrowseTheWeb.With(ChromeBrowser));
james.AttemptsTo(
Start.WithAnEmptyToDoList( ),
AddATodoItem.Called("Buy some milk"),
FilterItems.ToShow("Active")
);
james.Should(seeThat(TheItems.Displayed( ), contains(("Buy some milk")));
}
ACTOR
ABILITIES INTERACTIONS
TASKS
QUESTIONS
ELEMENTS SCREENon aperforms
enable
has
made up
of
Actor monica = Actor.Named("Monica"); // Monica, Moderator
Actor adam = Actor.Named("Adam"); // Adam, Administrator
Adam ≠ I
public class Actor
{
public static Actor Named(string name) { [...] }
public Actor Can(IAbility doSomething) { [...] }
public ABILITY AbilityTo<ABILITY>( ) { [...] }
public void AttemptsTo(params IPerformable[ ] tasks) { [...] }
}
ACTOR
ABILITIES INTERACTIONS
TASKS
QUESTIONS
ELEMENTS SCREENon aperforms
enable
has
made up
of
public class BrowseTheWeb : IAbility
{
private IWebDriver driver;
public static BrowseTheWeb With(Browser browser)
{
return new BrowseTheWeb(browser);
}
public IWebDriver Driver => driver;
}
ACTOR
ABILITIES INTERACTIONS
TASKS
QUESTIONS
ELEMENTS SCREENon aperforms
enable
has
made up
of
Task
IPerformable
Interaction
public interface IPerformable
{
void PerformAs(Actor actor);
}
Goal • Why?
Tasks • What?
Interactions
• How
?
Scenario: Adding an item to an empty list
Given that James has an empty todo list
When he adds 'Buy some milk' to his list
Then 'Buy some milk' should be recorded in his list
public void adds_Buy_some_milk_to_his_list(string item)
{
actor.AttemptsTo(AddATodoItem.Called(item));
}
public class AddATodoItem : Task
{
private string thingToDo;
public static AddATodoItem Called(string thingToDo)
{
return new AddATodoItem(thingToDo);
}
public void PerformAs(Actor actor)
{
actor.AttemptsTo(Enter.TheValue(thingToDo).Into(WHAT_NEEDS_TO_BE_DONE));
}
}
public class Enter
{
private string theText;
public static Enter TheValue(string text)
{
return new Enter(text);
}
public EnterValue Into(By by)
{
return new EnterValue(theText, by);
}
}
public class EnterValue : Interaction
{
private string theText;
private By by;
public void PerformAs(Actor actor)
{
var driver = actor.AbilityTo<BrowseTheWeb>( ).Driver;
driver.FindElement(by).SendKeys(theText);
}
}
public void AttemptsTo(params IPerformable[ ] tasks)
{
foreach(IPerformable task in tasks)
{
task.PerformAs(this);
}
}
ACTOR
ABILITIES INTERACTIONS
TASKS
QUESTIONS
ELEMENTS SCREENon aperforms
enable
has
made up
of
public interface IQuestion<ANSWER>
{
ANSWER AnsweredBy(Actor actor);
}
public class Selected : Question<string>
{
public static Selected Filter( ) { return new Selected( ); }
public string AnsweredBy(Actor actor) { […] }
}
public class Actor
{
public ANSWER AsksFor<ANSWER>(IQuestion<ANSWER> question)
{
return question.AnsweredBy(this);
}
}
string filter = actor.AsksFor(Selected.Filter( ));
ACTOR
ABILITIES INTERACTIONS
TASKS
QUESTIONS
ELEMENTS SCREENon aperforms
enable
has
made up
of
public class TodoList
{
public static By WHAT_NEEDS_TO_BE_DONE = By.CssSelector("#new-todo");
public static By CLEAR_COMPLETED = By.CssSelector("#clear-completed");
}
public void UserIsAbleToFilterTheList( )
{
Actor james = Actor.Named("James");
james.Can(BrowseTheWeb.With(ChromeBrowser));
james.AttemptsTo(
Start.WithAnEmptyToDoList( ),
AddATodoItem.Called("Buy some milk"),
FilterItems.ToShow("Active")
);
james.Should(seeThat(TheItems.Displayed( ), contains(("Buy some milk")));
}
 Beyond Page Objects: Next Generation Test Automation with
Serenity and the Screenplay Pattern
(https://www.infoq.com/articles/Beyond-Page-Objects-Test-Automation-Serenity-Screenplay)
 Serenity/JS
(http://serenity-js.org/)
 Serenity BDD
(https://github.com/serenity-bdd)
www.future-processing.pl

More Related Content

What's hot

Javascript And J Query
Javascript And J QueryJavascript And J Query
Javascript And J Queryitsarsalan
 
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏Masahiro Akita
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownpartsBastian Feder
 
Swift에서 꼬리재귀 사용기 (Tail Recursion)
Swift에서 꼬리재귀 사용기 (Tail Recursion)Swift에서 꼬리재귀 사용기 (Tail Recursion)
Swift에서 꼬리재귀 사용기 (Tail Recursion)진성 오
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretssmueller_sandsmedia
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreNicolas Carlo
 
Windows power shell and active directory
Windows power shell and active directoryWindows power shell and active directory
Windows power shell and active directoryDan Morrill
 
The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)Aaron Gustafson
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendSven Efftinge
 
Funcitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayFuncitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayNatasha Murashev
 
Madrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovyMadrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovyIván López Martín
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드Taeho Kim
 
Object-oriented Javascript
Object-oriented JavascriptObject-oriented Javascript
Object-oriented JavascriptDaniel Ku
 
Kotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great AgainKotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great AgainTaeho Kim
 

What's hot (18)

Javascript And J Query
Javascript And J QueryJavascript And J Query
Javascript And J Query
 
Jquery Fundamentals
Jquery FundamentalsJquery Fundamentals
Jquery Fundamentals
 
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
Swift에서 꼬리재귀 사용기 (Tail Recursion)
Swift에서 꼬리재귀 사용기 (Tail Recursion)Swift에서 꼬리재귀 사용기 (Tail Recursion)
Swift에서 꼬리재귀 사용기 (Tail Recursion)
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscore
 
Windows power shell and active directory
Windows power shell and active directoryWindows power shell and active directory
Windows power shell and active directory
 
Making a simple jQuery plug-in
Making a simple jQuery plug-inMaking a simple jQuery plug-in
Making a simple jQuery plug-in
 
The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with Xtend
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
 
Funcitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayFuncitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional Way
 
Madrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovyMadrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovy
 
JQuery
JQueryJQuery
JQuery
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
 
Object-oriented Javascript
Object-oriented JavascriptObject-oriented Javascript
Object-oriented Javascript
 
Kotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great AgainKotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great Again
 

Viewers also liked

[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?
[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?
[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?Future Processing
 
[QE 2017] Michał Buczko - DevTest Pairing w DevOps
[QE 2017] Michał Buczko - DevTest Pairing w DevOps[QE 2017] Michał Buczko - DevTest Pairing w DevOps
[QE 2017] Michał Buczko - DevTest Pairing w DevOpsFuture Processing
 
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...Future Processing
 
[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...
[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...
[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...Future Processing
 
[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...
[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...
[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...Future Processing
 
[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...
[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...
[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...Future Processing
 
[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...
[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...
[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...Future Processing
 
[QE 2017] Daniel Pokusa - Architektura, która ewoluuje
[QE 2017] Daniel Pokusa - Architektura, która ewoluuje[QE 2017] Daniel Pokusa - Architektura, która ewoluuje
[QE 2017] Daniel Pokusa - Architektura, która ewoluujeFuture Processing
 
[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...
[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...
[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...Future Processing
 
[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwa
[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwa[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwa
[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwaFuture Processing
 
[QE 2017] Michał Stryjak - Startupowy chleb powszedni
[QE 2017] Michał Stryjak - Startupowy chleb powszedni[QE 2017] Michał Stryjak - Startupowy chleb powszedni
[QE 2017] Michał Stryjak - Startupowy chleb powszedniFuture Processing
 
[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOps
[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOps[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOps
[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOpsFuture Processing
 
[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotem
[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotem[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotem
[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotemFuture Processing
 
[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...
[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...
[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...Future Processing
 
Identifying and Managing Technical Debt
Identifying and Managing Technical DebtIdentifying and Managing Technical Debt
Identifying and Managing Technical Debtzazworka
 

Viewers also liked (15)

[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?
[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?
[Quality Meetup#12] W. Gawroński - Dlaczego docker@localhost to nie DevOps?
 
[QE 2017] Michał Buczko - DevTest Pairing w DevOps
[QE 2017] Michał Buczko - DevTest Pairing w DevOps[QE 2017] Michał Buczko - DevTest Pairing w DevOps
[QE 2017] Michał Buczko - DevTest Pairing w DevOps
 
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
[QE 2017] Adrian Gonciarz - Tester w Kontenerze, czyli jak Docker może pomóc ...
 
[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...
[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...
[QE 2017] Joanna Jeziorska - Szybki i wściekły czy skrupulatny i opanowany — ...
 
[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...
[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...
[Quality Meetup#12] P. Podsiadlik, R. Peroń - Testy regresji z perspektywy pi...
 
[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...
[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...
[QE 2017] Piotr Marczydło - Wdrażanie na wulkanie, czyli CI w świecie, który ...
 
[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...
[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...
[QE 2017] Monika Januszek, Michał Drzewiecki, Tomasz Lepiorz - Agile'owi pogr...
 
[QE 2017] Daniel Pokusa - Architektura, która ewoluuje
[QE 2017] Daniel Pokusa - Architektura, która ewoluuje[QE 2017] Daniel Pokusa - Architektura, która ewoluuje
[QE 2017] Daniel Pokusa - Architektura, która ewoluuje
 
[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...
[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...
[Quality Meetup #13] Piotr Marczydło - Gdy testy to za mało – Continuous Moni...
 
[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwa
[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwa[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwa
[QE 2017] Grzegorz Galezowski - Prostota nie jest łatwa
 
[QE 2017] Michał Stryjak - Startupowy chleb powszedni
[QE 2017] Michał Stryjak - Startupowy chleb powszedni[QE 2017] Michał Stryjak - Startupowy chleb powszedni
[QE 2017] Michał Stryjak - Startupowy chleb powszedni
 
[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOps
[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOps[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOps
[QE 2017] Dawid Pacia, Tomasz Janiszewski - SQA w erze TestOps
 
[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotem
[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotem[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotem
[QE 2017] Zbigniew Moćkun - Metryki i raporty jakościowe, czyli tam i z powrotem
 
[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...
[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...
[QE 2017] Arnika Hryszko - Błędy znalezione przypadkiem - o znaczeniu testów ...
 
Identifying and Managing Technical Debt
Identifying and Managing Technical DebtIdentifying and Managing Technical Debt
Identifying and Managing Technical Debt
 

Similar to [QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji

Future of UI Automation testing and JDI
Future of UI Automation testing and JDIFuture of UI Automation testing and JDI
Future of UI Automation testing and JDICOMAQA.BY
 
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin WayTDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Waytdc-globalcode
 
Desarrollo para Android con Groovy
Desarrollo para Android con GroovyDesarrollo para Android con Groovy
Desarrollo para Android con GroovySoftware Guru
 
Multimethods
MultimethodsMultimethods
MultimethodsAman King
 
Build Lightweight Web Module
Build Lightweight Web ModuleBuild Lightweight Web Module
Build Lightweight Web ModuleMorgan Cheng
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Ryosuke Uchitate
 
Having a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfHaving a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfNicholasflqStewartl
 
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...CodeFest
 
Link.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docxLink.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docxSHIVA101531
 
HtmlElements – естественное расширение PageObject
HtmlElements – естественное расширение PageObjectHtmlElements – естественное расширение PageObject
HtmlElements – естественное расширение PageObjectSQALab
 
Intro programacion funcional
Intro programacion funcionalIntro programacion funcional
Intro programacion funcionalNSCoder Mexico
 
つくってあそぼ Kotlin DSL ~拡張編~
つくってあそぼ Kotlin DSL ~拡張編~つくってあそぼ Kotlin DSL ~拡張編~
つくってあそぼ Kotlin DSL ~拡張編~kamedon39
 
Тарас Олексин - Sculpt! Your! Tests!
Тарас Олексин  - Sculpt! Your! Tests!Тарас Олексин  - Sculpt! Your! Tests!
Тарас Олексин - Sculpt! Your! Tests!DataArt
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design PatternsGodfrey Nolan
 
3. Section 3 � Complete functionality on listing screen (1.5 marks.pdf
3. Section 3 � Complete functionality on listing screen (1.5 marks.pdf3. Section 3 � Complete functionality on listing screen (1.5 marks.pdf
3. Section 3 � Complete functionality on listing screen (1.5 marks.pdfalliedscorporation
 
Important java programs(collection+file)
Important java programs(collection+file)Important java programs(collection+file)
Important java programs(collection+file)Alok Kumar
 
Roman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium campRoman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium campРоман Иовлев
 
VISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEVISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEDarwin Durand
 
Роман Иовлев «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
 
jQuery - Introdução
jQuery - IntroduçãojQuery - Introdução
jQuery - IntroduçãoGustavo Dutra
 

Similar to [QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji (20)

Future of UI Automation testing and JDI
Future of UI Automation testing and JDIFuture of UI Automation testing and JDI
Future of UI Automation testing and JDI
 
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin WayTDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
 
Desarrollo para Android con Groovy
Desarrollo para Android con GroovyDesarrollo para Android con Groovy
Desarrollo para Android con Groovy
 
Multimethods
MultimethodsMultimethods
Multimethods
 
Build Lightweight Web Module
Build Lightweight Web ModuleBuild Lightweight Web Module
Build Lightweight Web Module
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
Having a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdfHaving a problem figuring out where my errors are- The code is not run.pdf
Having a problem figuring out where my errors are- The code is not run.pdf
 
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодей...
 
Link.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docxLink.javaLink.javapackage com.bookstore.domain.model;import .docx
Link.javaLink.javapackage com.bookstore.domain.model;import .docx
 
HtmlElements – естественное расширение PageObject
HtmlElements – естественное расширение PageObjectHtmlElements – естественное расширение PageObject
HtmlElements – естественное расширение PageObject
 
Intro programacion funcional
Intro programacion funcionalIntro programacion funcional
Intro programacion funcional
 
つくってあそぼ Kotlin DSL ~拡張編~
つくってあそぼ Kotlin DSL ~拡張編~つくってあそぼ Kotlin DSL ~拡張編~
つくってあそぼ Kotlin DSL ~拡張編~
 
Тарас Олексин - Sculpt! Your! Tests!
Тарас Олексин  - Sculpt! Your! Tests!Тарас Олексин  - Sculpt! Your! Tests!
Тарас Олексин - Sculpt! Your! Tests!
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
3. Section 3 � Complete functionality on listing screen (1.5 marks.pdf
3. Section 3 � Complete functionality on listing screen (1.5 marks.pdf3. Section 3 � Complete functionality on listing screen (1.5 marks.pdf
3. Section 3 � Complete functionality on listing screen (1.5 marks.pdf
 
Important java programs(collection+file)
Important java programs(collection+file)Important java programs(collection+file)
Important java programs(collection+file)
 
Roman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium campRoman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium camp
 
VISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLEVISUALIZAR REGISTROS EN UN JTABLE
VISUALIZAR REGISTROS EN UN JTABLE
 
Роман Иовлев «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#»
 
jQuery - Introdução
jQuery - IntroduçãojQuery - Introdução
jQuery - Introdução
 

More from Future Processing

DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfDPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfFuture Processing
 
DPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfDPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfFuture Processing
 
DPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfDPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfFuture Processing
 
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurzeFuture Processing
 
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shakeFuture Processing
 
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myśleniaFuture Processing
 
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletkaFuture Processing
 
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...Future Processing
 
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...Future Processing
 
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny BlockchainFuture Processing
 
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈XFuture Processing
 
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...Future Processing
 
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...Future Processing
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NETFuture Processing
 
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...Future Processing
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...Future Processing
 
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark ApplicationsFuture Processing
 
[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test AutomationFuture Processing
 
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software TesterFuture Processing
 
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOpsFuture Processing
 

More from Future Processing (20)

DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdfDPTO_Inżynieria oprogramowania to proces uczenia się.pdf
DPTO_Inżynieria oprogramowania to proces uczenia się.pdf
 
DPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdfDPTO_QA w świecie wartości biznesowych.pdf
DPTO_QA w świecie wartości biznesowych.pdf
 
DPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdfDPTO_Hello_Clean_Architekture.pdf
DPTO_Hello_Clean_Architekture.pdf
 
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
[Quality Meetup #20] Michał Górski - Continuous Deployment w chmurze
 
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
[Quality Meetup #20] Dorota Tadych - Hyperion - wystarczy jeden shake
 
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
[Quality Meetup #19] Magdalena Drechsler-Nowak - Tester w pułapce myślenia
 
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
[Quality Meetup #19] Adrian Gonciarz - Testerska ruletka
 
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
[FDD 2018] Krzysztof Sikora - Jak Service Fabric rozwiąże twoje problemy z mi...
 
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
[FDD 2018] Ł. Turchan, A. Hulist, M. Duchnowski - CUDA - results over coffee ...
 
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain[FDD 2018] Lech Kalinowski - Prywatny Blockchain
[FDD 2018] Lech Kalinowski - Prywatny Blockchain
 
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
[FDD 2018] W. Malara, K. Kotowski - Autoenkodery – czyli zalety funkcji F(X)≈X
 
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
[FDD 2018] Jarosław Ogiegło - Ludzie, zabezpieczajcie się! Wprowadzenie do OA...
 
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
[JuraSIC! Meetup] Krzysztof Sikora- Jak Service Fabric rozwiąże twoje problem...
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
 
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
[QE 2018] Aleksandra Kornecka – Kognitywne podejście do testowania aplikacji ...
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
 
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
[QE 2018] Łukasz Gawron – Testing Batch and Streaming Spark Applications
 
[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation[QE 2018] Marek Puchalski – Web Application Security Test Automation
[QE 2018] Marek Puchalski – Web Application Security Test Automation
 
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester[QE 2018] Rob Lambert – How to Thrive as a Software Tester
[QE 2018] Rob Lambert – How to Thrive as a Software Tester
 
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
[QE 2018] Paul Gerrard – Automating Assurance: Tools, Collaboration and DevOps
 

Recently uploaded

What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesVictoriaMetrics
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxRTS corp
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonApplitools
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...Bert Jan Schrijver
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shardsChristopher Curtin
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogueitservices996
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITmanoharjgpsolutions
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingShane Coughlan
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesKrzysztofKkol1
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 

Recently uploaded (20)

What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 Updates
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogue
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh IT
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 

[QE 2017] Tomasz Kras - SOLIDne Page Objecty — Screenplay Pattern w akcji

Editor's Notes

  1. Zdanie opisujące obiekty występujące w frameworku i zależności zachodzące między nimi. Poszczególne elementy omówimy szczegółowo w dalszej części prelekcji.
  2. Page Object Model pojawił się w 2011 jako propozycja rozwiązania problemów z mało czytelnymi i niestabilnymi testami pisanymi z wykorzystaniem Selenium. Dzięki przedstawieniu interfejsu użytkownika jako zbioru klas udostępniających metody służące do nawigowania pomiędzy elementami systemu, testy takie łatwiej pisać i utrzymywać. Główne odpowiedzialności, które wypełnia każdy Page Object to: dostarczenie informacji na temat lokalizowania elementów na stronie wykonywanie akcji na tych elementach i pozyskiwanie informacji na ich temat nawigacja pomiędzy stronami Oprócz wymienionych odpowiedzialności, Page Objecty mogą też przechowywać instancję WebDrivera, wspomagać generowanie danych testowych itd. Przedstawiona klasa jest bardzo prosta – reprezentuje stronę logowania z kilkoma kontrolkami, dlatego jej implementacja zamknie się w kilkunastu liniach kodu.
  3. Problem pojawia się w bardziej złożonych przypadkach, gdy na jednej stronie musimy obsłużyć kilkanaście, lub nawet kilkadziesiąt kontrolek. Tak duże klasy mają tendencję do powiększania się z czasem – skoro i tak robi już wszystko, to jedna metoda więcej nie zaszkodzi. Z tego powodu stają się bardzo trudne w utrzymaniu. Zgodnie z zasadami SOLID, klasa powinna mieć tylko jedną odpowiedzialność i powinna być zamknięta na modyfikacje. W przypadku klasycznych Page Objectów obie te zasady są łamane
  4. W jaki sposób można więc podejść do projektowania solucji testów automatycznych zgodnie z dobrymi praktykami pisania kodu? Jednym z rozwiązań jest Screenplay pattern, a widoczny diagram jest ilustracją zdania, które pokazywałem wcześniej. Aktor, korzystając ze swoich umiejętności, wykonuje zadania i zadaje pytania o stan systemu, w celu osiągnięcia celów biznesowych.
  5. Zanim przejdziemy do omawiania poszczególnych klas i interfejsów, zobaczmy jak mógłby wyglądać przykładowy test, napisany z wykorzystaniem wzorca Screenplay. Testy opisują jak użytkownik powinien oddziaływać na system, żeby osiągnąć zadany cel. Ważną cechą tego kodu jest jego duża czytelność – autorzy bardzo duży nacisk kładą na rezygnację z używania składni języka np. słowa kluczowego ‚new’. W związku z tym inicjalizacja obiektów będzie się odbywała w metodach statycznych klas. Analizując powyższy przykład, napisany metodą Arrange/Act/Assert: -tworzymy aktora o imieniu James -dajemy aktorowi możliwość korzystania z przeglądarki internetowej -przekazujemy mu listę zadań do wykonania -sprawdzamy czy wykonanie akcji przyniosło oczekiwany rezultat
  6. Tak jak widzieliśmy w przykładowym kodzie – wszystko obraca się wokół aktora, więc omówimy teraz implementację tej klasy w solucji.
  7. Dlaczego potrzebujemy aktorów? Nadawanie imion obiektom wykonującym testy ma zastosowanie praktyczne – dzięki temu możemy generować raporty opisujące ścieżkę, jaką aktor przeszedł w celu weryfikacji danej funkcjonalności – stąd też nazwa wzorca – Screenplay = Scenariusz. Inną kwestią jest zmiana perspektywy, z której komponujemy testy – nie są one pisane z perspektywy pierwszej osoby, tylko w kontekście aktora, któremu możemy nadać jakieś podstawowe cechy (Adam – Administrator).
  8. Żeby zwiększyć czytelność slajdów z klas usunięte są konstruktory i niektóre pola, więc w domyśle znajdują się one gdzieś w środku, ale nie będą obecne w prezentacji. Tak jak wspominałem wcześniej – inicjalizacja obiektu klasy odbywa się z wykorzystaniem metody statycznej, zwracającej obiekt tej klasy – w tym przypadku z przekazanym w parametrach imieniem. Pozwala to na tworzenie aktorów bez jawnego wykorzystania konstruktora w teście, a co za tym idzie – bez użycia słowa kluczowego new. Dwie kolejne linijki odpowiadają za nadawanie i korzystanie z umiejętności, a ostatnia to metoda do której przekazujemy listę zadań do wykonania przez aktora. Jak widać – główną odpowiedzialnością tej klasy będzie wykonywanie zadań, ale zanim o nich – krótko omówimy sobie umiejętności.
  9. Umiejętności pozwalają aktorowi oddziałowywać na system – bez nich aktor nie byłby w stanie wykonać żadnej akcji. Jak może wyglądać przykładowa implementacja?
  10. Sztandarowym przykładem – w końcu opisujemy wzorzec Screenplay w kontekście testów webowych – będzie klasa umożliwiająca aktorowi korzystanie z przeglądarki. Ponownie – obiekt klasy inicjalizujemy metodą statyczną, a jej jedynym zadaniem będzie dostarczenie w odpowiednim momencie instacji Drivera, który wykorzystamy do kontrolowania elementów na stronie. Przy takim podejściu do umiejętności nie muszą one być powiązane z graficznym interfejsem użytkownika – możemy dać aktorowi możliwość korzystania z systemu pliku, kontrolowania bazy danych, odbierania i wysyłania wiadomości itd. Jednym z ciekawszych zastosowań jest implementacja klasy pełniącej rolę notatnika, w której aktorzy mogą przechowywać dowolne informacje.
  11. Zadania i Interakcje różnią się tak naprawdę tylko swoją pozycją w hierarchii klas – zobaczmy jak wygląda implementacja tych interfesjów.
  12. Z punktu widzenia kompilatora, oba te interfejsy są tożsame – wymagą implementacji jednej metody – PerformAs. Metoda ta jako argument przyjmuje obiekt aktora – i to w jego kontekście będzie wykonywane konkretne zadanie, bądź Interakcja.
  13. Skoro Zadania i Interakcje działają na dobrą sprawę tak samo, to po co je rozróżniać? Dobrze zdefiniowane warstwy abstrakcji to jeden z kluczowych czynników w projektowaniu testów automatycznych Odseparowanie celu testu od jego implementacji technicznej – zwiększona czytelność i utrzymywalność Osiągamy to poprzez zastosowanie hierarchicznej analizy zadań: Goal – co użytkownik chce osiągnąć w ujęciu biznesowym Task – co użytkownik musi zrobić, żeby osiągnąć cel – metody opisane językiem biznesowym Interaction – jak użytkownik będzie oddziaływał na system, żeby wypełnić zadanie
  14. W górnej części slajdu znajduje się test BDD napisany w Gherkinie. Celem, który stawiamy przed aktorem jest w tym przypadku tytuł scenariusza – dodanie do pustej listy zadań nowego wpisu. Żeby zobaczyć zadania, które aktor musi wykonać, aby osiągnąć ten cel – zajrzymy do definicji kroku WHEN, gdzie przekazujemy aktorowi polecenie dodania nowego wpisu o podanej w parametrze nazwie.
  15. Klasa AddATodoItem ponownie udostępnia metodę statyczną, dzięki której zwrócimy obiekt tej klasy z przekazaną w parametrze nazwą wpisu. Poza tym, w związku z implementacją interfesju Task, dodana została metoda PerformAs, w której ponownie wykorzystujemy metodę aktora AttemptsTo – tym razem by przekazać mu listę interakcji do wykonania. Skąd wziął się selektor przekazywany jako parametr metody Into? O tym za chwilę, teraz przejdźmy do implementacji klasy Enter
  16. Klasa Enter nie jest jeszcze interakcją – jest ona pewnego rodzaju klasą budującą dla typu EnterValue, do którego przekazuje potrzebne informacje. Tworząc obiekt klasy Enter wywołujemy metodę statyczną TheValue, która ustawi nam tekst, który chcemy wpisać w pole, a następnie – skoro mamy już obiekt tej klasy, możemy wywołać metodę Into, gdzie przekazujemy odpowiedni selektor.
  17. Klasa EnterValue, korzystając z parametrów przekazanych przez klasę Enter wykonuje swoje zadanie na podanym elemencie. Najpierw uzyskujemy od aktora instancję Drivera, a następnie z jego pomocą wywołujemy konkretne akcje z frameworka Selenium.
  18. Tak wygląda implementacja metody AttemptsTo w klasie aktora. Dla każdego Zadania przekazanego do wykonania wywołujemy metodę PerformAs. Jeżeli przypomnimy sobie jak wyglądała implementacja zadania AddATodoItem, to zauważymy że też wykorzystuje ona metodę AttemptsTo, żeby przekazać aktorowi listę Interakcji. Tak więc – dla każdego zadania, zostanie wykonana lista Interakcji, z których jest ono zbudowane, za każdym razem przekazując dalej instancję klasy aktora, w kontekście którego wykonujemy dany test.
  19. Implementacja pytań jest bardzo podobna do konceptu interakcji – w pytaniach jednak nie oddziałowujemy bezpośrednio na elementy i nie zmieniamy ich stanu, tylko odczytujemy z nich pewne informacje.
  20. W celu przetestowania aplikacji będziemy potrzebowali danych różnego typu – łańcuchów znaków, numerów, wartości logicznych W tym celu interfejs pytań implementuje metodę generyczną AnsweredBy. W metodzie tej – podobnie jak z Interakcjami – będziemy na podstawie instancji Drivera uzyskanej od aktora wyszukiwali elementy na stronie i odpytywali o ich stan. Ponownie wykorzystujemy metodę statyczną, żeby zwrócić instancję klasy bez konieczności używania new.
  21. Aktor implementuje metodę generyczną, dzięki czemu możemy uzyskiwać informacje na temat elementów na stronie w naszych testach.
  22. Ostatnim elementem potrzebnym w implementacji jest udostępnienie odpowiedniej strategii umożliwiającej lokalizowanie elementów w testowanym systemie.
  23. Każda strona w naszej aplikacji będzie miała swoją reprezentację w postaci klasy Screen. Statyczne pola klasy dostarczają informację na temat lokalizacji obiektów na stronie. W tym przykładzie zaimplementowaliśmy najprostszy dostępny mechanizm – korzystamy z klasy By frameworka Selenium. Oryginalna implementacja sugeruje użycie dodatkowej klasy, która opakowuje tą klasę i umożliwia dynamiczne tworzenie selektorów np. na podstawie podanego tekstu.
  24. Aktor posiada umiejętności, które pozwalają mu wykonywać zadania w systemie