Skip to content

Instantly share code, notes, and snippets.

@monolithed
Created November 21, 2017 11:59
Show Gist options
  • Save monolithed/ebd2a90ae7b43d2b743a16c002a1d10e to your computer and use it in GitHub Desktop.
Save monolithed/ebd2a90ae7b43d2b743a16c002a1d10e to your computer and use it in GitHub Desktop.
'use strict';
let AccountManager = require('@qa/account-manager');
let WebDriverIOUtils = require('@qa/wdio-utils');
let capabilities = require('@qa/wdio-capabilities');
let MochaHooks = require.resolve('@qa/wdio-mocha-hooks');
let minimist = require('minimist');
let VisualRegressionCompare = require('wdio-visual-regression-service/compare');
let utils = new WebDriverIOUtils({
cache: './cache/',
cases: './cases/'
});
let account = new AccountManager.Hooks();
/**
* Для запуска сервера мы можем использовать selenium-standalone,
* который нам доступен как сервис wdio-selenium-standalone-service или по ссылке
* https://www.npmjs.com/package/selenium-standalone
*
* chromedriver, которй также доступен как сервис wdio-chromedriver-service
* А также selenoid, который можно скачать с официального сайта http://aerokube.com/selenoid/latest/
*
* Допустимые значения используемого драйвера: selenium-standalone, chromedriver,
* null или отсутствие значения это внешний сервер, например selenoid
*/
let USED_DRIVER = 'chromedriver';
/** @namespace browser **/
exports.config = {
/*
* Настройки с которыми запущен сервер Selenium
*
* Операционная система: Windows
* Список доступных браузеров: Chrome, Firefox, Opera, IE 11
* Грид: http://vagabond3.dev.mail.ru:4444/grid/console
*
* Операционная система: Linux
* Список доступных браузеров: Chrome, Firefox
* Грид: http://win110.dev.mail.ru:4444/grid/console
*/
host: 'localhost',
/** 4444 — используется Selenium и Selenoid, 9515 для ChromeDriver */
port: 4444,
/** /wd/hub — используется Selenium и Selenoid, / для ChromeDriver */
path: '/wd/hub',
/* Базовый адрес тестирования */
baseUrl: 'https://e.mail.ru',
/* Доступные значения: silent, verbose, command, data, result, error */
logLevel: 'silent',
/*
* Максимальное время на выполнение команды.
* Если какая-то из команд фреймворка не получит за это время результат,
* то выполнение тестов будет прервано.
*/
waitforTimeout: 30 * 1000,
/* Максимальное количество попыток на установление соединения с сервером */
connectionRetryCount: 1,
/* Максимальное время на выполнение повторного запроса */
connectionRetryTimeout: 30 * 1000,
/* Количество инстансов параллельного запуска тестов */
maxInstances: 1,
/** Использовать синхронное API */
sync: true,
/*
* Опция позволяет отладчику остановить выполнение тестов
* в месте вызова инструкции debugger.
* Для использования этой опции требуется наличие пакета node-inspector
*/
debug: false,
/** Конфигурация для сервиса visual-regression */
visualRegression: {
compare: new VisualRegressionCompare.LocalCompare({
referenceName : utils.screenshot('./store/shots/expected'),
screenshotName: utils.screenshot('./store/shots/actual'),
diffName : utils.screenshot('./store/shots/diff')
})
},
/**
* Список сервисов, которые будет использоваться для запуска тестов
*/
services: [
/** Позволяет использовать отладочный режим */
'debug',
/**
* Обеспечивает работу Allure-реппортов
* ВНИМАНИЕ! Не убирать, без него тесты не взлетят ;)
*/
'yoda-allure-utils',
/** Расширенный набор комманд */
'yoda-api',
/** Сервис для регрессионого тестирования через сравнение скриншотов */
'visual-regression',
/** Добавляет нотификацию о прогоне */
'notify'
],
plugins: {
/** Вспомогательный модуль для быстрого сохранения эталонных скриншотов */
'wdio-screenshot': {}
},
/* Доступные значения: cucumber, mocha, jasmine */
framework: 'mocha',
mochaOpts: {
'ui': 'bdd',
/** Расширение интерфейса Mocha */
'require': MochaHooks,
/** Включает поддержку TypeScript */
'compilers': ['ts-node/register'],
/*
* Количество попыток на выполнение теста, который не был пройден
* Используйте эту опцию с умом! Если в процессе выполнения теста вы изменили
* состояние аккаунта, то повторное его выполнение только усугубит разбор отчета
* и увеличит общее время выполнения тестового прогона.
* Вместо этой опции рекомендуется использовать метод this.retries
*/
'retries': 0,
/** Максимальное время на ожидание результата выполнения теста */
'timeout': 15 * (60 * 1000),
/** Показывать стек-трейс */
'trace': true,
'full-trace': true,
/** Ругаться на вызов устаревших функций */
'throw-deprecation': true,
'trace-deprecation': true
},
/* Для реппортера Allure требуется наличие установленного плагина в CI */
reporters: ['spec', 'yoda-log', 'yoda-re-check', 'junit', 'yoda-allure'],
reporterOptions: {
outputDir: utils.cache('reports'),
'yoda-allure': {
outputDir: utils.cache('yoda-allure-results')
},
'yoda-log': {
title: /(TESTMAIL-\d+)/
},
'yoda-re-check': {
title: /(TESTMAIL-\d+)/,
param: 'TEST_GREP'
}
},
/* Директория, куда будут складываться скриншоты */
// @see https://github.com/webdriverio/webdriverio/issues/1591
// screenshotPath: utils.cache('shots'),
/* Директория, куда будут складываться логи сервера */
seleniumLogs: utils.cache('logs'),
/*
* Список файлов, которые требуется запустить если не передано значение для
* опции --suite.
* Порядок файлов сохраняется, дубликаты исключаются
* ВАЖНО: без метода utils.specs опция --grep не будет работать
* если не передано значение в --suite!
*
* @see utils.specs — [ <files> ]
*/
specs: utils.specs(/** [ ... ] */),
/**
* Набор тестовых кейсов
* ВАЖНО: без метода utils.suites опция --grep работать не будет!
*
* @see utils.suites — { <suite>: [ <files> ] }
*/
suites: utils.suites(/** { ...} */),
/*
* Набор инстансов
*
* Конфигуратор https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
* Внутри каждой группы доступны поля specs и exclude
*
* Список стандартных опций WebDriver и пр. см ниже по ссылке:
* @see https://stash.mail.ru/projects/QA/repos/wd-capabilities/browse
*/
capabilities: utils.capabilities([
{
browserName: 'chrome'
}
]),
onPrepare () {
utils.clean();
},
before (capabilities, specs) {
browser.on('error', error => {
console.log('[WebDriver Error]:', error);
});
},
afterSuite () {
account.discard();
}
};
/** Управление автоматическим запуском сервера */
try {
// Пробуем получить опции для запуска из командной строки
let options = minimist(process.argv.slice(2));
let { host, path, port, url, baseUrl, services = [ USED_DRIVER ] } =
Object.assign(exports.config, options);
// Устанавливаем параметры для требуемого драйвера
if (USED_DRIVER && /^(localhost|127\.0\.0\.1)$/.test(host)) {
switch (USED_DRIVER) {
case 'chromedriver':
path = '/';
port = 9515;
break;
case 'selenium-standalone':
path = '/wd/hub';
port = 4444;
break;
}
if (!services.includes(USED_DRIVER)) {
services.push(USED_DRIVER);
}
}
else {
// Сервис для запуска сервера требуется только для локального прогона
services = services.filter(service => service !== USED_DRIVER);
}
Object.assign(exports.config, { path, port, services });
console.log(`Service started at ${host}:${port}${path} for ${url || baseUrl}`);
} catch (error) {
console.error('Please, pay your attention to: ', error.stack);
}
process.on('unhandledRejection', error => {
if (!error.seleniumStack) {
console.error('[UnhandledRejection Error]', error.stack);
}
});
process.on('message', function (error) {
console.log('[Message Error]:', error.stack);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment