We use test classes with page objects to keep tests simple and easy to read. It helps separate the test steps from the details of the web page.
Test class consuming page objects in Selenium Java
public class TestClassName { WebDriver driver; PageObjectClass page; @BeforeEach public void setup() { driver = new ChromeDriver(); page = new PageObjectClass(driver); } @Test public void testMethod() { page.open(); page.performAction(); Assertions.assertTrue(page.isResultDisplayed()); } @AfterEach public void teardown() { driver.quit(); } }
The test class creates and uses the page object to interact with the web page.
Use setup and teardown methods to open and close the browser for each test.
public class LoginTest { WebDriver driver; LoginPage loginPage; @BeforeEach public void setup() { driver = new ChromeDriver(); loginPage = new LoginPage(driver); } @Test public void validLoginTest() { loginPage.open(); loginPage.enterUsername("user1"); loginPage.enterPassword("pass123"); loginPage.clickLogin(); Assertions.assertTrue(loginPage.isLoginSuccessful()); } @AfterEach public void teardown() { driver.quit(); } }
public class SearchTest { WebDriver driver; SearchPage searchPage; @BeforeEach public void setup() { driver = new ChromeDriver(); searchPage = new SearchPage(driver); } @Test public void searchItemTest() { searchPage.open(); searchPage.enterSearchTerm("laptop"); searchPage.clickSearchButton(); Assertions.assertTrue(searchPage.isResultsDisplayed()); } @AfterEach public void teardown() { driver.quit(); } }
This test class uses the LoginPage page object to test a login. It opens the login page, enters username and password, clicks login, and checks if login was successful by looking for a welcome message.
import org.junit.jupiter.api.*; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.By; public class LoginTest { WebDriver driver; LoginPage loginPage; @BeforeEach public void setup() { driver = new ChromeDriver(); loginPage = new LoginPage(driver); } @Test public void validLoginTest() { loginPage.open(); loginPage.enterUsername("user1"); loginPage.enterPassword("pass123"); loginPage.clickLogin(); Assertions.assertTrue(loginPage.isLoginSuccessful()); } @AfterEach public void teardown() { driver.quit(); } } // Page Object Class class LoginPage { WebDriver driver; public LoginPage(WebDriver driver) { this.driver = driver; } public void open() { driver.get("https://example.com/login"); } public void enterUsername(String username) { driver.findElement(By.id("username")).sendKeys(username); } public void enterPassword(String password) { driver.findElement(By.id("password")).sendKeys(password); } public void clickLogin() { driver.findElement(By.id("loginButton")).click(); } public boolean isLoginSuccessful() { return driver.findElements(By.id("welcomeMessage")).size() > 0; } }
Always keep page objects focused on page actions and locators only.
Test classes should focus on test logic and assertions.
Use meaningful method names in page objects for clarity.
Test classes use page objects to keep tests clean and easy to read.
Page objects handle web page details; test classes handle test steps and checks.
This separation makes tests easier to maintain and understand.
Practice
Solution
Step 1: Understand roles of test class and page objects
Page objects encapsulate web element locators and actions. Test classes use these to perform tests.Step 2: Identify test class responsibility
Test classes call page object methods to execute test steps and verify results with assertions.Final Answer:
To perform test steps and assertions using methods from page objects -> Option DQuick Check:
Test class runs tests using page objects [OK]
- Trying to locate elements directly in test class
- Mixing page object code with test logic
- Using test class only for driver setup
Solution
Step 1: Recall page object constructor usage
Page objects usually require WebDriver passed to constructor for element initialization.Step 2: Check each option for correct syntax
LoginPage login = new LoginPage(driver); correctly uses 'new' with driver argument. Others miss driver or use invalid syntax.Final Answer:
LoginPage login = new LoginPage(driver); -> Option AQuick Check:
Use 'new' with driver parameter [OK]
- Forgetting to pass driver to constructor
- Using constructor without 'new' keyword
- Trying to get page object from driver directly
LoginPage login = new LoginPage(driver);
boolean result = login.login("wrongUser", "wrongPass");
System.out.println(result ? "Login Successful" : "Login Failed");Assuming
login() returns true on success and false on failure.Solution
Step 1: Understand login method behavior
login() returns true if credentials are correct, false otherwise.Step 2: Analyze given credentials and output
Credentials are wrong, so login() returns false, printing "Login Failed".Final Answer:
Login Failed -> Option AQuick Check:
False login returns "Login Failed" [OK]
- Assuming login returns exception on failure
- Confusing true/false return values
- Ignoring ternary operator logic
public class LoginTest {
WebDriver driver;
LoginPage loginPage;
@Before
public void setup() {
driver = new ChromeDriver();
loginPage = new LoginPage();
}
@Test
public void testLogin() {
loginPage.login("user", "pass");
}
}Solution
Step 1: Check page object instantiation
LoginPage requires driver in constructor, but called without arguments here.Step 2: Confirm driver initialization
Driver is initialized correctly before page object creation, so no issue there.Final Answer:
LoginPage constructor is called without passing driver -> Option CQuick Check:
Page object needs driver in constructor [OK]
- Forgetting driver parameter in page object constructor
- Assuming driver auto-initializes in page object
- Ignoring missing assertions (not error here)
HomePage and ProfilePage. You want to test the flow: login, navigate to profile, update info, and verify success message. Which approach best follows the test class consuming page objects pattern?Solution
Step 1: Understand separation of concerns
Page objects encapsulate page details; test class uses them to perform test steps and assertions.Step 2: Evaluate options for best practice
Instantiate both page objects with driver, call login on HomePage, then call updateProfile on ProfilePage, finally assert success message from ProfilePage correctly uses separate page objects and test class calls their methods in sequence.Final Answer:
Instantiate both page objects with driver, call login on HomePage, then call updateProfile on ProfilePage, finally assert success message from ProfilePage -> Option BQuick Check:
Test class calls page objects methods in flow [OK]
- Putting all locators and actions in test class
- Combining unrelated page objects into one
- Using driver directly instead of page objects
Ready to prove it?
Pass the test and this pattern moves unknown
