Skip to content

britishgas-engineering/ya-done

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ya-done

Ready to use yadda BBD test framework with selenium-webdriver and chai

npm  i  ya-done --save

The aim of this package is to build a simple configuration for 'yadda' to enable QA test engineers to productively build test projects for web projects using JavaScript.

ya-done configures 'yadda' with chai with 'selenium-webdriver'. 'yadda' has been created with two context properties. 'selenium-webdriver' can be accessed via the property 'driver'. Additionally a property of 'ctx', type object, has been added to allow the passing of data between steps.

ya-done allows testing with the following devices or technologies:

  • Chromedriver
  • Geckodriver
  • Continuous Testing (Browserstack, Perfecto, etc)
  • Appium

Please check the configuration to launch Chrome and FireFox in Local environment

Technologies Used

Below are some Continuous Testing providers which have been used with ya-done

Default steps

ya-done has preconfigured "set-up" and "tear down" steps.

  • a web browser (sets window size, solves lots of webdriver common problems)
  • end the test (calls quit on webdriver, only to be used on last scenario in the last feature file)

These steps are added to the yadda library by default and are used in the example project and seen below.

ya-done exposes "yaddaCore" which requires a step library to run

Configuration (standard)

The web-browser to be used for testing can be defined by either a string or configuration object.

When using a configuration object the window size can also be set. Capabiltiies can also be set depending on the chosen browser as highlighted below.

Chrome Browser

import { yaddaCore } from  'ya-done';
import  steps  from  './steps';

/* configure */
yaddaCore(steps, {
  useBrowser:  true,
  capabilities: {
    browserName:  'chrome',
    args: [
    '--disable-background-networking',
    '--disable-background-timer-throttling',
    '--disable-client-side-phishing-detection',
    '--disable-default-apps',
    '--disable-hang-monitor',
    '--disable-popup-blocking',
    '--disable-prompt-on-repost',
    '--disable-sync',
    '--metrics-recording-only',
    '--no-first-run',
    '--safebrowsing-disable-auto-update',
    '--enable-automation',
    '--password-store=basic',
    '--use-mock-keychain',
    '--user-data',
    '--hide-scrollbars',
    '--mute-audio',
    '--disable-setuid-sandbox',
    "--disable-dev-shm-usage",
    "--disable-gpu",
    "--no-default-browser-check",
    "--disable-extensions",
    "--disable-translate",
    "--disable-logging",
    "--headless",
    "--no-sandbox",
    "--remote-debugging-port=0",
    "--window-size=1440,900",
    "--disable-web-security",
    "--disable-renderer-backgrounding",
    "--disable-background-timer-throttling"
    ]
  }
});

FireFox Browser

import { yaddaCore } from  'ya-done';
import  steps  from  './steps';

/* configure */
yaddaCore(steps, {
useBrowser:  true,
capabilities: {
  browserName:  'chrome',
  "alwaysMatch": {
        "moz:firefoxOptions": {
        "args": [
        '--disable-background-networking',
        '--disable-background-timer-throttling',
        '--disable-client-side-phishing-detection',
        '--disable-default-apps',
        '--disable-hang-monitor',
        '--disable-popup-blocking',
        '--disable-prompt-on-repost',
        '--disable-sync',
        '--metrics-recording-only',
        '--no-first-run',
        '--safebrowsing-disable-auto-update',
        '--enable-automation',
        '--password-store=basic',
        '--use-mock-keychain',
        '--user-data',
        '--hide-scrollbars',
        '--mute-audio',
        '--disable-setuid-sandbox',
        "--disable-dev-shm-usage",
        "--disable-gpu",
        "--no-default-browser-check",
        "--disable-extensions",
        "--disable-translate",
        "--disable-logging",
        "--headless",
        "--no-sandbox",
        "--remote-debugging-port=0",
        "--window-size=1440,900",
        "--disable-web-security",
        "--disable-renderer-backgrounding",
        "--disable-background-timer-throttling"
        ]
      }
    }
  }
});

Configuration (Continuous Testing)

For any continuous product, add a configuration object as the second parameter in yaddaCore.

From version 1.5.0

Server must now be specified in yaddaCore when using any provider e.g. Browserstack, Perfecto. This removes the restriction of only being able to use Browserstack for continuous testing.

import { yaddaCore } from  'ya-done';
import  steps  from  './steps';

/* Browserstack */
yaddaCore(steps, {
  server: 'http://hub-cloud.browserstack.com/wd/hub',
  capabilities: {
    browserName: 'Chrome', // other browsers available
    browser_version: '85', // if we don't pass it will pick latest
    os: 'Windows',
    os_version: '8',
    resolution: '1024x768',
    'browserstack.user': ${ your_id },
  'browserstack.key': ${ your_pass },
  },
  });

  /* Perfecto */
  yaddaCore(steps, {
  server: 'https://INSERT_PERFECTO_HOST_HERE/nexperience/perfectomobile/wd/hub/fast',
  capabilities: {
      platformName: 'Windows',
      platformVersion: '10',
      browserName: 'Chrome',
      browserVersion: '85',
      resolution: '1280x1024',
    securityToken: 'INSERT_SECURITY_TOKEN'
  },
  });

Configuration (mobile)

For mobile add useMobile: true into your yaddaCore configuration as highlighted below.

All what is required to run on mobile are the below technologies:

import { yaddaCore } from  'ya-done';
import  steps  from  './steps';

/* configuration for iPhone */
  yaddaCore(steps, {
    useMobile: true,
    capabilities: {
      platformName: 'iOS',
      deviceName: 'iPhone X',
      browserName: 'Safari',
      automationName: 'XCUITest',
      platformVersion: '12.2'
    }
  });
  /* configuration for Android */
  yaddaCore(steps, {
    useMobile: true,
    capabilities: {
      platformName: 'Android',
      deviceName: 'Samsung Galaxy S7 API Q',
      browserName: 'Chrome',
      automationName: 'uiautomator2',
      platformVersion: 'Q'
    }
  });

Execution Style:

We have added a new property stepLevel which can be sent as a part of yaddaCore to trigger the test cases in the step level or Scenario Level.

stepLevel:true --> will run the tests and will display each individual step used by that test.
stepLevel:false --> will run the tests at scenario level.  

Config Example

yaddaCore(allSteps, {
  useBrowser: true,
  stepLevel: true,
  capabilities: {
    browserName: 'chrome',
    args
  }
});

Adding a dictionary

Dictionaries have been abstracted for simple use in ya-done. Dictionaries allow the use of tables and variables within steps.

Pass in an array of objects to the yaddaLibrary. Objects need to have a name property and a type property. The name will equal the variable name to be used in the table and step. The type must be one of the 3 dictionaryTypes in ya-done. (String types are supported in yadda by default and require no dictionary configuration, a string variable will require step configuration though).

  • dictionaryTypes.TYPE_JSON

  • dictionaryTypes.TYPE_INTEGER

  • dictionaryTypes.TYPE_FLOAT

Example Dictionary

import { dictionaryTypes } from  'ya-done';

// define a dictionary
const  dictionary = [
  {
  name:  'dataObject',
  type:  dictionaryTypes.TYPE_JSON,

  },{

  name:  'smallNumber'
  type: dictionaryTypes.TYPE_INTEGER,

  },{

  name:  'bigNumber'
  type: dictionaryTypes.TYPE_FLOAT,

  }
];

Example use

Using the example project provided.

sample project structure

│ index.js
└───steps

│ │ index.js

└───features

│ hello.feature

index.js (project level)

import { yaddaCore } from  'ya-done';
yaddaCore(steps, {
useBrowser:  true,
capabilities: {
browserName:  'chrome',
args: [
'--disable-background-networking',
'--disable-background-timer-throttling',
'--disable-client-side-phishing-detection',
'--disable-default-apps',
'--disable-hang-monitor',
'--disable-popup-blocking',
'--disable-prompt-on-repost',
'--disable-sync',
'--metrics-recording-only',
'--no-first-run',
'--safebrowsing-disable-auto-update',
'--enable-automation',
'--password-store=basic',
'--use-mock-keychain',
'--user-data',
'--hide-scrollbars',
'--mute-audio',
'--disable-setuid-sandbox',
"--disable-dev-shm-usage",
"--disable-gpu",
"--no-default-browser-check",
"--disable-extensions",
"--disable-translate",
"--disable-logging",
"--headless",
"--no-sandbox",
"--remote-debugging-port=0",
"--window-size=1440,900",
"--disable-web-security",
"--disable-renderer-backgrounding",
"--disable-background-timer-throttling"
]
}
});

hello.feature

Feature: ya-done example

Scenario: webdriver is simple with ya-done
Given a web browser
When the browser navigates to github
Then the headers should not be hello world
And end the test will quit the driver

Where:
--------------------------------------------------------------------
| dataObject | smallNumber | bigNumber |
| [{"stuff": true, "otherStuff": true}] | 1 | 11.00 |
--------------------------------------------------------------------

index.js

import { yaddaCore, yaddaLibrary, dictionaryTypes } from  'ya-done';

// define a dictionary

const  dictionary = [
  {
  name:  'dataObject',
  type:  dictionaryTypes.TYPE_JSON,
  },
  {
  name:  'smallNumber'
  type: dictionaryTypes.TYPE_INTEGER,
  },
  {
  name:  'bigNumber'
  type: dictionaryTypes.TYPE_FLOAT,
  }
];

yaddaCore(() =>
  yaddaLibrary(dictionary)
  .when('the browser navigates to github', function  loadGithub(next) {
  this.driver.get('http://github.com');
  next();
  })
  .then('the headers should not be hello world', next  => {
  expect('#site-container h1.heading').dom.to.not.contain.text('hello world');
  next();
  })
);

install and run the project

npm  i
npm  test

how to consume reading scenario count from feature files

In local index.js:

  • import the count scenarios function -->
import {countScenarios} from 'ya-done';
  • countScenarios(filePath) (Where file path is where your feature files are stored)

how to consume the common selenium Functions

  • import the utils from ya-done
import { utils } from 'ya-done';
Available Functions:
  • findElement
  • waitForElement
  • waitForElements
  • getTextOfElement
  • getAttribute
  • clickElement
  • getCurrentUrl
  • findElements
  • waitForPageLoad
  • waitOneSec
  • enterValue
  • scrollInto
  • isElementPresent
  • dropdownSelectByVisibleText
  • isElementVisible
  • clickShadowRootElement
  • getInnerTextOfShadowRootElement
  • clickShadowRootElementByCssSelector
  • getInnerTextShadowRootElementByCssSelector
  • performJqueryAction
  • enterValuesForShadowRootElement
  • getLengthForShadowRootElement
  • generateNumbers

To Use these functions the QA team needs to store their webElements in the below fashion, and pass in the function

e.g.:

const elementOne = {
  locator : '.classname .otherClasses',
  locatorType: 'css'
}

const elementTwo = {
  locator : '//div[@name='test'],
  locatorType: 'xpath'
}

Then call the function like

import { utils } from 'ya-done'
await utils.clickElement.call(this, elementOne);
await utils.getTextOfElement.call(this, elementTwo);