Bird
Raised Fist0
Selenium Pythontesting~10 mins

Why POM organizes test code in Selenium Python - Test Execution Impact

Choose your learning style10 modes available
Test Overview

This test opens a login page, enters username and password using Page Object Model (POM), clicks login, and verifies successful login message. It shows how POM organizes test code by separating page actions from test logic.

Test Code - Selenium
Selenium Python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import unittest

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")
        self.password_input = (By.ID, "password")
        self.login_button = (By.ID, "loginBtn")

    def enter_username(self, username):
        self.driver.find_element(*self.username_input).send_keys(username)

    def enter_password(self, password):
        self.driver.find_element(*self.password_input).send_keys(password)

    def click_login(self):
        self.driver.find_element(*self.login_button).click()

class TestLogin(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://example.com/login")
        self.login_page = LoginPage(self.driver)

    def test_valid_login(self):
        self.login_page.enter_username("user1")
        self.login_page.enter_password("pass123")
        self.login_page.click_login()
        WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located((By.ID, "welcomeMsg"))
        )
        welcome_text = self.driver.find_element(By.ID, "welcomeMsg").text
        self.assertEqual(welcome_text, "Welcome user1!")

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()
Execution Trace - 7 Steps
StepActionSystem StateAssertionResult
1Test starts and Chrome browser opensBrowser window is open at https://example.com/login page—PASS
2Test calls enter_username method to find username input and types 'user1'Username input field contains text 'user1'—PASS
3Test calls enter_password method to find password input and types 'pass123'Password input field contains text 'pass123'—PASS
4Test calls click_login method to find and click login buttonLogin button clicked, page starts loading next screen—PASS
5Test waits up to 10 seconds for element with ID 'welcomeMsg' to appearWelcome message element is present on pageVerify welcome message text equals 'Welcome user1!'PASS
6Test asserts that welcome message text is exactly 'Welcome user1!'Welcome message text is 'Welcome user1!'assertEqual passesPASS
7Test ends and browser closesBrowser window closed—PASS
Failure Scenario
Failing Condition: If the login button ID changes or welcome message does not appear
Execution Trace Quiz - 3 Questions
Test your understanding
What does the Page Object Model (POM) help organize in this test?
AAutomatically generates test data
BRuns tests faster by skipping waits
CSeparates page element locators and actions from test logic
DReplaces the need for assertions
Key Result
Using POM keeps test code clean and easy to maintain by putting page details in one place, so tests focus on verifying behavior.

Practice

(1/5)
1. What is the main reason to use the Page Object Model (POM) in Selenium test automation?
easy
A. To separate page details from test logic for cleaner code
B. To write all test steps in one big script
C. To avoid using locators in tests
D. To run tests faster by skipping waits

Solution

  1. Step 1: Understand POM purpose

    POM separates the page structure (locators and actions) from the test logic, making code cleaner.
  2. Step 2: Compare options

    Options A, B, and D do not describe POM's main goal. Only To separate page details from test logic for cleaner code correctly states the separation of concerns.
  3. Final Answer:

    To separate page details from test logic for cleaner code -> Option A
  4. Quick Check:

    POM purpose = Separation of concerns [OK]
Hint: Remember: POM splits page info and test steps [OK]
Common Mistakes:
  • Thinking POM speeds up test execution
  • Believing POM removes locators completely
  • Confusing POM with test data management
2. Which of the following is the correct way to define a locator in a POM class using Selenium with Python?
easy
A. self.login_button = driver.find_element_by_id('login')
B. login_button = ('id', 'login')
C. login_button = (By.ID, 'login')
D. login_button = driver.find_element(By.ID, 'login')

Solution

  1. Step 1: Recall POM locator best practice

    In POM, locators are stored as tuples like (By.ID, 'value') without calling find_element immediately.
  2. Step 2: Analyze options

    login_button = (By.ID, 'login') correctly defines a locator tuple. Options A and C call find_element directly, which is not best practice. login_button = ('id', 'login') uses a string 'id' instead of By.ID.
  3. Final Answer:

    login_button = (By.ID, 'login') -> Option C
  4. Quick Check:

    Locator tuple = (By.ID, 'login') [OK]
Hint: Locators in POM are tuples with By.<type> [OK]
Common Mistakes:
  • Calling find_element when defining locators
  • Using strings instead of By constants
  • Storing locators as WebElements instead of tuples
3. Given this POM method in Python:
def click_login(self):
    self.driver.find_element(*self.login_button).click()
What happens if the locator self.login_button is incorrect?
medium
A. The test will pass but skip the click
B. The test will raise a TimeoutException
C. The test will ignore the error and continue
D. The test will fail with NoSuchElementException

Solution

  1. Step 1: Understand Selenium behavior on wrong locator

    If the locator is wrong, Selenium cannot find the element and raises NoSuchElementException immediately.
  2. Step 2: Check other options

    Options A and C are incorrect because Selenium does not silently skip or ignore missing elements. The test will raise a TimeoutException is wrong because TimeoutException occurs with explicit waits, not direct find_element calls.
  3. Final Answer:

    The test will fail with NoSuchElementException -> Option D
  4. Quick Check:

    Wrong locator = NoSuchElementException [OK]
Hint: Wrong locator causes NoSuchElementException [OK]
Common Mistakes:
  • Confusing NoSuchElementException with TimeoutException
  • Thinking Selenium skips missing elements
  • Assuming test passes without element
4. You have this POM method:
def enter_username(self, username):
    self.driver.find_element(*self.username_field).send_keys(username)
But tests fail with NoSuchElementException. What is the likely cause?
medium
A. The username argument is None
B. The locator self.username_field is incorrect
C. send_keys method is misspelled
D. The driver is not initialized

Solution

  1. Step 1: Analyze the error message

    NoSuchElementException means Selenium cannot find the element, so self.username_field locator is likely incorrect.
  2. Step 2: Check other options

    The username argument is None is wrong because that would error after finding the element. send_keys method is misspelled is unlikely as send_keys is standard. The driver is not initialized would cause different errors.
  3. Final Answer:

    The locator self.username_field is incorrect -> Option B
  4. Quick Check:

    NoSuchElementException = locator wrong [OK]
Hint: NoSuchElementException means locator wrong [OK]
Common Mistakes:
  • Blaming input argument for locator error
  • Ignoring locator definition
  • Assuming driver is always initialized
5. How does using POM help a team when the web page changes its button ID from 'submit' to 'send'?
hard
A. Only the locator in the POM class needs updating, tests remain unchanged
B. All test scripts must be rewritten to use the new ID
C. Tests will fail until the whole framework is rebuilt
D. The change has no effect because POM uses dynamic locators automatically

Solution

  1. Step 1: Understand POM's separation advantage

    POM stores locators in one place. Changing a locator means updating only that place.
  2. Step 2: Evaluate options

    Only the locator in the POM class needs updating, tests remain unchanged correctly states only the locator in POM needs update. All test scripts must be rewritten to use the new ID is wrong because tests don't need rewriting. Tests will fail until the whole framework is rebuilt exaggerates failure. The change has no effect because POM uses dynamic locators automatically is false; POM does not auto-update locators.
  3. Final Answer:

    Only the locator in the POM class needs updating, tests remain unchanged -> Option A
  4. Quick Check:

    POM isolates locator changes [OK]
Hint: Update locator once in POM, not all tests [OK]
Common Mistakes:
  • Thinking all tests must change
  • Believing POM auto-fixes locators
  • Assuming framework rebuild is needed
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard