Getting Started with GitHub Actions and CrossBrowserTesting

For this document, we provide all example files in our GitHub Actions GitHub Repository.

GitHub Actions is a CI/CD tool that lets you automate your development process.  GitHub Actions lets you build, test, and deploy your code all from GitHub quickly, safely, and at scale.  Every time you push, a build is created and automatically run, allowing you to easily test every commit.

In this guide we will use GitHub Actions for testing using the Selenium Webdriver and Python programming language.

Creating A GitHub Actions Work Flow

1. Select the Actions button for your repository

2. We'll be using the Python Package Workflow for this example

3. Make the following changes to the workflow .yml file and commit

name: Python package
on: [push]

jobs: build:

runs-on: ubuntu-latest
strategy:
  max-parallel: 4
  matrix:
    python-version: [2.7, 3.5, 3.7]

steps:
- uses: actions/checkout@v1
- name: Set up Python ${{ matrix.python-version }}
  uses: actions/setup-python@v1
  with:
    python-version: ${{ matrix.python-version }}
- name: Install dependencies
  run: |
    python -m pip install --upgrade pip
    pip install -r requirements.txt
- name: Lint with flake8
  run: |
    pip install flake8
    # stop the build if there are Python syntax errors or undefined names
    flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
    # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
    flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test With CrossBrowserTesting
  env:
    CBT_USERNAME: ${{ secrets.CBT_USERNAME }}
    CBT_AUTHKEY: ${{ secrets.CBT_AUTHKEY }}
  run: |
    python test.py </code></pre>

Setting up a test

1. Create file test.py, add the following, and commit:

import unittest
from selenium import webdriver
import requests
import os
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

class LoginForm(unittest.TestCase): def setUp(self):

    # Put your username and authkey below
    # You can find your authkey at crossbrowsertesting.com/account
    self.username = os.environ.get('CBT_USERNAME')
    self.authkey  = os.environ.get('CBT_AUTHKEY')

    self.api_session = requests.Session()
    self.api_session.auth = (self.username,self.authkey)

    self.test_result = None

    caps = {}

    caps['name'] = 'Github Actions Example'
    caps['browserName'] = 'Chrome'
    caps['platform'] = 'Windows 10'
    caps['screenResolution'] = '1366x768'
    caps['username'] = self.username
    caps['password'] = self.authkey
    caps['record_video'] = 'true'

    self.driver = webdriver.Remote(
        desired_capabilities=caps,
        #command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub"%(self.username,self.authkey)
        command_executor="http://hub.crossbrowsertesting.com:80/wd/hub"
    )

    self.driver.implicitly_wait(20)

def test_CBT(self):

    try:
        self.driver.get('http://crossbrowsertesting.github.io/login-form.html')
        self.driver.maximize_window()
        self.driver.find_element_by_name('username').send_keys('tester@crossbrowsertesting.com')
        self.driver.find_element_by_name('password').send_keys('test123')
        self.driver.find_element_by_css_selector('body &gt; div &gt; div &gt; div &gt; div &gt; form &gt; div.form-actions &gt; button').click()

        elem = WebDriverWait(self.driver, 10).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id=\"logged-in-message\"]/h2'))
        )

        welcomeText = elem.text
        self.assertEqual("Welcome tester@crossbrowsertesting.com", welcomeText)

        print("Taking snapshot")
        snapshot_hash = self.api_session.post('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots').json()['hash']

        self.test_result = 'pass'

    except AssertionError as e:
        # log the error message, and set the score to "during tearDown()".
        self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id + '/snapshots/' + snapshot_hash,
            data={'description':"AssertionError: " + str(e)})
        self.test_result = 'fail'
        raise

def tearDown(self):
    print("Done with session %s" % self.driver.session_id)
    self.driver.quit()
    # Here we make the api call to set the test's score.
    # Pass it it passes, fail if an assertion fails, unset if the test didn't finish
    if self.test_result is not None:
        self.api_session.put('https://crossbrowsertesting.com/api/v3/selenium/' + self.driver.session_id,
            data={'action':'set_score', 'score':self.test_result})

if name == 'main': unittest.main()

2. Create file requirements.txt  and commit with the following:

requests==2.22.0
selenium==3.141.0

Setting Your Username and Authkey For Your Workflow

You’ll need to use your Username and Authkey to run your tests on CrossBrowserTesting. To get yours, sign up for a free trial or purchase a plan.

Your username and authkey will be used in your workflow as environment variables.

1. Settings

2. Add the username and authkey as Secrets

3. Add CBT_USERNAME

4. Add CBT_AUTHKEY

Congratulations! You have now successfully integrated CBT and GitHub Actions. Now you are ready to see your build run from the GitHub Actions dashboard and in the Crossbrowsertesting app.

Conclusions

By following the steps outlined in this guide, you are now able to seamlessly integrate GitHub Actions and CrossBrowserTesting. If you have any questions or concerns, please feel free to reach out to our support team.