Utility configuration and functions for Cucumber and WebdriverIO that can be used when writing acceptance test for web applications.
This project is a port of the Cucumber Boilerplate developed by Christian Broman to the NPM package and aims to create a easily reusable setup.
- Super simple setup
- Full integration with WebdriverIO
- Over 150 predefined steps that cover almost everything you need, you can start writing tests right away
- Easy integration with cloud services like Sauce Labs
- Integration of WebdriverIO's Multiremote functionality
- Easy to run tests in parallel
Tests are written in Gherkin syntax
that means that you write down what's supposed to happen in a real language. All test files are located in
./test/features/*
and have the file ending .feature
. You will already find some test files in that
directory. They should demonstrate, how tests could look like. Just create a new file and write your first
test.
myFirstTest.feature
Feature:
In order to keep my product stable
As a developer or product manager
I want to make sure that everything works as expected
Scenario: Check title of website after search
Given I open the url "http://google.com"
When I set "WebdriverIO" to the inputfield "#gbqfq"
And I press "Enter"
Then I expect that the title is "WebdriverIO - Google Search"
Scenario: Another test
Given ...
This test opens the browser and navigates them to google.com to check if the title contains the search query after doing a search. As you can see, it is pretty simple and understandable for everyone.
Create wdio.conf.js and import the wdio config from the NPM package:
import { config } from 'wdio-cucumber-utilities/lib/config';
export config;
Now run wdio
and it will run any features that are present in the test/features/
directory.
To configure your tests, checkout the config.js
file in your test directory. It comes with a bunch of documented options you can choose from.
Sometimes its usefull to only execute a single feature file, to do so use the following command:
$ wdio --spec ./test/features/select.feature
If you want to run only specific tests you can mark your features with tags. These tags will be placed before each feature like so:
@Tag
Feature: ...
To run only the tests with specific tag(s) use the --tags=
parameter like so:
$ wdio --tags=@Tag,@AnotherTag
You can add multiple tags separated by a comma
If you have failing or unimplemented tests you can mark them as "Pending" so they will get skipped.
// skip whole feature file
@Pending
Feature: ...
// only skip a single scenario
@Pending
Scenario: ...
wdio cucumber utitilies comes with a predefined set of utility functions. You can add or override
utility functions by overriding or extending cucumberOpts.require
and adding your own paths.
import { config } from 'wdio-cucumber-utilities/lib/config';
config.cucumberOpts.require = ['tests/steps/myOwnSteps.js'].concat(config.cucumberOpts.require);
export config;
You define your snippet using regular expressions. This is pretty powerful as it allows you to create complex
sentences with multiple options. Everything that's within "([^"]*)?"
gets captured and appended to the
callback. The last argument is always a callback function that you need to call when your step is done.
You can access the browser and your WebdriverIO instance with browser
.
To assert values this boilerplate project comes with a Chai integration.
You can add additional descriptive comments in your feature files.
###
This is a
block comment
###
Feature: As a bystander
I can watch bottles falling from a wall
So that I can be mildly amused
# This is a single line comment
Scenario: check if username is present
Given I login as "roboter" with password "test123"
Then the username "roboter" should be present in the header
Check out all predefined snippets. You can see how they get used in sampleSnippets.feature
.
I open the (url|site) "([^"]*)?"
Open a site in the current browser window/tabthe element "([^"]*)?" is( not)* visible
Check the (in)visibility of a elementthe element "([^"]*)?" is( not)* enabled
Check if a element is (not) enabledthe element "([^"]*)?" is( not)* selected
Check if a element is (not) selectedthe checkbox "([^"]*)?" is( not)* checked
Check if a checkbox is (not) checkedthere is (an|no) element "([^"]*)?" on the page
Check if a element (does not) existthe title is( not)* "([^"]*)?"
Check the title of the current browser window/tabthe element "([^"]*)?" contains( not)* the same text as element "([^"]*)?"
Compaire the text of two elementsthe (element|inputfield) "([^"]*)?" does( not)* contain the text "([^"]*)?"
Check if a element contains the given textthe (element|inputfield) "([^"]*)?" does( not)* contain any text
Check if a element does not contain any textthe page url is( not)* "([^"]*)?"
Check the url of the current browser window/tabthe( css)* attribute "([^"]*)?" from element "([^"]*)?" is( not)* "([^"]*)?"
Check the value of a element's (css) attributethe cookie "([^"]*)?" contains( not)* the value "([^"]*)?"
Check the value of a cookiethe cookie "([^"]*)?" does( not)* exist
Check the existence of a cookiethe element "([^"]*)?" is( not)* ([\d]+)px (broad|tall)
Check the width/height of a elementthe element "([^"]*)?" is( not)* positioned at ([\d]+)px on the (x|y) axis
Check the position of a elementI have a screen that is ([\d]+) by ([\d]+) pixels
Set the browser size to a given sizeI have closed all but the first (window|tab)
Close all but the first browser window/taba (alertbox|confirmbox|prompt) is( not)* opened
Check if a modal is opened
I expect that the title is( not)* "([^"]*)?"
Check the title of the current browser window/tabI expect that element "([^"]*)?" is( not)* visible
Check if a certain element is visibleI expect that element "([^"]*)?" becomes( not)* visible
Check if a certain element becomes visibleI expect that element "([^"]*)?" is( not)* within the viewport
Check if a certain element is within the current viewportI expect that element "([^"]*)?" does( not)* exist
Check if a certain element existsI expect that element "([^"]*)?" does( not)* contain the same text as element "([^"]*)?"
Compare the text of two elementsI expect that (element|inputfield) "([^"]*)?"( not)* contains the text "([^"]*)?"
Check if a element or input field contains the given textI expect that (element|inputfield) "([^"]*)?" does( not)* contain any text
Check if a element or input field contains any textI expect that (element|inputfield) "([^"]*)?" is( not)* empty
Check if a element or input field is emptyI expect that the url is( not)* "([^"]*)?"
Check if the the URL of the current browser window/tab is a certain stringI expect that the path is( not)* "([^"]*)?"
Check if the path of the URL of the current browser window/tab is a certain stringI expect the url to( not)* contain "([^"]*)?"
Check if the URL of the current browser window/tab contains a certain stringI expect that the( css)* attribute "([^"]*)?" from element "([^"]*)?" is( not)* "([^"]*)?"
Check the value of a element's (css) attributeI expect that checkbox "([^"]*)?" is( not)* checked
Check if a check-box is (not) checkedI expect that element "([^"]*)?" is( not)* selected
Check if a element is (not) selectedI expect that element "([^"]*)?" is( not)* enabled
Check if a element is (not) enabledI expect that cookie "([^"]*)?"( not)* contains "([^"]*)?"
Check if a cookie with a certain name contains a certain valueI expect that cookie "([^"]*)?"( not)* exists
Check if a cookie with a certain name existI expect that element "([^"]*)?" is( not)* ([\d]+)px (broad|tall)
Check the width/height of an elementI expect that element "([^"]*)?" is( not)* positioned at ([\d]+)px on the (x|y) axis
Check the position of an elementI expect that element "([^"]*)?" (has|does not have) the class "([^"]*)?"
Check if a element has a certain classI expect a new (window|tab) has( not)* been opened
Check if a new window/tab has been openedI expect the url "([^"]*)?" is opened in a new (tab|window)
Check if a URL is opened in a new browser window/tabI expect that element "([^"]*)?" is( not)* focused
Check if a element has the focusI wait on element "([^"]*)?"( for (\d+)ms)*( to( not)* (be checked|be enabled|be selected|be visible|contain a text|contain a value|exist))*
Wait for a element to be checked, enabled, selected, visible, contain a certain value or text or to existI expect that a (alertbox|confirmbox|prompt) is( not)* opened
Check if a modal is openedI expect that a (alertbox|confirmbox|prompt)( not)* contains the text "$text"
Check the text of a modal
I (click|doubleclick) on the (link|button|element) "([^"]*)?"
(Double)click a link, button or elementI (add|set) "([^"]*)?" to the inputfield "([^"]*)?"
Add or set the content of an input fieldI clear the inputfield "([^"]*)?"
Clear an input fieldI drag element "([^"]*)?" to element "([^"]*)?"
Drag a element to another elementI submit the form "([^"]*)?"
Submit a formI pause for (\d+)ms
Pause for a certain number of millisecondsI set a cookie "([^"]*)?" with the content "([^"]*)?"
Set the content of a cookie with the given name to the given stringI delete the cookie "([^"]*)?"
Delete the cookie with the given nameI press "([^"]*)?"
Press a given key. You’ll find all supported characters here. To do that, the value has to correspond to a key from the table.I (accept|dismiss) the (alertbox|confirmbox|prompt)
Accept or dismiss a modal windowI enter "([^"]*)?" into the prompt
Enter a given text into a modal promptI scroll to element "([^"]*)?"
Scroll to a given elementI close the last opened (window|tab)
Close the last opened browser window/tabI focus the last opened (window|tab)
Focus the last opened browser window/tabI log in to site with username "([^"]*)?" and password "([^"]*)?"
Login to a site with the given username and passwordI select the (\d+)(st|nd|rd|th) option for element "([^"]*)?"
Select a option based on it's indexI select the option with the (name|value|text) "([^"]*)?" for element "([^"]*)?"
Select a option based on it's name, value or visible textI move to element "([^"]*)?"( with an offset of (\d+),(\d+))
Move the mouse by an (optional) offset of the specified element