Bird
Raised Fist0
Selenium Pythontesting~15 mins

Running Selenium in CI pipeline in Selenium Python - Build an Automation Script

Choose your learning style10 modes available
Run Selenium test on login page in CI pipeline
Preconditions (3)
Step 1: Open the login page URL in a browser
Step 2: Enter 'admin@test.com' in the email input field with id 'email'
Step 3: Enter 'Pass123!' in the password input field with id 'password'
Step 4: Click the login button with id 'login-btn'
Step 5: Wait for the page to load and verify the URL contains '/dashboard'
✅ Expected Result: User is successfully logged in and redirected to the dashboard page URL containing '/dashboard'
Automation Requirements - Selenium with Python
Assertions Needed:
Verify the current URL contains '/dashboard' after login
Best Practices:
Use explicit waits to wait for elements and page load
Use By.ID locator strategy for stable element selection
Use setup and teardown methods to initialize and quit WebDriver
Run tests headlessly in CI environment
Use environment variables or config for URLs and credentials
Automated Solution
Selenium Python
import os
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class LoginTest(unittest.TestCase):
    def setUp(self):
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        self.driver = webdriver.Chrome(options=chrome_options)
        self.driver.implicitly_wait(5)
        self.base_url = os.getenv('BASE_URL', 'https://example.com/login')

    def test_login(self):
        driver = self.driver
        driver.get(self.base_url)

        email_input = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, 'email'))
        )
        email_input.send_keys('admin@test.com')

        password_input = driver.find_element(By.ID, 'password')
        password_input.send_keys('Pass123!')

        login_button = driver.find_element(By.ID, 'login-btn')
        login_button.click()

        WebDriverWait(driver, 10).until(
            EC.url_contains('/dashboard')
        )

        self.assertIn('/dashboard', driver.current_url)

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main()

This script uses Python's unittest framework with Selenium WebDriver.

In setUp, we configure Chrome to run headlessly for CI environments and set the base URL from an environment variable for flexibility.

The test_login method opens the login page, waits explicitly for the email input to appear, enters credentials, clicks login, then waits for the URL to contain '/dashboard' to confirm successful login.

Assertions check the URL to verify the test passed.

Finally, tearDown quits the browser to clean up.

This structure ensures the test runs reliably in a CI pipeline without opening a visible browser window.

Common Mistakes - 5 Pitfalls
{'mistake': 'Using time.sleep() instead of explicit waits', 'why_bad': 'It causes flaky tests because fixed waits may be too short or too long depending on environment speed.', 'correct_approach': "Use Selenium's WebDriverWait with expected conditions to wait dynamically for elements or URL changes."}
Hardcoding URLs and credentials in the test code
{'mistake': 'Running tests with visible browser windows in CI', 'why_bad': 'CI servers usually have no display, causing tests to fail or hang.', 'correct_approach': "Run browsers in headless mode using options like ChromeOptions with '--headless'."}
Not quitting the WebDriver after tests
Using brittle locators like absolute XPaths
Bonus Challenge

Now add data-driven testing with 3 different sets of login credentials to verify both successful and unsuccessful login attempts.

Show Hint

Practice

(1/5)
1. Why is it important to run Selenium tests in a CI pipeline?
easy
A. To slow down the deployment process
B. To automatically catch bugs early during development
C. To manually check the UI after deployment
D. To avoid writing test scripts

Solution

  1. Step 1: Understand the purpose of CI pipelines

    CI pipelines automate testing and building to catch issues early.
  2. Step 2: Relate Selenium tests to CI benefits

    Running Selenium tests in CI helps find UI bugs automatically before release.
  3. Final Answer:

    To automatically catch bugs early during development -> Option B
  4. Quick Check:

    CI + Selenium = Early bug detection [OK]
Hint: CI runs tests automatically to catch bugs early [OK]
Common Mistakes:
  • Thinking CI slows deployment
  • Believing tests run manually in CI
  • Ignoring automated testing benefits
2. Which of the following is the correct way to run Chrome in headless mode in Selenium Python?
easy
A. options.add_argument('--headless')
B. options.set_headless(True)
C. driver.headless = True
D. driver.set_option('headless')

Solution

  1. Step 1: Recall Selenium ChromeOptions usage

    To run Chrome headless, add the argument '--headless' to options.
  2. Step 2: Verify correct syntax

    Using options.add_argument('--headless') is the correct method in Selenium Python.
  3. Final Answer:

    options.add_argument('--headless') -> Option A
  4. Quick Check:

    Headless Chrome = add_argument('--headless') [OK]
Hint: Use add_argument('--headless') to enable headless mode [OK]
Common Mistakes:
  • Using non-existent methods like set_headless
  • Trying to set driver.headless directly
  • Confusing driver and options methods
3. What will be the output when running this Selenium Python snippet in a CI environment without a display server?
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get('https://example.com')
print(driver.title)
driver.quit()
medium
A. Prints 'ChromeDriver not found' error
B. Throws an error about missing display server
C. Prints an empty string
D. Prints the page title 'Example Domain'

Solution

  1. Step 1: Understand headless mode effect

    Headless mode allows Chrome to run without a display server in CI.
  2. Step 2: Analyze code behavior

    The code opens example.com headlessly and prints the page title successfully.
  3. Final Answer:

    Prints the page title 'Example Domain' -> Option D
  4. Quick Check:

    Headless mode avoids display errors, prints title [OK]
Hint: Headless mode avoids display errors, so title prints [OK]
Common Mistakes:
  • Assuming display server is always needed
  • Expecting empty output without display
  • Confusing driver errors with headless mode
4. You added Selenium tests to your CI pipeline but they fail with the error: selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. How do you fix this?
medium
A. Install ChromeDriver and add it to the system PATH in the CI environment
B. Remove the ChromeDriver and use Firefox instead
C. Run tests without specifying any driver
D. Disable headless mode in Chrome options

Solution

  1. Step 1: Understand the error message

    The error says ChromeDriver is missing or not found in PATH.
  2. Step 2: Fix by installing ChromeDriver in CI

    Install ChromeDriver and ensure its location is in the PATH environment variable.
  3. Final Answer:

    Install ChromeDriver and add it to the system PATH in the CI environment -> Option A
  4. Quick Check:

    Driver missing error = install and add to PATH [OK]
Hint: Add ChromeDriver to PATH in CI to fix driver not found [OK]
Common Mistakes:
  • Ignoring driver installation
  • Switching browsers without fixing driver
  • Disabling headless mode unrelated to driver error
5. You want to run Selenium tests in a CI pipeline using Docker. Which setup ensures tests run headlessly and ChromeDriver is available inside the container?
hard
A. Run Selenium tests on host machine, not inside Docker
B. Use a plain Python image and install ChromeDriver only, no Chrome needed
C. Use a Docker image with Chrome and ChromeDriver installed, run Chrome with '--headless' option in Selenium
D. Use Firefox without headless mode inside Docker container

Solution

  1. Step 1: Identify requirements for Selenium in Docker

    Tests need both Chrome browser and ChromeDriver installed inside the container.
  2. Step 2: Choose correct Docker setup

    A Docker image with Chrome and ChromeDriver pre-installed and running Chrome headless is best practice.
  3. Final Answer:

    Use a Docker image with Chrome and ChromeDriver installed, run Chrome with '--headless' option in Selenium -> Option C
  4. Quick Check:

    Docker Selenium needs browser + driver + headless [OK]
Hint: Docker needs both Chrome and ChromeDriver installed [OK]
Common Mistakes:
  • Installing driver without browser
  • Running tests outside Docker when container needed
  • Using non-headless mode in CI Docker
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