// For example, here we have two suites defined, with first suite having two cases
// and second suite having only a single case.
name: 'Selenium', // suite name
cases: [ // cases inside this suite
path: './tests/selenium-with-po.js'
path: './tests/visual.js'
// If "concurrency" value is greater than 1,
// tests with different capabilities will be executed in parallel.
browserName: 'chrome', // execute on Chrome
browserName: 'firefox', // execute on Firefox
file: '<excel or csv file path>',
mode: 'seq', // can be 'random' or 'all' as well
// Tests will run only once if iterations number is not explicitly specified.
// Selenium & Appium server URLs
// If not specified, the default URLs will be used
seleniumUrl: 'http://localhost:4444/wd/hub',
appiumUrl: 'http://localhost:4723/wd/hub',
// List services you want to enable during the test execution.
// Available services: selenium-standalone | devtools
// selenium-standalone needs to be installed with `npm i @wdio/selenium-standalone-service` first.
services: ['selenium-standalone', 'devtools'],
// List modules you want to enable during the test execution.
// Loading unnecessary modules might slow down your test execution,
// so only load modules that are used in the test.
// See here https://docs.oxygenhq.org for a list of available modules.
modules: ['web', 'db', 'log', 'assert', 'pdf', 'http', 'email'],
// Define a testing framework for this project.
// Available frameworks: oxygen | cucumber
// Define test reporter format and corresponding options.
// Multiple reporter formats can be specified.
// Available reporters: json | html | junit | excel | pdf | xml
// Define your Applitools service API key.
// This is only for when using the `eyes` module.
key: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
// Oxygen provides several hooks that can be used to interfere with the test
// Hook that gets executed before the test starts.
// At this point, Oxygen has been already initialized, so you
// can access Oxygen functionality via relevant modules.
beforeTest: function(runId, options, caps) {
beforeSuite: function(suiteDef) {
beforeCase: function(caseDef) {
log.info('Hey there! Case is about to start.');
beforeCommand: function(cmdDef) {
afterCommand: function(cmdResult) {
afterCase: function(caseDef, caseResult) {
afterSuite: function(suiteDef, suiteResult) {
afterTest: function(runId, testResult) {