avatarGrig Gheorghiu

Summary

The website content provides a guide on running Selenium WebDriver tests in headless mode using Firefox on Ubuntu, detailing the setup process and including a Python script example for automating browser interactions.

Abstract

The article on the undefined website outlines the process of setting up and running Selenium WebDriver tests in a headless Firefox environment on Ubuntu. It emphasizes the advantages of using WebDriver over Selenium IDE for a more robust testing workflow, including load testing. The guide includes step-by-step instructions for installing the necessary software, such as the Firefox Beta PPA, Xvfb (X windows virtual framebuffer), and the Selenium Python package. It also provides a detailed Python script that demonstrates how to automate tasks like clicking on categories, adding items to a cart, and filling out user information on an e-commerce website. The script showcases the use of explicit waits, handling alerts, and managing browser sessions. The author notes that while using XPath for locating elements might not be the best practice, it was necessary due to the inability to locate elements by ID, and they also acknowledge the use of time.sleep() for handling asynchronous page loads, despite it not being an ideal solution.

Opinions

  • The author suggests that Selenium IDE is limited to manual interactions and that Selenium WebDriver is superior for automated testing scenarios.
  • The author expresses that running Firefox in headless mode on Ubuntu is straightforward and beneficial for command-line users.
  • There is an opinion that using XPath to locate elements is less desirable than other methods but sometimes necessary due to limitations in locating elements by ID.
  • The author indicates a pragmatic approach to testing by using time.sleep() to wait for page elements to load, acknowledging it as a less-than-ideal practice but effective in certain situations.
Source: seleniumhq.org

Running Selenium WebDriver tests using Firefox headless mode on Ubuntu

Selenium IDE is a very good tool for recording and troubleshooting Selenium tests, but you are limited to clicking around in a GUI. For a better testing workflow, including load testing, you need to use Selenium WebDriver, which can programatically drive a browser and run Selenium test cases.

In its default mode, WebDriver will launch a browser and run the test scripts in the browser, then exit. If you like to work exclusively from the command line, then you need to look into running the browser in headless mode. Fortunately, this is easy to do with Firefox on Ubuntu. Here’s what you need to do:

Install the official Firefox Beta PPA

$ sudo apt-add-repository ppa:mozillateam/firefox-next

(this will add the file /etc/apt/sources.list.d/mozillateam-firefox-next-trusty.list and also fetch the PPA’s key, which enables your Ubuntu system to verify that the packages in the PPA have not been interfered with since they were built)

Run apt-get update

$ sudo apt-get update

Install firefox and xvfb (the X windows virtual framebuffer) packages

$ sudo apt-get install firefox xvfb

Run Xvfb in the background and specify a display number (10 in my example)

$ Xvfb :10 -ac &

Set the DISPLAY variable to the number you chose

$ export DISPLAY=:10

Test that you can run firefox in the foreground with no errors

$ firefox

(kill it with Ctrl-C)

Now run your regular Selenium WebDriver scripts (no modifications required if they already use Firefox as their browser).

Here is an example of a script I have written in Python, which clicks on a category link in an e-commerce store, adds an item to the cart, that starts filling out the user’s information in the cart:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re, random
class SelWebdriverNewUser(unittest.TestCase):
 def setUp(self):
 self.driver = webdriver.Firefox()
 self.driver.implicitly_wait(20)
 self.base_url = “http://myhost.mycompany.com/"
 self.verificationErrors = []
 self.accept_next_alert = True
def test_sel_webdriver_new_user(self):
 driver = self.driver
 HOST = “myhost.mycompany.com”
 RANDINT = random.random()*10000
 driver.get(“https://” + HOST)
 
 # Click on category link
 driver.find_element_by_xpath(“//*[@id=’nav’]/ol/li[3]/a”).click()
 # Click on sub-category link
 driver.find_element_by_xpath(“//*[@id=’top’]/body/div/div[2]/div[2]/div/div[2]/ul/li[4]/a/span”).click()
 # Click on product image
 driver.find_element_by_xpath(“//*[@id=’product-collection-image-374']”).click()
 # Click Checkout button
 driver.find_element_by_xpath(“//*[@id=’checkout-button’]/span/span”).click()
 driver.find_element_by_id(“billing:firstname”).clear()
driver.find_element_by_id(“billing:firstname”).send_keys(“selenium”, RANDINT, “_fname”)
 driver.find_element_by_id(“billing:lastname”).clear()
 driver.find_element_by_id(“billing:lastname”).send_keys(“selenium”, RANDINT, “_lname”)
 # Click Place Order
 driver.find_element_by_xpath(“//*[@id=’order_submit_button’]”).click()
def is_element_present(self, how, what):
 try: self.driver.find_element(by=how, value=what)
 except NoSuchElementException as e: return False
 return True
def is_alert_present(self):
 try: self.driver.switch_to_alert()
 except NoAlertPresentException as e: return False
 return True
def close_alert_and_get_its_text(self):
 try:
   alert = self.driver.switch_to_alert()
   alert_text = alert.text
   if self.accept_next_alert:
     alert.accept()
   else:
     alert.dismiss()
   return alert_text
 finally: self.accept_next_alert = True
def tearDown(self):
 self.driver.quit()
 self.assertEqual([], self.verificationErrors)
if __name__ == “__main__”:
 unittest.main()

To run this script, you first need to install the selenium Python package:

$ sudo pip install selenium

Then run the script (called selenium_webdriver_new_user.py in my case):

$ python selenium_webdriver_new_user.py

After hopefully not so long of a wait, you should see a successful test run:

$ python selenium_webdriver_new_user.py
.
 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Ran 1 test in 29.317s

A few notes regarding Selenium WebDriver scripts.

I was stumped for a while when I was trying to use the “find_element_by_id” form of finding an HTML element on a Web page. It was working fine in Selenium IDE, but Selenium WebDriver couldn’t find that element. I had to resort to finding all elements via their XPath id using “find_element_by_xpath”. Fortunately, Chrome for example makes it easy to right click an element on a page, choose Inspect, then righ click the HTML code for the element and choose Copy->Copy XPath to get their id which can then be pasted in the Selenium WebDriver script.

I also had to use time.sleep(N) (where N is in seconds at least for Python) to wait for certain elements of the page to load asynchronously. I know it’s not best practices, but it works.

Ubuntu
Selenium
Firefox
Recommended from ReadMedium