Discover how organizing your test code by pages can save hours of frustration and bugs!
Why Page class structure in Selenium Python? - Purpose & Use Cases
Imagine testing a website by clicking buttons and filling forms manually every time you want to check if it works.
You write separate code for each page, repeating similar steps everywhere.
This manual way is slow and tiring.
Every small change in the website means you must find and fix many places in your code.
It's easy to make mistakes and hard to keep track of what each part does.
Using a Page class structure, you create one class for each page of the website.
Each class holds all the buttons, fields, and actions for that page in one place.
This makes your code clean, easy to update, and simple to understand.
driver.find_element(By.ID, 'login').click() driver.find_element(By.ID, 'username').send_keys('user') driver.find_element(By.ID, 'password').send_keys('pass') driver.find_element(By.ID, 'submit').click()
class LoginPage: def __init__(self, driver): self.driver = driver def login(self, user, pwd): self.driver.find_element(By.ID, 'login').click() self.driver.find_element(By.ID, 'username').send_keys(user) self.driver.find_element(By.ID, 'password').send_keys(pwd) self.driver.find_element(By.ID, 'submit').click()
It enables writing tests that are easy to read, maintain, and reuse across many test cases.
When a website changes its login button ID, you only update it once inside the LoginPage class instead of searching through all your test scripts.
Manual test code is repetitive and hard to maintain.
Page class structure groups page elements and actions logically.
This approach saves time and reduces errors when website changes.
Practice
Solution
Step 1: Understand the role of page classes
Page classes organize locators and methods related to one web page, making tests cleaner.Step 2: Identify the correct purpose
Grouping elements and actions for a page matches the page class concept.Final Answer:
To group web elements and actions for a single web page -> Option DQuick Check:
Page class = group elements and actions [OK]
- Confusing page class with test data storage
- Thinking page class runs the browser driver
- Mixing page class with assertion logic
Solution
Step 1: Recall locator tuple syntax
Locators use tuples like (By.ID, 'value') to specify how to find elements.Step 2: Check each option
submit_button = (By.ID, 'submit') correctly uses a tuple with By.ID and string 'submit'. Others have syntax errors or wrong formats.Final Answer:
submit_button = (By.ID, 'submit') -> Option AQuick Check:
Locator = (By.METHOD, 'value') tuple [OK]
- Using string instead of tuple for locator
- Calling By.ID as a function
- Incorrect tuple structure
page.get_title() return if the browser's current page title is "Welcome Page"?
class HomePage:
def __init__(self, driver):
self.driver = driver
def get_title(self):
return self.driver.title
page = HomePage(driver)Solution
Step 1: Understand get_title method
The method returnsself.driver.title, which is the browser's current page title.Step 2: Check given title
The browser's title is "Welcome Page", so the method returns this string.Final Answer:
"Welcome Page" -> Option BQuick Check:
driver.title returns current page title [OK]
- Assuming method returns None by default
- Thinking method is missing or undefined
- Confusing class name with page title
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_input = (By.ID, 'username')
def enter_username(self, username):
self.driver.find_element(self.username_input).send_keys(username)Solution
Step 1: Check find_element usage
find_element expects two arguments: method and locator string, not a tuple as one argument.Step 2: Fix by unpacking tuple
Use *self.username_input to unpack tuple into two arguments.Final Answer:
find_element expects two arguments, fix by unpacking locator: *self.username_input -> Option CQuick Check:
Use * to unpack locator tuple in find_element [OK]
- Passing locator tuple as single argument
- Calling send_keys on driver instead of element
- Thinking return is required for action methods
Solution
Step 1: Check locator storage
class LoginPage: def __init__(self, driver): self.driver = driver self.username = (By.ID, 'user') self.password = (By.ID, 'pass') self.login_btn = (By.ID, 'login') def enter_username(self, name): self.driver.find_element(*self.username).send_keys(name) def enter_password(self, pwd): self.driver.find_element(*self.password).send_keys(pwd) def click_login(self): self.driver.find_element(*self.login_btn).click() stores locators as tuples in __init__, which is best practice for reuse and clarity.Step 2: Check method structure
class LoginPage: def __init__(self, driver): self.driver = driver self.username = (By.ID, 'user') self.password = (By.ID, 'pass') self.login_btn = (By.ID, 'login') def enter_username(self, name): self.driver.find_element(*self.username).send_keys(name) def enter_password(self, pwd): self.driver.find_element(*self.password).send_keys(pwd) def click_login(self): self.driver.find_element(*self.login_btn).click() has separate methods for each action, improving readability and maintainability.Step 3: Compare other options
class LoginPage: def __init__(self, driver): self.driver = driver def login(self, user, pwd): self.driver.find_element(By.ID, 'user').send_keys(user) self.driver.find_element(By.ID, 'pass').send_keys(pwd) self.driver.find_element(By.ID, 'login').click() repeats locators in methods, class LoginPage: def __init__(self, driver): self.driver = driver self.username = 'user' self.password = 'pass' self.login_btn = 'login' def login(self, user, pwd): self.driver.find_element(By.ID, self.username).send_keys(user) self.driver.find_element(By.ID, self.password).send_keys(pwd) self.driver.find_element(By.ID, self.login_btn).click() stores locators as strings only, class LoginPage: def __init__(self, driver): self.driver = driver def enter_username(self, name): self.driver.find_element(By.ID, 'user').send_keys(name) def enter_password(self, pwd): self.driver.find_element(By.ID, 'pass').send_keys(pwd) def click_login(self): self.driver.find_element(By.ID, 'login').click() does not store locators as variables.Final Answer:
Option A follows page class structure and good practices best -> Option AQuick Check:
Store locators once, use methods for actions [OK]
- Repeating locators inside methods
- Storing locators as plain strings
- Not separating actions into methods
Ready to prove it?
Pass the test and this pattern moves unknown
