UNPKG

tlc-core-automation-framework-v3-wdio-v9

Version:

Background: - We are following multi-layer automation framework architecture using webdriver.io + cucumber + typescript This core framework has been implemented with generic utility functions and cucumber steps, which can be easily consumed by another fra

371 lines 23.1 kB
"use strict"; // import type {Options} from '@wdio/types' // // export const config: Options.Testrunner = { // // // // ==================== // // Runner Configuration // // ==================== // // // // // // ===================== // // ts-node Configurations // // ===================== // // // // You can write tests using TypeScript to get autocompletion and type safety. // // You will need typescript and ts-node installed as devDependencies. // // WebdriverIO will automatically detect if these dependencies are installed // // and will compile your config and tests for you. // // If you need to configure how ts-node runs please use the // // environment variables for ts-node or use wdio config's autoCompileOpts section. // // // // autoCompileOpts: { // autoCompile: true, // // see https://github.com/TypeStrong/ts-node#cli-and-programmatic-options // // for all available options // tsNodeOpts: { // transpileOnly: true, // project: 'tsconfig.json' // } // // tsconfig-paths is only used if "tsConfigPathsOpts" are provided, if you // // do please make sure "tsconfig-paths" is installed as dependency // // tsConfigPathsOpts: { // // baseUrl: './' // // } // }, // // // // ================== // // Specify Test Files // // ================== // // Define which test specs should run. The pattern is relative to the directory // // from which `wdio` was called. // // // // The specs are defined as an array of spec files (optionally using wildcards // // that will be expanded). The test for each spec file will be run in a separate // // worker process. In order to have a group of spec files run in the same worker // // process simply enclose them in an array within the specs array. // // // // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script), // // then the current working directory is where your `package.json` resides, so `wdio` // // will be called from there. // // // specs: [ // './src/features/*.feature' // ], // // Patterns to exclude. // exclude: [ // // 'path/to/excluded/files' // ], // // // // ============ // // Capabilities // // ============ // // Define your capabilities here. WebdriverIO can run multiple capabilities at the same // // time. Depending on the number of capabilities, WebdriverIO launches several test // // sessions. Within your capabilities you can overwrite the spec and exclude options in // // order to group specific specs to a specific capability. // // // // First, you can define how many instances should be started at the same time. Let's // // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have // // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec // // files and you set maxInstances to 10, all spec files will get tested at the same time // // and 30 processes will get spawned. The property handles how many capabilities // // from the same test should run tests. // // // maxInstances: 10, // // // // If you have trouble getting all important capabilities together, check out the // // Sauce Labs platform configurator - a great tool to configure your capabilities: // // https://saucelabs.com/platform/platform-configurator // // // capabilities: [{ // // // maxInstances can get overwritten per capability. So if you have an in-house Selenium // // grid with only 5 firefox instances available you can make sure that not more than // // 5 instances get started at a time. // maxInstances: 5, // // // browserName: 'chrome', // acceptInsecureCerts: true, // 'goog:chromeOptions': { // args: [ // '--no-sandbox', // // '--disable-infobars', // '--headless', // // '--disable-gpu', // // '--disable-web-security', // '--disable-dev-shm-usage' // // '--window-size=1920,1080' // ] // } // // If outputDir is provided WebdriverIO can capture driver session logs // // it is possible to configure which logTypes to include/exclude. // // excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs // // excludeDriverLogs: ['bugreport', 'server'], // }], // // // // =================== // // Test Configurations // // =================== // // Define all options that are relevant for the WebdriverIO instance here // // // // Level of logging verbosity: trace | debug | info | warn | error | silent // logLevel: 'info', // // // // Set specific log levels per logger // // loggers: // // - webdriver, webdriverio // // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service // // - @wdio/mocha-framework, @wdio/jasmine-framework // // - @wdio/local-runner // // - @wdio/sumologic-reporter // // - @wdio/cli, @wdio/config, @wdio/utils // // Level of logging verbosity: trace | debug | info | warn | error | silent // // logLevels: { // // webdriver: 'info', // // '@wdio/appium-service': 'info' // // }, // // // // If you only want to run your tests until a specific amount of tests have failed use // // bail (default is 0 - don't bail, run all tests). // bail: 0, // // // // Set a base URL in order to shorten url command calls. If your `url` parameter starts // // with `/`, the base url gets prepended, not including the path portion of your baseUrl. // // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url // // gets prepended directly. // baseUrl: 'http://localhost', // // // // Default timeout for all waitFor* commands. // waitforTimeout: 10000, // // // // Default timeout in milliseconds for request // // if browser driver or grid doesn't send response // connectionRetryTimeout: 120000, // // // // Default request retries count // connectionRetryCount: 3, // // // // Test runner services // // Services take over a specific job you don't want to take care of. They enhance // // your test setup with almost no effort. Unlike plugins, they don't add new // // commands. Instead, they hook themselves up into the test process. // services: ['chromedriver'], // // // Framework you want to run your specs with. // // The following are supported: Mocha, Jasmine, and Cucumber // // see also: https://webdriver.io/docs/frameworks // // // // Make sure you have the wdio adapter package for the specific framework installed // // before running any tests. // framework: 'cucumber', // // // // The number of times to retry the entire specfile when it fails as a whole // // specFileRetries: 1, // // // // Delay in seconds between the spec file retry attempts // // specFileRetriesDelay: 0, // // // // Whether or not retried specfiles should be retried immediately or deferred to the end of the queue // // specFileRetriesDeferred: false, // // // // Test reporter for stdout. // // The only one supported by default is 'dot' // // see also: https://webdriver.io/docs/dot-reporter // reporters: ['spec', ['allure', {outputDir: 'allure-results'}]], // // // // // // If you are using Cucumber you need to specify the location of your step definitions. // cucumberOpts: { // // <string[]> (file/dir) require files before executing features // require: ['./src/step-definitions/*.ts'], // // <boolean> show full backtrace for errors // backtrace: false, // // <string[]> ("extension:module") require files with the given EXTENSION after requiring MODULE (repeatable) // requireModule: [], // // <boolean> invoke formatters without executing steps // dryRun: false, // // <boolean> abort the run on first failure // failFast: false, // // <boolean> hide step definition snippets for pending steps // snippets: true, // // <boolean> hide source uris // source: true, // // <boolean> fail if there are any undefined or pending steps // strict: false, // // <string> (expression) only execute the features or scenarios with tags matching the expression // tagExpression: '', // // <number> timeout for step definitions // timeout: 60000, // // <boolean> Enable this config to treat undefined definitions as warnings. // ignoreUndefinedDefinitions: true // }, // // // // // ===== // // Hooks // // ===== // // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance // // it and to build services around it. You can either apply a single function or an array of // // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got // // resolved to continue. // /** // * Gets executed once before all workers get launched. // * @param {Object} config wdio configuration object // * @param {Array.<Object>} capabilities list of capabilities details // */ // // onPrepare: function (config, capabilities) { // // }, // /** // * Gets executed before a worker process is spawned and can be used to initialise specific service // * for that worker as well as modify runtime environments in an async fashion. // * @param {String} cid capability id (e.g 0-0) // * @param {[type]} caps object containing capabilities for session that will be spawn in the worker // * @param {[type]} specs specs to be run in the worker process // * @param {[type]} args object that will be merged with the main configuration once worker is initialized // * @param {[type]} execArgv list of string arguments passed to the worker process // */ // // onWorkerStart: function (cid, caps, specs, args, execArgv) { // // }, // /** // * Gets executed just after a worker process has exited. // * @param {String} cid capability id (e.g 0-0) // * @param {Number} exitCode 0 - success, 1 - fail // * @param {[type]} specs specs to be run in the worker process // * @param {Number} retries number of retries used // */ // // onWorkerEnd: function (cid, exitCode, specs, retries) { // // }, // /** // * Gets executed just before initialising the webdriver session and test framework. It allows you // * to manipulate configurations depending on the capability or spec. // * @param {Object} config wdio configuration object // * @param {Array.<Object>} capabilities list of capabilities details // * @param {Array.<String>} specs List of spec file paths that are to be run // * @param {String} cid worker id (e.g. 0-0) // */ // // beforeSession: function (config, capabilities, specs, cid) { // // }, // /** // * Gets executed before test execution begins. At this point you can access to all global // * variables like `browser`. It is the perfect place to define custom commands. // * @param {Array.<Object>} capabilities list of capabilities details // * @param {Array.<String>} specs List of spec file paths that are to be run // * @param {Object} browser instance of created browser/device session // */ // // before: function (capabilities, specs) { // // }, // /** // * Runs before a WebdriverIO command gets executed. // * @param {String} commandName hook command name // * @param {Array} args arguments that command would receive // */ // // beforeCommand: function (commandName, args) { // // }, // /** // * Cucumber Hooks // * // * Runs before a Cucumber Feature. // * @param {String} uri path to feature file // * @param {GherkinDocument.IFeature} feature Cucumber feature object // */ // // beforeFeature: function (uri, feature) { // // }, // /** // * // * Runs before a Cucumber Scenario. // * @param {ITestCaseHookParameter} world world object containing information on pickle and test step // * @param {Object} context Cucumber World object // */ // // beforeScenario: function (world, context) { // // }, // /** // * // * Runs before a Cucumber Step. // * @param {Pickle.IPickleStep} step step data // * @param {IPickle} scenario scenario pickle // * @param {Object} context Cucumber World object // */ // // beforeStep: function (step, scenario, context) { // // }, // /** // * // * Runs after a Cucumber Step. // * @param {Pickle.IPickleStep} step step data // * @param {IPickle} scenario scenario pickle // * @param {Object} result results object containing scenario results // * @param {boolean} result.passed true if scenario has passed // * @param {string} result.error error stack if scenario failed // * @param {number} result.duration duration of scenario in milliseconds // * @param {Object} context Cucumber World object // */ // // afterStep: function (step, scenario, result, context) { // // }, // /** // * // * Runs after a Cucumber Scenario. // * @param {ITestCaseHookParameter} world world object containing information on pickle and test step // * @param {Object} result results object containing scenario results // * @param {boolean} result.passed true if scenario has passed // * @param {string} result.error error stack if scenario failed // * @param {number} result.duration duration of scenario in milliseconds // * @param {Object} context Cucumber World object // */ // // afterScenario: function (world, result, context) { // // }, // /** // * // * Runs after a Cucumber Feature. // * @param {String} uri path to feature file // * @param {GherkinDocument.IFeature} feature Cucumber feature object // */ // // afterFeature: function (uri, feature) { // // }, // // /** // * Runs after a WebdriverIO command gets executed // * @param {String} commandName hook command name // * @param {Array} args arguments that command would receive // * @param {Number} result 0 - command success, 1 - command error // * @param {Object} error error object if any // */ // // afterCommand: function (commandName, args, result, error) { // // }, // /** // * Gets executed after all tests are done. You still have access to all global variables from // * the test. // * @param {Number} result 0 - test pass, 1 - test fail // * @param {Array.<Object>} capabilities list of capabilities details // * @param {Array.<String>} specs List of spec file paths that ran // */ // // after: function (result, capabilities, specs) { // // }, // /** // * Gets executed right after terminating the webdriver session. // * @param {Object} config wdio configuration object // * @param {Array.<Object>} capabilities list of capabilities details // * @param {Array.<String>} specs List of spec file paths that ran // */ // // afterSession: function (config, capabilities, specs) { // // }, // /** // * Gets executed after all workers got shut down and the process is about to exit. An error // * thrown in the onComplete hook will result in the test run failing. // * @param {Object} exitCode 0 - success, 1 - fail // * @param {Object} config wdio configuration object // * @param {Array.<Object>} capabilities list of capabilities details // * @param {<Object>} results object containing test results // */ // // onComplete: function(exitCode, config, capabilities, results) { // // }, // /** // * Gets executed when a refresh happens. // * @param {String} oldSessionId session ID of the old session // * @param {String} newSessionId session ID of the new session // */ // // onReload: function(oldSessionId, newSessionId) { // // } // } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Rpby5jb25mLmJhY2t1cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3dkaW8uY29uZi5iYWNrdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEyQztBQUMzQyxFQUFFO0FBQ0YsOENBQThDO0FBQzlDLFNBQVM7QUFDVCw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QixTQUFTO0FBQ1QsU0FBUztBQUNULCtCQUErQjtBQUMvQixnQ0FBZ0M7QUFDaEMsK0JBQStCO0FBQy9CLFNBQVM7QUFDVCxxRkFBcUY7QUFDckYsNEVBQTRFO0FBQzVFLG1GQUFtRjtBQUNuRix5REFBeUQ7QUFDekQsa0VBQWtFO0FBQ2xFLHlGQUF5RjtBQUN6RixTQUFTO0FBQ1QsRUFBRTtBQUNGLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0Isb0ZBQW9GO0FBQ3BGLHVDQUF1QztBQUN2Qyx3QkFBd0I7QUFDeEIsbUNBQW1DO0FBQ25DLHVDQUF1QztBQUN2QyxZQUFZO0FBQ1oscUZBQXFGO0FBQ3JGLDZFQUE2RTtBQUM3RSxrQ0FBa0M7QUFDbEMsK0JBQStCO0FBQy9CLGVBQWU7QUFDZixTQUFTO0FBQ1QsU0FBUztBQUNULDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsNEJBQTRCO0FBQzVCLHNGQUFzRjtBQUN0Rix1Q0FBdUM7QUFDdkMsU0FBUztBQUNULHFGQUFxRjtBQUNyRix1RkFBdUY7QUFDdkYsdUZBQXVGO0FBQ3ZGLHlFQUF5RTtBQUN6RSxTQUFTO0FBQ1QsbUdBQW1HO0FBQ25HLDRGQUE0RjtBQUM1RixvQ0FBb0M7QUFDcEMsU0FBUztBQUNULGVBQWU7QUFDZixxQ0FBcUM7QUFDckMsU0FBUztBQUNULDhCQUE4QjtBQUM5QixpQkFBaUI7QUFDakIsc0NBQXNDO0FBQ3RDLFNBQVM7QUFDVCxTQUFTO0FBQ1Qsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEIsOEZBQThGO0FBQzlGLDBGQUEwRjtBQUMx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