diff --git a/selenium-junit-testng/README.md b/selenium-junit-testng/README.md
index f34081ccea..cc1b728287 100644
--- a/selenium-junit-testng/README.md
+++ b/selenium-junit-testng/README.md
@@ -1,2 +1,3 @@
### Relevant Articles:
- [Guide to Selenium with JUnit / TestNG](http://www.baeldung.com/java-selenium-with-junit-and-testng)
+- [Testing a Site with Selenium / Webdriver](http://www.baeldung.com)
diff --git a/selenium-junit-testng/chromedriver.exe b/selenium-junit-testng/chromedriver.exe
new file mode 100644
index 0000000000..f6ce07cb32
Binary files /dev/null and b/selenium-junit-testng/chromedriver.exe differ
diff --git a/selenium-junit-testng/chromedriver.linux b/selenium-junit-testng/chromedriver.linux
new file mode 100755
index 0000000000..1fb5667a0b
Binary files /dev/null and b/selenium-junit-testng/chromedriver.linux differ
diff --git a/selenium-junit-testng/chromedriver.mac b/selenium-junit-testng/chromedriver.mac
new file mode 100755
index 0000000000..9ccb03049b
Binary files /dev/null and b/selenium-junit-testng/chromedriver.mac differ
diff --git a/selenium-junit-testng/pom.xml b/selenium-junit-testng/pom.xml
index 5c77e0c9ff..d44a81639c 100644
--- a/selenium-junit-testng/pom.xml
+++ b/selenium-junit-testng/pom.xml
@@ -57,6 +57,11 @@
junit
${junit.version}
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+
diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java b/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java
new file mode 100644
index 0000000000..7fde09d817
--- /dev/null
+++ b/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java
@@ -0,0 +1,60 @@
+package main.java.com.baeldung.selenium.config;
+
+import org.openqa.selenium.Capabilities;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import java.io.File;
+
+public class SeleniumConfig {
+
+ private WebDriver driver;
+
+ public SeleniumConfig() {
+ Capabilities capabilities = DesiredCapabilities.chrome();
+ driver = new ChromeDriver(capabilities);
+ }
+
+ static {
+ if (getOsName("os.name").toLowerCase().contains("mac")) {
+ System.setProperty("webdriver.chrome.driver", findFile("chromedriver.mac"));
+ } else if (getOsName("os.name").toLowerCase().contains("nix") ||
+ getOsName("os.name").toLowerCase().contains("nux") ||
+ getOsName("os.name").toLowerCase().contains("aix")) {
+ System.setProperty("webdriver.chrome.driver", findFile("chromedriver.linux"));
+ } else if (getOsName("os.name").toLowerCase().contains("win")) {
+ System.setProperty("webdriver.chrome.driver", findFile("chromedriver.exe"));
+ }
+ }
+
+ private static String getOsName(String prop) {
+ return (System.getProperty(prop));
+ }
+
+ static private String findFile(String filename) {
+ String paths[] = {"", "bin/", "target/classes"}; // if you have chromedriver somewhere else on the path, then put it here.
+ for (String path : paths) {
+ if (new File(path + filename).exists())
+ return path + filename;
+ }
+ return "";
+ }
+
+ public void close() {
+ driver.quit();
+ }
+
+ public void navigateTo(String url) {
+ driver.navigate().to(url);
+ }
+
+ public void clickElement(WebElement element) {
+ element.click();
+ }
+
+ public WebDriver getDriver() {
+ return driver;
+ }
+}
diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java b/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java
new file mode 100644
index 0000000000..838beb5326
--- /dev/null
+++ b/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java
@@ -0,0 +1,23 @@
+package main.java.com.baeldung.selenium.models;
+
+import main.java.com.baeldung.selenium.config.SeleniumConfig;
+import main.java.com.baeldung.selenium.pages.BaeldungAboutPage;
+import org.openqa.selenium.support.PageFactory;
+
+public class BaeldungAbout {
+
+ private SeleniumConfig config;
+
+ public BaeldungAbout(SeleniumConfig config) {
+ this.config = config;
+ PageFactory.initElements(config.getDriver(), BaeldungAboutPage.class);
+ }
+
+ public void navigateTo() {
+ config.navigateTo("http://www.baeldung.com/about/");
+ }
+
+ public String getPageTitle() {
+ return BaeldungAboutPage.title.getText();
+ }
+}
diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java b/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java
new file mode 100644
index 0000000000..d33cb76398
--- /dev/null
+++ b/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java
@@ -0,0 +1,10 @@
+package main.java.com.baeldung.selenium.pages;
+
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+
+public class BaeldungAboutPage {
+
+ @FindBy(css = ".page-header > h1")
+ public static WebElement title;
+}
diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java b/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java
new file mode 100644
index 0000000000..55a8044375
--- /dev/null
+++ b/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java
@@ -0,0 +1,37 @@
+package main.java.com.baeldung.selenium.pages;
+
+import main.java.com.baeldung.selenium.config.SeleniumConfig;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.PageFactory;
+
+public class BaeldungHomePage {
+
+ private SeleniumConfig config;
+ @FindBy(css=".header--menu > a")
+ private WebElement title;
+ @FindBy(css = ".menu-start-here > a")
+ private WebElement startHere;
+
+ public BaeldungHomePage(SeleniumConfig config) {
+ this.config = config;
+ PageFactory.initElements(this.config.getDriver(), this);
+ }
+
+ public void navigate() {
+ this.config.navigateTo("http://www.baeldung.com/");
+ }
+
+ public String getPageTitle() {
+ return title.getAttribute("title");
+ }
+
+ public StartHerePage clickOnStartHere() {
+ config.clickElement(startHere);
+
+ StartHerePage startHerePage = new StartHerePage(config);
+ PageFactory.initElements(config.getDriver(), startHerePage);
+
+ return startHerePage;
+ }
+}
diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java b/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java
new file mode 100644
index 0000000000..4f0ee9edcd
--- /dev/null
+++ b/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java
@@ -0,0 +1,21 @@
+package main.java.com.baeldung.selenium.pages;
+
+import main.java.com.baeldung.selenium.config.SeleniumConfig;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+
+public class StartHerePage {
+
+ private SeleniumConfig config;
+
+ @FindBy(css = ".page-title")
+ private WebElement title;
+
+ public StartHerePage(SeleniumConfig config) {
+ this.config = config;
+ }
+
+ public String getPageTitle() {
+ return title.getText();
+ }
+}
diff --git a/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectTest.java b/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectTest.java
new file mode 100644
index 0000000000..f47110f86e
--- /dev/null
+++ b/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectTest.java
@@ -0,0 +1,50 @@
+package test.java.com.baeldung.selenium.junit;
+
+import main.java.com.baeldung.selenium.config.SeleniumConfig;
+import main.java.com.baeldung.selenium.models.BaeldungAbout;
+import main.java.com.baeldung.selenium.pages.BaeldungHomePage;
+import main.java.com.baeldung.selenium.pages.StartHerePage;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+public class SeleniumPageObjectTest {
+
+ private SeleniumConfig config;
+ private BaeldungHomePage homePage;
+ private BaeldungAbout about;
+
+ @Before
+ public void setUp() {
+ config = new SeleniumConfig();
+ homePage = new BaeldungHomePage(config);
+ about = new BaeldungAbout(config);
+ }
+
+ @After
+ public void teardown() {
+ config.close();
+ }
+
+ @Test
+ public void givenHomePage_whenNavigate_thenTitleMatch() {
+ homePage.navigate();
+ assertThat(homePage.getPageTitle(), is("Baeldung"));
+ }
+
+ @Test
+ public void givenHomePage_whenNavigate_thenShouldBeInStartHere() {
+ homePage.navigate();
+ StartHerePage startHerePage = homePage.clickOnStartHere();
+ assertThat(startHerePage.getPageTitle(), is("Start Here"));
+ }
+
+ @Test
+ public void givenAboutPage_whenNavigate_thenTitleMatch() {
+ about.navigateTo();
+ assertThat(about.getPageTitle(), is("About Baeldung"));
+ }
+}