diff --git a/libraries/chromedriver b/libraries/chromedriver
new file mode 100755
index 0000000000..9ccb03049b
Binary files /dev/null and b/libraries/chromedriver differ
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 56c94e013e..a8a30b855e 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -26,6 +26,15 @@
true
+
+ maven-failsafe-plugin
+ 2.20
+
+
+ chromedriver
+
+
+
net.serenity-bdd.maven.plugins
serenity-maven-plugin
@@ -243,6 +252,18 @@
${serenity.version}
test
+
+ net.serenity-bdd
+ serenity-screenplay
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-screenplay-webdriver
+ ${serenity.version}
+ test
+
io.rest-assured
spring-mock-mvc
@@ -306,7 +327,7 @@
2.5
1.2.0
2.8.5
- 1.4.0
+ 1.4.1-rc.3
1.24.0
1.1.3-rc.5
1.4.0
diff --git a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java
new file mode 100644
index 0000000000..5fcd1bd458
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.serenity;
+
+import net.serenitybdd.junit.runners.SerenityRunner;
+import net.thucydides.core.annotations.Managed;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
+import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated;
+
+/**
+ * @author aiet
+ */
+@RunWith(SerenityRunner.class)
+public class GoogleSearchLiveTest {
+
+ @Managed(driver = "chrome") private WebDriver browser;
+
+ @Test
+ public void whenGoogleBaeldungThenShouldSeeEugen() {
+ browser.get("https://www.google.com/ncr");
+
+ browser
+ .findElement(By.name("q"))
+ .sendKeys("baeldung", Keys.ENTER);
+
+ new WebDriverWait(browser, 5).until(visibilityOfElementLocated(By.cssSelector("._ksh")));
+
+ assertThat(browser
+ .findElement(By.cssSelector("._ksh"))
+ .getText(), containsString("Eugen (Baeldung)"));
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java
new file mode 100644
index 0000000000..1018281687
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.serenity;
+
+import com.baeldung.serenity.pageobjects.GoogleSearchPageObject;
+import net.serenitybdd.junit.runners.SerenityRunner;
+import net.thucydides.core.annotations.Managed;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * @author aiet
+ */
+@RunWith(SerenityRunner.class)
+public class GoogleSearchPageObjectLiveTest {
+
+ @Managed(driver = "chrome") private WebDriver browser;
+
+ GoogleSearchPageObject googleSearch;
+
+ @Test
+ public void whenGoogleBaeldungThenShouldSeeEugen() {
+ googleSearch.open();
+
+ googleSearch.searchFor("baeldung");
+
+ googleSearch.resultMatches("Eugen (Baeldung)");
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchScreenplayLiveTest.java b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchScreenplayLiveTest.java
new file mode 100644
index 0000000000..e07c82943c
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchScreenplayLiveTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.serenity;
+
+import com.baeldung.serenity.screenplay.GoogleSearchResults;
+import com.baeldung.serenity.screenplay.SearchForKeyword;
+import com.baeldung.serenity.screenplay.StartWith;
+import net.serenitybdd.junit.runners.SerenityRunner;
+import net.serenitybdd.screenplay.Actor;
+import net.serenitybdd.screenplay.abilities.BrowseTheWeb;
+import net.thucydides.core.annotations.Managed;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openqa.selenium.WebDriver;
+
+import static net.serenitybdd.screenplay.GivenWhenThen.*;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
+
+/**
+ * Unit test for simple App.
+ */
+@RunWith(SerenityRunner.class)
+public class GoogleSearchScreenplayLiveTest {
+
+ @Managed(driver = "chrome") WebDriver browser;
+
+ Actor kitty = Actor.named("kitty");
+
+ @Before
+ public void setup() {
+ kitty.can(BrowseTheWeb.with(browser));
+ }
+
+ @Test
+ public void whenGoogleBaeldungThenShouldSeeEugen() {
+ givenThat(kitty).wasAbleTo(StartWith.googleSearchPage());
+
+ when(kitty).attemptsTo(SearchForKeyword.of("baeldung"));
+
+ then(kitty).should(seeThat(GoogleSearchResults.displayed(), hasItem(containsString("Eugen (Baeldung)"))));
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java b/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java
new file mode 100644
index 0000000000..72569d86b5
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java
@@ -0,0 +1,34 @@
+package com.baeldung.serenity.pageobjects;
+
+import net.thucydides.core.annotations.DefaultUrl;
+import net.thucydides.core.pages.PageObject;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * @author aiet
+ */
+@DefaultUrl("https://www.google.com/ncr")
+public class GoogleSearchPageObject extends PageObject {
+
+ @FindBy(name = "q") private WebElement search;
+
+ @FindBy(css = "._ksh") private WebElement result;
+
+ public void searchFor(String keyword) {
+ search.sendKeys(keyword, Keys.ENTER);
+ }
+
+ public void resultMatches(String expected) {
+ withTimeoutOf(5, SECONDS)
+ .waitFor(result)
+ .waitUntilVisible();
+ assertThat(result.getText(), containsString(expected));
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java
new file mode 100644
index 0000000000..0573e52ca4
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java
@@ -0,0 +1,21 @@
+package com.baeldung.serenity.screenplay;
+
+import net.serenitybdd.core.pages.PageObject;
+import net.serenitybdd.screenplay.targets.Target;
+import net.thucydides.core.annotations.DefaultUrl;
+
+/**
+ * @author baoqiang
+ */
+@DefaultUrl("https://www.google.com/ncr")
+public class GoogleSearchPage extends PageObject {
+
+ public static final Target SEARCH_RESULT_TITLES = Target
+ .the("search results")
+ .locatedBy("._ksh");
+
+ public static final Target SEARCH_INPUT_BOX = Target
+ .the("search input box")
+ .locatedBy("#lst-ib");
+
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java
new file mode 100644
index 0000000000..1cbcb22166
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java
@@ -0,0 +1,24 @@
+package com.baeldung.serenity.screenplay;
+
+import net.serenitybdd.screenplay.Actor;
+import net.serenitybdd.screenplay.Question;
+import net.serenitybdd.screenplay.questions.Text;
+
+import java.util.List;
+
+/**
+ * @author baoqiang
+ */
+public class GoogleSearchResults implements Question> {
+
+ public static Question> displayed() {
+ return new GoogleSearchResults();
+ }
+
+ public List answeredBy(Actor actor) {
+ return Text
+ .of(GoogleSearchPage.SEARCH_RESULT_TITLES)
+ .viewedBy(actor)
+ .asList();
+ }
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java
new file mode 100644
index 0000000000..2783f14e51
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java
@@ -0,0 +1,35 @@
+package com.baeldung.serenity.screenplay;
+
+import net.serenitybdd.core.steps.Instrumented;
+import net.serenitybdd.screenplay.Actor;
+import net.serenitybdd.screenplay.Task;
+import net.serenitybdd.screenplay.actions.Enter;
+import net.thucydides.core.annotations.Step;
+import org.openqa.selenium.Keys;
+
+/**
+ * @author baoqiang
+ */
+public class SearchForKeyword implements Task {
+
+ @Step("{0} searches for '#keyword'")
+ public void performAs(T actor) {
+ actor.attemptsTo(Enter
+ .theValue(keyword)
+ .into(GoogleSearchPage.SEARCH_INPUT_BOX)
+ .thenHit(Keys.RETURN));
+ }
+
+ private String keyword;
+
+ public SearchForKeyword(String keyword) {
+ this.keyword = keyword;
+ }
+
+ public static Task of(String keyword) {
+ return Instrumented
+ .instanceOf(SearchForKeyword.class)
+ .withProperties(keyword);
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java
new file mode 100644
index 0000000000..ae9de5d798
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java
@@ -0,0 +1,28 @@
+package com.baeldung.serenity.screenplay;
+
+import net.serenitybdd.screenplay.Actor;
+import net.serenitybdd.screenplay.Task;
+import net.serenitybdd.screenplay.actions.Open;
+import net.thucydides.core.annotations.Step;
+
+import static net.serenitybdd.screenplay.Tasks.instrumented;
+
+/**
+ * @author baoqiang
+ */
+public class StartWith implements Task {
+
+ public static StartWith googleSearchPage() {
+ return instrumented(StartWith.class);
+ }
+
+ private GoogleSearchPage googleSearchPage;
+
+ @Step("{0} starts a google search")
+ public void performAs(T t) {
+ t.attemptsTo(Open
+ .browserOn()
+ .the(googleSearchPage));
+ }
+
+}