Skip to main content

Quality Assurance

Streamlining Test Automation with Page Object Model (POM) in PyTest and Selenium

Extending General Link for Experience Editor Mode in Sitecore

In our previous discussion about utilizing PyTest with Selenium, we laid the groundwork for automated testing in web applications. Now, let’s enhance that foundation by exploring the Page Object Model (POM), a design pattern that improves the organization of your code and boosts your tests’ maintainability.

1 Hjpcblbvd8mpqaezzxwvgg

What is the Page Object Model (POM)?

The Page Object Model is a widely adopted design pattern in test automation that promotes better code organization and enhances test maintenance. In essence, POM represents each page of your application as a class. Each class encapsulates that page’s web elements and functionalities, allowing for a clear separation between the test logic and the UI interaction logic.

Core Benefits of Implementing POM:

  1. Improved Maintainability: By abstracting page-specific logic, any changes to the UI need to be made only in one place—within the page class—rather than in every test case that interacts with that page.
  2. Enhanced Readability: Tests written using POM tend to be more intuitive, as they read more like user actions (e.g., login_page.enter_username(“user”)), which can help team members understand the intent behind the tests.
  3. Increased Reusability: Common interactions with a page, like clicking buttons or filling out forms, can be reused across different test cases, reducing duplication and making tests less prone to errors.
  4. Scalability: As your application grows, you can add new page classes without affecting existing tests, allowing your automation suite to scale alongside your application.

Setting Up POM with PyTest and Selenium

To illustrate how to implement POM in a PyTest project with Selenium, we’ll follow a structured approach.

  1. Organizing Your Project Structure

    A well-organized project structure can make a significant difference in managing your automation suite. Here’s a recommended directory layout:

bash
/your_project
    /tests
        test_login.py
    /pages
        login_page.py
    /drivers
        chrome_driver.py
    pytest.ini
    requirements.txt
  1. Defining the Page Object

    Let’s create a LoginPage class that represents our application’s login page. This class will encapsulate the page elements and the actions a user can perform on that page.

python

# /pages/login_page.py

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_field = (By.ID, "username")
        self.password_field = (By.ID, "password")
        self.login_button = (By.ID, "login")

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

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

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

    def is_login_successful(self):
        # Example method to check if login was successful
        return "Dashboard" in self.driver.title
  1. Writing a Test Case

    Now, let’s create a test case that utilizes our LoginPage class. This will be placed in the tests directory.

python

# /tests/test_login.py

import pytest
from selenium import webdriver
from pages.login_page import LoginPage

@pytest.fixture
def setup():
    # Initialize the Chrome WebDriver
    driver = webdriver.Chrome(executable_path="path/to/chromedriver")
    driver.get("http://example.com/login")  # Replace with your actual login URL
    yield driver
    driver.quit()

def test_login(setup):
    driver = setup
    login_page = LoginPage(driver)

    # Perform login actions
    login_page.enter_username("testuser")
    login_page.enter_password("testpassword")
    login_page.click_login()

    # Assert login was successful
    assert login_page.is_login_successful(), "Login failed: User was not redirected to the dashboard."
  1. Running Your Test

    To execute your tests, simply run the following command in your terminal:

bash
pytest tests/test_login.py

If everything is configured correctly, you should see the results of your tests displayed in the terminal output.

Best Practices for POM

When implementing the Page Object Model, consider the following best practices to maximize its benefits:

  • Keep Page Classes Focused: Each page class should represent a single web page or component of your application. To maintain clarity, avoid including methods that belong to other pages.
  • Use Meaningful Method Names: Method names should clearly describe their function, such as enter_username or click_login. This enhances the readability of your tests.
  • Incorporate Waits: Use explicit waits to handle dynamic content. This helps to ensure that elements are ready for interaction before your tests attempt to interact with them.
  • Group Related Methods: If your page has many functionalities, consider grouping related methods together to maintain organization and readability.

Conclusion

By leveraging the Page Object Model in your test automation strategy with PyTest and Selenium, you can significantly improve your test code’s structure, readability, and maintainability. This design pattern allows you to write cleaner tests while ensuring that your automation suite remains adaptable to application UI changes.

As you continue to build your automation framework, consider exploring additional strategies for enhancing your test automation practices, such as using fixtures, data-driven tests, and parallel test execution.

Happy testing, and see you next time as we dive into advanced strategies for effective test automation!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Ashika Meshram

Ashika Meshram is a Technical Consultant currently working on EHI. She is a coder girl fond of traveling and blogging.

More from this Author

Categories
Follow Us