Bird
Raised Fist0
Selenium Pythontesting~15 mins

Test reporting in CI in Selenium Python - Build an Automation Script

Choose your learning style10 modes available
Verify login functionality and generate test report in CI
Preconditions (3)
Step 1: Open the login page at 'https://example.com/login'
Step 2: Enter 'testuser' in the username input field with id 'username'
Step 3: Enter 'Test@1234' in the password input field with id 'password'
Step 4: Click the login button with id 'loginBtn'
Step 5: Wait until the URL changes to 'https://example.com/dashboard'
Step 6: Verify that the page contains a welcome message with id 'welcomeMsg' and text 'Welcome, testuser!'
✅ Expected Result: User is successfully logged in, redirected to dashboard, and the welcome message is displayed. Test report is generated in JUnit XML format for CI consumption.
Automation Requirements - pytest with Selenium WebDriver
Assertions Needed:
Assert current URL is 'https://example.com/dashboard'
Assert welcome message text equals 'Welcome, testuser!'
Best Practices:
Use explicit waits to wait for page elements or URL changes
Use pytest fixtures for setup and teardown of WebDriver
Generate JUnit XML test report using pytest's --junitxml option
Keep locators clear and maintainable using By.ID
Avoid hardcoded sleeps; use WebDriverWait
Automated Solution
Selenium Python
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

@ pytest.fixture
 def driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(5)  # short implicit wait
    yield driver
    driver.quit()

 def test_login_success(driver):
    driver.get('https://example.com/login')

    username_input = driver.find_element(By.ID, 'username')
    password_input = driver.find_element(By.ID, 'password')
    login_button = driver.find_element(By.ID, 'loginBtn')

    username_input.send_keys('testuser')
    password_input.send_keys('Test@1234')
    login_button.click()

    # Wait until URL changes to dashboard
    WebDriverWait(driver, 10).until(EC.url_to_be('https://example.com/dashboard'))

    assert driver.current_url == 'https://example.com/dashboard', f"Expected URL to be dashboard but got {driver.current_url}"

    # Wait for welcome message
    welcome_msg = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, 'welcomeMsg'))
    )

    assert welcome_msg.text == 'Welcome, testuser!', f"Expected welcome message text to be 'Welcome, testuser!' but got '{welcome_msg.text}'"

# To run and generate JUnit XML report for CI:
# pytest test_login.py --junitxml=report.xml

This test script uses pytest and selenium to automate the login test.

The driver fixture sets up and tears down the Chrome WebDriver cleanly.

The test opens the login page, enters the username and password, and clicks the login button.

It uses WebDriverWait to wait explicitly for the URL to change to the dashboard URL, avoiding unreliable fixed waits.

Then it waits for the welcome message element to appear and asserts its text matches the expected greeting.

Assertions verify the URL and welcome message text to confirm successful login.

For CI integration, running pytest with --junitxml=report.xml generates a test report in XML format that CI tools can read.

This approach follows best practices: explicit waits, clear locators, fixture usage, and proper reporting.

Common Mistakes - 4 Pitfalls
Using time.sleep() instead of explicit waits
Hardcoding XPath locators that are brittle
Not quitting the WebDriver after tests
Not generating test reports for CI
Bonus Challenge

Now add data-driven testing with 3 different username and password combinations to verify login success or failure.

Show Hint

Practice

(1/5)
1. What is the main purpose of test reporting in Continuous Integration (CI)?
easy
A. To provide quick feedback on test results automatically
B. To write test cases manually
C. To deploy the application to production
D. To create user documentation

Solution

  1. Step 1: Understand CI test reporting role

    Test reporting in CI is designed to give fast feedback on whether tests pass or fail after code changes.
  2. Step 2: Identify the correct purpose

    Among the options, only providing quick automatic feedback matches the main purpose of test reporting in CI.
  3. Final Answer:

    To provide quick feedback on test results automatically -> Option A
  4. Quick Check:

    Test reporting = quick feedback [OK]
Hint: Test reporting = fast feedback on tests [OK]
Common Mistakes:
  • Confusing test reporting with deployment
  • Thinking test reporting is about writing tests
  • Mixing test reporting with documentation
2. Which pytest command option generates a test report in XML format suitable for CI tools?
easy
A. --html=report.html
B. --junitxml=report.xml
C. --json=report.json
D. --output=report.txt

Solution

  1. Step 1: Recall pytest report options

    Pytest uses --junitxml to create XML reports compatible with many CI tools.
  2. Step 2: Match option to XML report

    Among the options, only --junitxml=report.xml generates the correct XML format for CI.
  3. Final Answer:

    --junitxml=report.xml -> Option B
  4. Quick Check:

    Pytest XML report = --junitxml [OK]
Hint: Use --junitxml for CI XML reports in pytest [OK]
Common Mistakes:
  • Using --html instead of --junitxml
  • Confusing JSON or text output with XML
  • Missing the file name after the option
3. Given this pytest command:
pytest tests/ --junitxml=results.xml
What will happen after the tests run?
medium
A. Tests will run but no report file will be created
B. Tests will fail due to syntax error in command
C. A file named results.xml will be created with test results in XML format
D. A HTML report named results.xml will be generated

Solution

  1. Step 1: Understand the command effect

    The --junitxml=results.xml option tells pytest to save test results in XML format to the file named results.xml.
  2. Step 2: Identify the output file type

    The file created is XML, not HTML, and the command syntax is correct, so tests run and report is saved.
  3. Final Answer:

    A file named results.xml will be created with test results in XML format -> Option C
  4. Quick Check:

    --junitxml creates XML report file [OK]
Hint: --junitxml creates XML report file after tests [OK]
Common Mistakes:
  • Thinking no report is created
  • Confusing XML with HTML report
  • Assuming command syntax error
4. You added --junitxml=report.xml to your pytest command, but the CI tool shows no test report. What is the most likely cause?
medium
A. The tests did not run due to errors in test code
B. The pytest command syntax is incorrect
C. The CI tool does not support XML reports
D. The report.xml file is not saved in the CI workspace directory

Solution

  1. Step 1: Check report file location

    CI tools need the report file in the workspace folder to read it. If saved elsewhere, the tool won't find it.
  2. Step 2: Verify other causes

    The command syntax is correct, tests likely ran, and most CI tools support XML reports, so the missing file location is the main issue.
  3. Final Answer:

    The report.xml file is not saved in the CI workspace directory -> Option D
  4. Quick Check:

    Report file location matters in CI [OK]
Hint: Ensure report file is in CI workspace folder [OK]
Common Mistakes:
  • Assuming command syntax error without checking
  • Ignoring file save location
  • Thinking CI tools don't support XML reports
5. In a CI pipeline, you want to fail the build if any Selenium tests fail and generate a detailed report. Which approach is best?
hard
A. Run pytest with --junitxml=report.xml and configure CI to fail on test failures using this report
B. Run tests without report and manually check logs after build
C. Use --html=report.html and ignore test failures in CI
D. Run tests locally and upload screenshots only

Solution

  1. Step 1: Generate machine-readable test report

    Using --junitxml=report.xml creates a detailed XML report that CI tools can parse.
  2. Step 2: Configure CI to fail build on test failures

    CI tools can read the XML report and mark the build as failed if tests fail, automating quality checks.
  3. Final Answer:

    Run pytest with --junitxml=report.xml and configure CI to fail on test failures using this report -> Option A
  4. Quick Check:

    Use XML report + CI fail on test fail [OK]
Hint: Use --junitxml and CI fail on test failure [OK]
Common Mistakes:
  • Ignoring test failures in CI
  • Not generating machine-readable reports
  • Relying on manual log checks
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard