Conftest for shared fixtures in Selenium Python - Build an Automation Script
import pytest 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 # conftest.py @pytest.fixture(scope='session') def driver(): driver = webdriver.Chrome() driver.maximize_window() yield driver driver.quit() # test_login.py def test_login(driver): driver.get('https://example.com/login') username_input = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, 'username')) ) username_input.send_keys('testuser') password_input = driver.find_element(By.ID, 'password') password_input.send_keys('Test@1234') login_button = driver.find_element(By.ID, 'loginBtn') login_button.click() WebDriverWait(driver, 10).until( EC.url_to_be('https://example.com/dashboard') ) assert driver.current_url == 'https://example.com/dashboard', 'URL did not change to dashboard' assert 'Dashboard' in driver.title, 'Page title does not contain Dashboard'
The conftest.py file defines a driver fixture that sets up the Chrome WebDriver once per test session and quits it after all tests finish. This avoids repeating setup code in every test.
The test test_login uses this shared driver fixture. It opens the login page, waits explicitly for the username input to be visible, then enters the username and password. It clicks the login button and waits explicitly until the URL changes to the dashboard URL.
Finally, it asserts that the current URL is exactly the dashboard URL and that the page title contains the word 'Dashboard'. These assertions confirm the login was successful.
Explicit waits ensure the test does not fail due to timing issues. Using the shared fixture keeps the code clean and reusable.
Now add data-driven testing with 3 different sets of login credentials (valid and invalid) using pytest parametrize
Practice
conftest.py file in Selenium Python testing?Solution
Step 1: Understand the role of
Theconftest.pyconftest.pyfile is used to define fixtures that can be shared across multiple test files for setup and cleanup tasks.Step 2: Differentiate from other files
It does not store test data, locators, or test cases directly but provides reusable setup code like browser initialization.Final Answer:
To hold shared fixtures for setup and cleanup across multiple test files -> Option AQuick Check:
conftest.py = shared fixtures [OK]
- Confusing conftest.py with test case files
- Thinking conftest.py stores test data
- Using conftest.py to write test assertions
conftest.py using pytest?Solution
Step 1: Identify correct fixture decorator usage
pytest fixtures require the@pytest.fixturedecorator above the function to mark it as a fixture.Step 2: Check syntax correctness
@pytest.fixture def browser(): yield webdriver.Chrome() correctly uses@pytest.fixtureand a generator withyieldto provide the resource.Final Answer:
@pytest.fixture\ndef browser(): yield webdriver.Chrome() -> Option BQuick Check:
Use @pytest.fixture decorator [OK]
- Omitting @pytest.fixture decorator
- Using wrong decorator name like @fixture
- Not using yield for setup/teardown
conftest.py:
@pytest.fixture
def browser():
driver = webdriver.Chrome()
yield driver
driver.quit()
What happens when a test uses this fixture?Solution
Step 1: Understand yield in fixture
Theyieldstatement pauses the fixture, providing the driver to the test, then resumes after the test to run cleanup.Step 2: Analyze setup and teardown
Driver is created before yield (browser opens), anddriver.quit()runs after test finishes (browser closes).Final Answer:
The browser opens before the test and closes after the test finishes -> Option DQuick Check:
yield = setup before, cleanup after [OK]
- Thinking yield closes browser immediately
- Forgetting driver.quit() after yield
- Assuming browser stays open forever
conftest.py:
@pytest.fixture
def browser():
driver = webdriver.Chrome()
return driver
driver.quit()
What is the problem with this fixture?Solution
Step 1: Analyze return and driver.quit() placement
Sincereturnexits the function immediately,driver.quit()after it never runs.Step 2: Understand impact on browser lifecycle
Withoutdriver.quit(), the browser stays open after tests, causing resource leaks.Final Answer:
driver.quit() is never called, so browser stays open after tests -> Option AQuick Check:
return ends function before cleanup [OK]
- Placing driver.quit() after return
- Using return instead of yield for fixtures
- Expecting cleanup code after return to run
conftest.py that opens Chrome once per test session and closes it after all tests finish. Which fixture scope and code is correct?Solution
Step 1: Choose correct fixture scope for session-wide browser
Usingscope='session'makes the fixture run once per test session.Step 2: Verify setup and teardown order with yield
Driver is created beforeyield(browser opens), anddriver.quit()runs after all tests finish.Final Answer:
@pytest.fixture(scope='session')\ndef browser():\n driver = webdriver.Chrome()\n yield driver\n driver.quit() -> Option CQuick Check:
scope='session' + yield = one browser per session [OK]
- Using scope='function' for session-wide browser
- Calling driver.quit() before yield
- Yielding after driver.quit()
Ready to prove it?
Pass the test and this pattern moves unknown
