Creating and executing the Selenium script in parallel with Python

In this recipe, we will create and execute tests in parallel with Python bindings using the subprocess module. We will use the Hub and nodes configured in earlier recipes to run these tests.

How to do it...

We will create two test scripts to test the application with Firefox and Internet Explorer using the following steps. You can also create a single test and parameterize it similar to what we did for TestNG:

  1. For the first Python test, which will test the application functionality using the Firefox browser, name this test as test_on_firefox.py and copy the following code:
    import unittest
    
    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.webdriver.support.ui import WebDriverWait
    
    
    class OnFirefox(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Remote(
                command_executor='http://localhost:4444/wd/hub',desired_capabilities=DesiredCapabilities.FIREFOX)
    
        def test_gogle_search_ie(self):
            driver = self.driver
            driver.get("http://www.google.com")
    
            inputElement = driver.find_element_by_name("q")
            inputElement.send_keys("Cheese!")
            inputElement.submit()
    
            WebDriverWait(driver, 20).until(lambda driver: driver.title.lower().startswith("cheese!"))
            self.assertEqual("cheese! - Google Search", driver.title)
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == "__main__":
        unittest.main(verbosity=2)
  2. For the second Python test, which will test the application functionality using the Internet Explorer browser, name this test as test_on_ie.py and copy the following code:
    import unittest
    
    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.webdriver.support.ui import WebDriverWait
    
    class OnFirefox(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub',desired_capabilities=DesiredCapabilities.INTERNETEXPLORER)
    
        def test_google_search_ff(self):
            driver = self.driver
            driver.get("http://www.google.com")
    
            inputElement = driver.find_element_by_name("q")
            inputElement.send_keys("Cheese!")
            inputElement.submit()
    
            WebDriverWait(driver, 20).until(lambda driver: driver.title.lower().startswith("cheese!"))
            self.assertEqual("cheese! - Google Search", driver.title)
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == "__main__":
        unittest.main(verbosity=2)
  3. Finally, we need to create a Python script, which will use the subprocess module to run these tests concurrently on different nodes. Name this script as runner.py and copy the following code:
    import glob
    
    from subprocess import Popen
    
    tests = glob.glob('test*.py')
    processes = [Popen('python %s' % test, shell=True) for test in tests]
    
    for process in processes:
        process.wait()

How it works...

We need to place all three scripts in the same directory. When we execute runner.py, it collects all the tests with names starting with test using the glob function. Then we append each test using the Popen function from the subprocess module. The Popen() function calls each test using Python as a subprocess of the main process and waits for the script to complete.

There's more...

We can also use the nose module for Python to run the tests in parallel. First, we need to install the nose unit testing framework using the following command:

pip nose

After the nose module is installed, you need to open the folder where all the tests are stored and use the following command:

nosetests --processes=2

This will call the nosetests scripts, which will locate all the files with a test prefix in the current directory and start running tests concurrently. In this example we are running two tests, so we need to specify the value for processes argumented as 2. The nose module internally uses a multiprocessing module for concurrent execution.

See also

  • The Creating and executing the Selenium script in parallel with TestNG recipe
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.138.37.151