Python: Selenium Tests

(Last Updated On: )

Selenium is a great way to test your UI. It is compatible with different browsers. I will show you two.

Gecko Driver Installation:

Make sure you are using latest version. At the time of this writing it is 0.19.0.

  1. wget https://github.com/mozilla/geckodriver/releases/download/v0.19.0/geckodriver-v0.19.0-linux64.tar.gz
  2. sudo tar -xvzf geckodriver-v0.19.0-linux64.tar.gz
  3. sudo chmod +x geckodriver
  4. cp geckodriver /usr/local/bin/
  5. sudo cp geckodriver /usr/local/bin/

You can use phantomjs, firefox, chrome, etc.

PhantomJS Installation:

  1. sudo mv phantomjs-2.1.1-linux-x86_64.tar.bz2 /usr/local/share/.
  2. cd /usr/local/share/
  3. sudo tar xjf phantomjs-2.1.1-linux-x86_64.tar.bz2
  4. sudo ln -s /usr/local/share/phantomjs-2.1.1-linux-x86_64 /usr/local/share/phantomjs
  5. sudo ln -s /usr/local/share/phantomjs/bin/phantomjs /usr/local/bin/phantomjs

Firefox Installation:

  1. sudo apt-get update
  2. wget https://ftp.mozilla.org/pub/firefox/releases/50.0/linux-x86_64/en-US/firefox-50.0.tar.bz2
  3. sudo tar -xjf firefox-50.0.tar.bz2
  4. sudo rm -rf /opt/firefox
  5. sudo mv firefox /opt/firefox
  6. sudo mv /usr/bin/firefox /usr/bin/firefoxold
  7. sudo ln -s /opt/firefoxX/firefox /usr/bin/firefox

Firefox Headless Installation:

  1. sudo apt-get install xvfb
  2. pip3 install pyvirtualdisplay==0.2.1

Selenium Installation:

  1. pip3 install selenium==3.6.0

PyUnit Selenium Test Examples:

Setup:

  1. #If you are using headless firefox
  2. from pyvirtualdisplay import Display
  3. #The selenium imports
  4. from selenium import webdriver
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.support import expected_conditions as EC
  7. from selenium.webdriver.support.ui import WebDriverWait
  8. import unittest, os, time
  9.  
  10. class MySeleniumTests(unittest.TestCase):
  11. @classmethod
  12. def setUpClass(self):
  13. self.server_url = "http://" + os.getenv("WEBSITE_URL", 'localhost:5000')
  14.  
  15. def setUp(self):
  16. #if you are using firefox headless browser
  17. display = Display(visible=0, size=(1080, 720))
  18. display.start()
  19. #Firefox selenium driver.
  20. self.driver = webdriver.Firefox()
  21. #PhantomJS selenium driver
  22. self.driver = webdriver.PhantomJS()
  23. self.driver.implicitly_wait(60)
  24. self.driver.set_page_load_timeout(60)
  25. self.driver.set_window_size(1080, 720)
  26. self.base_url = self.server_url
  27.  
  28. self.driver.get(self.base_url + "/")
  29. #If your site has a login then you need to set the username and password first.
  30. self.driver.find_element_by_id("user").clear()
  31. self.driver.find_element_by_id("user").send_keys(USERNAME)
  32. self.driver.find_element_by_id("password").clear()
  33. self.driver.find_element_by_id("password").send_keys(PWD)
  34. self.driver.find_element_by_id("submit").click()
  35. time.sleep(1)
  36.  
  37. def tearDown(self):
  38. self.driver.quit()
  39.  
  40. if __name__ == "__main__":
  41. unittest.main()

Test Title:

  1. self.driver.get(self.server_url)
  2. self.assertIn("MySite", self.driver.title)

Find Class:

  1. self.assertTrue(WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CLASS_NAME, "my-awesome-class"))))

Find ID:

  1. self.assertTrue(WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.ID, "myId"))))

Find Partial Text:

  1. self.driver.find_element_by_partial_link_text("My Text On Page")

Find Element Contains Text:

  1. self.assertTrue('MyText' in self.driver.find_element_by_id('container').text)

Click Element:

  1. self.driver.find_element_by_id('myId').click()

Wait Element To Show:

  1. self.assertTrue(WebDriverWait(self.driver, 10).until(EC.text_to_be_present_in_element((By.ID, 'MyID'), "Text To See")))

xPath Click Second Element:

  1. self.driver.find_element_by_xpath("(//div[@class='my-awesome-class'])[1]").click()

Clear Input:

  1. self.driver.find_element_by_id("myId").clear()

Send Data To Input:

  1. self.driver.find_element_by_id("myId").send_keys('My New Data')