Last modified: Oct 27, 2024 By Alexander Williams

Python Selenium Pytest Integration: A Complete Guide

Integrating Pytest with Python Selenium allows you to create automated tests that are maintainable, scalable, and easy to run.

Why Use Pytest with Selenium?

Pytest is a powerful testing framework for Python that offers simple syntax, making it ideal for Selenium test automation.

It provides features like fixtures for setup and teardown, easy parameterization, and built-in assertion methods.

If you need to work with multiple tabs or pop-ups in Selenium, check out Python Selenium current_window_handle.

Setting Up Pytest for Selenium

To integrate Pytest with Selenium, start by installing both pytest and selenium using pip:


pip install pytest selenium

Ensure that your chromedriver or other WebDriver is installed and accessible in your PATH.

Writing Your First Pytest with Selenium

Create a test file with a name starting with test_ or ending with _test.py. Here is a basic example:


import pytest
from selenium import webdriver

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

def test_title(driver):
    driver.get('https://example.com')
    assert 'Example Domain' in driver.title

In this code, @pytest.fixture is used to define a fixture that sets up and tears down the WebDriver instance.

Using Fixtures in Pytest

Fixtures in Pytest provide a way to manage test setup and teardown, making your tests more readable and reusable.

The @pytest.fixture decorator creates a reusable fixture that can be used across multiple test cases.

Fixtures are ideal for setting up common elements like WebDriver instances or login steps.

Example of Fixture for Login

Here’s an example where a fixture handles user login:


@pytest.fixture
def login(driver):
    driver.get('https://example.com/login')
    driver.find_element_by_id('username').send_keys('user')
    driver.find_element_by_id('password').send_keys('password')
    driver.find_element_by_id('login').click()

This fixture can be used in tests that require the user to be logged in:


def test_dashboard(driver, login):
    assert 'Dashboard' in driver.title

This approach keeps your tests clean and allows for better separation of test setup and logic.

Running Pytest Tests

To run your Pytest tests, navigate to the directory containing your test file and run:


pytest

This command automatically discovers and runs all test files starting with test_ or ending with _test.py in the current directory.

You can also run a specific test file using:


pytest test_example.py

For more advanced testing like managing browser pop-ups during tests, check out Python Selenium alert.accept().

Parameterizing Tests with Pytest

Pytest makes it easy to run the same test with different sets of data using the @pytest.mark.parametrize decorator:


@pytest.mark.parametrize('url', [
    'https://example.com',
    'https://test.com',
])
def test_multiple_sites(driver, url):
    driver.get(url)
    assert 'Example' in driver.title

This allows you to run the same test function with different url values, making your tests more dynamic.

Using Pytest with Selenium for Continuous Integration

Pytest is compatible with various CI/CD tools like Jenkins, GitHub Actions, and GitLab CI. This makes it easy to automate tests as part of your deployment pipeline.

To integrate with a CI tool, create a requirements.txt file listing pytest and selenium, and set up a build script to run pytest.

Generating Test Reports

Pytest offers several plugins for generating test reports, such as pytest-html:


pip install pytest-html
pytest --html=report.html

This command generates an HTML report of the test results, which is useful for sharing with stakeholders or debugging test failures.

Best Practices for Pytest with Selenium

  • Use fixtures for reusable setup and teardown logic.
  • Parameterize tests for data-driven testing.
  • Integrate with CI/CD tools for continuous testing.

If you're working with dropdowns or selects in Selenium, you might want to learn more about Python Selenium select_by_visible_text().

Conclusion

Integrating Pytest with Python Selenium enhances your testing capabilities, making it easier to write, manage, and automate tests. Using features like fixtures and parameterization, you can streamline your test automation process.

For more details, visit the official Pytest documentation.