Discover how to stop repeating yourself and make your tests smarter with one simple pattern!
Why Page factory pattern in Selenium Python? - Purpose & Use Cases
Imagine testing a website manually by clicking buttons and filling forms every time you want to check if it works.
Now, think about writing code that finds each button or field by repeating long commands everywhere in your test scripts.
This manual coding is slow and confusing because you repeat the same code to find elements again and again.
If the website changes, you must update every place in your code, which is tiring and causes mistakes.
The Page Factory pattern helps by grouping all the web elements of a page in one place.
This way, your test code is cleaner, easier to read, and you only update element locations once if the page changes.
button = driver.find_element(By.ID, 'submit') button.click() # repeated in many tests
from selenium.webdriver.common.by import By class LoginPage: def __init__(self, driver): self.driver = driver self.submit_button = self.driver.find_element(By.ID, 'submit') login_page = LoginPage(driver) login_page.submit_button.click()
It enables writing clear, maintainable tests that adapt quickly when the website changes.
When a website redesign changes button IDs, you fix the locator in one place instead of hunting through many test files.
Manual element locating is repetitive and error-prone.
Page Factory groups elements for easy access and maintenance.
Tests become cleaner and faster to update.
Practice
Page Factory pattern in Selenium with Python?Solution
Step 1: Understand the role of Page Factory
Page Factory helps organize web elements by grouping them in a class, making tests easier to read and maintain.Step 2: Compare with other options
Options B, C, and D describe different Selenium features unrelated to Page Factory's main purpose.Final Answer:
To group web elements in a class for easier access and maintenance -> Option CQuick Check:
Page Factory = Group elements for easy access [OK]
- Confusing Page Factory with test execution speed
- Thinking it generates reports
- Assuming it handles browser alerts
Solution
Step 1: Identify Page Factory syntax in Python
Page Factory uses class attributes with locator tuples like(By.ID, 'username')to declare elements before initializing them.Step 2: Check each option
username = (By.ID, 'username')shows the correct locator tuple usage, which is standard in Page Factory.Final Answer:
username = (By.ID, 'username') -> Option BQuick Check:
Page Factory uses locator tuples (By.xx, 'value') [OK]
- Using direct driver.find_element calls instead of Page Factory declarations
- Missing the locator tuple syntax
- Assigning elements directly without initialization
print(page.login_button.is_displayed()) if the button is visible on the page?
from selenium.webdriver.common.by import By
from selenium.webdriver.support.page_factory import PageFactory
class LoginPage:
def __init__(self, driver):
self.driver = driver
PageFactory.init_elements(driver, self)
login_button = (By.ID, 'loginBtn')
page = LoginPage(driver)
print(page.login_button.is_displayed())Solution
Step 1: Understand Page Factory element initialization
PageFactory.init_elements initializes elements sologin_buttonrefers to the actual web element.Step 2: Check the method call
If the button is visible,is_displayed()returns True, so printing it outputs True.Final Answer:
True -> Option AQuick Check:
Visible element's is_displayed() = True [OK]
- Expecting None because locator needs initialization
- Confusing AttributeError due to wrong initialization
- Assuming is_displayed() returns string
from selenium.webdriver.common.by import By
from selenium.webdriver.support.page_factory import PageFactory
class HomePage:
def __init__(self, driver):
self.driver = driver
PageFactory.init_elements(self, self.driver)
submit_button = (By.XPATH, "//button[@id='submit']")
page = HomePage(driver)
page.submit_button.click()Solution
Step 1: Check PageFactory.init_elements arguments
The code usesPageFactory.init_elements(self, self.driver)but arguments must be driver first, then self.Step 2: Confirm correct usage
UsingPageFactory.init_elements(driver, self)fixes the error and allows proper element initialization.Final Answer:
Initialize elements withPageFactory.init_elements(driver, self)-> Option AQuick Check:
init_elements(driver, self) order [OK]
- Wrong argument order for PageFactory.init_elements
- Using wrong decorator name case
- Incorrect PageFactory.init_elements parameters
Solution
Step 1: Understand Page Factory best practice
Page Factory groups elements in a class using locator tuples and initializes them with PageFactory.init_elements.Step 2: Compare with other options
Options B, C, and D do not use Page Factory pattern and lead to less maintainable code.Final Answer:
Declare elements with @FindBy decorators, initialize with PageFactory.init_elements, then use element methods -> Option DQuick Check:
Page Factory = locators + init_elements + class grouping [OK]
- Skipping class and locators for elements
- Using driver calls directly in tests
- Not initializing elements with PageFactory
Ready to prove it?
Pass the test and this pattern moves unknown
