Boilerplate project to show examples of integrating our Applause Reporter plugins with various frameworks.
Applause provides default configuration file in most cases.
For Applause custom options, the default configuration utilizes applause.json
, which must be modified to include your unique values.
Once applause.json
is filled, run script ./scripts/copy-reporter-json.sh
to copy the configurations to the defined runner locations.
We support runing WebdriverIO (v7) tests with any test runner supported by the WebDriverIO Runner.
We support the mocha test runner. This example uses Playwright to write tests.
We also support running tests with Cucumber outside of WebDriverIO
- Node version 12 or higher
- A preconfigured Selenium Grid, preinstalled browser driver or cloud provider account
Although this project works fine with NPM we recommend to use Yarn (>= 1.0.0) instead, due to its speed & solid dependency locking mechanism. To keep things simple we use yarn in this guide, but feel free to replace this with NPM if that is what you are using.
Also this project doesn't cover setting up a proper test environment. You need to download specific browser driver yourself and run the prior starting tests or use a cloud provider like SauceLabs.
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
./src/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.
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 "#lst-ib"
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.
Start the local web server, then you can run
npm run test:selenium:wdio:cucumber
please note The WDIO runner uses the configuration file wdio.conf.ts
by default.
To configure your tests, checkout the wdio.conf.ts
file in your test directory. It comes with a bunch of documented options you can choose from.
You can setup multiple configs for specific environments. Let's say you want to have a different baseUrl
for
your local and pre-deploy tests. Use the **wdio.conf.ts**
to set all general configs (like mochaOpts) that don't change.
They act as default values. For each different environment you can create a new config with the following name
scheme:
wdio.<ENVIRONMENT>.conf.ts
Now you can create a specific config for your pre-deploy tests:
var config = require('./wdio.conf.ts').config;
config.baseUrl = 'http://staging.example.com'
exports.config = config;
Your environment-specific config file will get merged into the default config file and overwrites the values you set. To run a test in a specific environment just add the desired configuration file as the first parameter:
yarn run wdio wdio.STAGING.conf.ts
Sometimes it's useful to only execute a single feature file, to do so use the following command:
npx wdio wdio.conf.ts --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 --cucumberOpts.tagExpression=
parameter like so:
npx wdio wdio.conf.ts --cucumberOpts.tagExpression='@Tag or @AnotherTag'
For more tag options please see the Cucumber.js documentation
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: ...
The predefined snippets allow you to do a lot of common things but you might need extra snippets which
are better aligned with your aims. To do so you will find all step definitions in ./src/steps
. They
are separated in given
, when
and then
.
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 uses WebdriverIOs embedded assertion library called expect-webdriverio.
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)* displayed
- Check the (in)visibility of an elementthe element "([^"]*)?" is( not)* enabled
- Check if an element is (not) enabledthe element "([^"]*)?" is( not)* selected
- Check if an element is (not) selectedthe checkbox "([^"]*)?" is( not)* checked
- Check if a checkbox is (not) checkedthere is (an|no) element "([^"]*)?" on the page
- Check if an element (does not) existthe title is( not)* "([^"]*)?"
- Check the title of the current browser window/tabthe element "([^"]*)?" contains( not)* the same text as element "([^"]*)?"
- Compare the text of two elementsthe (button|element) "([^"]*)?"( not)* contains the text "([^"]*)?"
- Check if an element contains the given textthe (button|element) "([^"]*)?"( not)* contains any text
- Check if an element does not contain any textthe (button|element) "([^"]*)?" is( not)* empty
- Check if an element is emptythe page url is( not)* "([^"]*)?"
- Check the url of the current browser window/tabthe( css)* attribute "([^"]*)?" from element "([^"]*)?" is( not)* "([^"]*)?"
- Check the value of an 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 an elementthe element "([^"]*)?" is( not)* positioned at ([\d]+)px on the (x|y) axis
- Check the position of an 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 "([^"]*)?" does( not)* appear exactly "([^"]*)?" times
- Checks that the element is on the page a specific number of timesI 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 "([^"]*)?"( not)* contains the same text as element "([^"]*)?"
- Compare the text of two elementsI expect that (button|element) "([^"]*)?"( not)* contains the text "([^"]*)?"
- Check if an element or input field contains the given textI expect that (button|element) "([^"]*)?"( not)* contains any text
- Check if an element or input field contains any textI expect that (button|elementelement) "([^"]*)?" is( not)* empty
- Check if an 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 an 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 an element is (not) selectedI expect that element "([^"]*)?" is( not)* enabled
- Check if an 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 an 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 an 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 an 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 an 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 an option based on it's indexI select the option with the (name|value|text) "([^"]*)?" for element "([^"]*)?"
- Select an option based on its 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
Similar to "WebDriver IO - Cucumber", but without all of the BDD parts (unless configured to do BDD).
Tests are written in the traditional JS style. Access to the WebDriver is given through the browser
global variable.
npm run test:selenium:wdio:mocha
Start the local web server, the you can run
npm run test:playwright
To configure the tests to run against the Applause framework, you will need to fill in playwright/applause.json
with your information this will enable reporting to the automation api. You will then need to use the Mocha Reporter by specifying the reporter in the mocha command: mocha --reporter ./node_modules/mocha-applause-reporter/dist/index.js
You can also point your tests at the applause datatap proxy and to a playwright provider by using the following:
const bsCaps = {
'browser': 'playwright-chromium',
'os': 'osx',
'os_version': 'big sur',
'name': 'Playwright-mocha test on Chromium',
'build': 'playwright-mocha-build-1',
'browserstack.username': 'YOUR_USERNAME',
'browserstack.accessKey': 'YOUR_ACCESS_KEY',
'client.playwrightVersion': clientPlaywrightVersion
};
const applauseCapabilities = {
'applause:options': {
apiKey: 'PASS_ME_A_KEY',
providerUrl: `wss://cdp.browserstack.com/playwright?caps=${encodeURIComponent(JSON.stringify(bsCaps))}`
}
}
const browser = await chromium.connectOverCDP(`ws://datatapURI/cdp?caps=${encodeURIComponent(JSON.stringify(applauseCapabilities))}`);