Selenium with Python and nose2: A Step-by-Step Guide
This guide walks you through setting up Selenium WebDriver with Python and running tests using the nose2 test framework. You’ll learn how to install the necessary packages, write a basic test, and execute it from the command line, giving you a solid foundation for automated browser testing.
What You’ll Need
- Python 3.7 or later installed on your system
- pip (Python’s package installer) – usually comes with Python
- Google Chrome or Mozilla Firefox browser
- ChromeDriver or GeckoDriver matching your browser version (or use WebDriver Manager to handle this automatically)
- A code editor or IDE (Visual Studio Code, PyCharm, etc.)
- Basic familiarity with Python and writing test functions
Step-by-Step
- Create a virtual environment (recommended)
Open a terminal in your project directory and run:python -m venv venv
Then activate it:
On Windows:venv\Scripts\activate
On macOS/Linux:source venv/bin/activate - Install Selenium and nose2
With the virtual environment active, run:pip install selenium nose2
This installs both the Selenium WebDriver bindings and the nose2 test runner. - Install WebDriver Manager (recommended)
Instead of manually downloading drivers, installwebdriver-manager:pip install webdriver-manager
This will automatically download and manage the correct driver for your browser. - Write your first test
Create a file namedtest_example.pyin your project. Start with a simple test that navigates to a webpage and checks the title: - Use nose2 naming conventions
nose2 discovers test files that start withtest_and test functions that also start withtest_. Name your test functions accordingly. - Set up WebDriver in a fixture
To avoid opening a new browser for each test, use nose2’ssetUpClassandtearDownClassmethods: - Run the tests
In the terminal, simply run:nose2
This will discover and run all tests in the current directory that match the naming pattern. - Add more assertions
Use Selenium’s methods to interact with elements, such asfind_element,send_keys, andclick. Combine these with Python’sassertstatements to verify expected behavior.
Common Mistakes
- Not using a virtual environment – This can lead to dependency conflicts between projects.
- Forgetting to activate the virtual environment – Running
nose2outside the venv will use the global Python and may not find your installed packages. - Driver version mismatch – If you manually download ChromeDriver, it must match your Chrome browser’s major version. Using
webdriver-manageravoids this. - Not waiting for elements – Selenium executes fast, but pages load asynchronously. Using
WebDriverWaitprevents flaky tests. - Leaving browser windows open – Always call
driver.quit()intearDownto release resources.
Tips
- Use explicit waits over implicit waits – Explicit waits with
WebDriverWaitare more reliable and faster in most cases. - Run tests in headless mode – For CI/CD or quick checks, add options like
--headlessto Chrome to run without a visible browser. - Structure tests with Page Object Model – For larger projects, separate page locators and actions into classes to keep tests maintainable.
- Use nose2 plugins – Plugins like
nose2.plugins.junitxmlcan output test results in XML format for CI integration. - Keep tests independent – Each test should not depend on the state left by another test. Use fresh browser sessions or reset the application state.
Troubleshooting
- “ModuleNotFoundError: No module named ‘selenium’” – Ensure your virtual environment is activated and you’ve installed selenium with pip.
- “WebDriverException: Message: ‘chromedriver’ executable needs to be in PATH” – If not using webdriver-manager, download the correct driver and add its location to your system PATH, or specify the path in your code.
- Tests run but no browser opens – Check if you accidentally added
--headlessor set the environment variableMOZ_HEADLESS. - Element not found errors – The element may load after the page loads. Use
WebDriverWaitwithexpected_conditionslikepresence_of_element_located. - nose2 says “0 tests run” – Verify your test file and functions start with
test_. Also check that the file is in the current directory or in a discoverable subdirectory. - Browser closes immediately – If you call
driver.quit()intearDown, it will close the browser after each test, which is normal. If you want to keep it open for debugging, comment out the quit temporarily.
Frequently Asked Questions
Can I use nose2 with Selenium for parallel testing?
Yes, nose2 supports parallel execution via the nose2.plugins.mp plugin. You can run tests in separate processes, but be careful with shared resources like a single WebDriver instance.
How do I take a screenshot on test failure?
You can use Selenium’s save_screenshot() method inside an exception handler or a custom nose2 plugin. For example, in tearDown, check if the test failed and capture a screenshot.
Is it better to use unittest or nose2 for Selenium tests?
nose2 is built on unittest, so you can use either. nose2 offers nicer output, plugins, and discovery features, making it a popular choice for larger test suites.
How do I run a single test file with nose2?
You can specify the file name: nose2 test_example (without the .py extension). This runs only the tests in that file.
Can I use nose2 with pytest-style fixtures?
nose2 does not support pytest fixtures directly. It uses unittest’s setUp/tearDown methods. If you prefer pytest-style fixtures, consider using pytest instead.
How do I handle pop-ups or alerts in Selenium?
Use driver.switch_to.alert to interact with JavaScript alerts, confirmations, and prompts. You can accept, dismiss, or send keys to them.
Related
Method: the standard formula for this calculation, rounded as each result states. See how the calculators work or report an error.