Установите зависимости:

  • огурец : npm установить огурец (если транспортир был установлен локально, в противном случае используйте npm install -g огурец). И транспортир, и огурец должны быть в одном диапазоне.
  • cucumber-html-reporter: npm install Cucumber-html-Reporter — save-dev
  • чай: установить чай npm
  • protractor-cucumber-framework: установка npm — save-dev protractor-cucumber-framework

Мой package.json:

вы можете напрямую использовать package.json и установить все зависимости, поместив файл в свой тестовый проект и просто запустив

npm install

package.json:

{
  "name": "Test",
  "version": "1.0.0",
  "description": "Test framework for project Test",
  "main": "conf.js",
  "keywords": [
    "test"
  ],
  "author": "Praveen David Mathew",
  "license": "ISC",
  "dependencies": {
    "chai": "^4.2.0",
  },
  "devDependencies": {
    "cucumber": "^6.0.5",
    "cucumber-html-reporter": "^5.1.0",
    "protractor-cucumber-framework": "^6.2.0"
  }
}

Теперь создайте глобальное ключевое слово chai expect:

Protractor использует jasmine из коробки, поэтому, когда вы используете пользовательский фреймворк, класс ожидания jasmine не будет работать.

Вы должны использовать другой класс утверждений, мы используем chai.

Мы можем использовать класс ожидания chai, импортируя его в определение каждого шага.

'use strict';
expect = require('chai').expect;

Это было бы беспокойно, поэтому обойти это можно, объявив expect глобальным в отдельном файле.

Мой файл chaiAssertions.js:

'use strict';
// Configure chai
global.expect = require('chai').expect;

Создайте Hook.js:

Хуки — это просто еще один файл определения шага, который вы можете назвать как угодно. Крючок идентифицируется с помощью ключевого слова После и до.

Здесь я создал файл Hook.js, чтобы получить снимок экрана в случае сбоя сценария:

hook.js:

var { After, Before } = require('cucumber');
// Asynchronous Promise
After(async function(scenario) {
    if (scenario.result.status === 'failed') {
            const screenShot = await browser.takeScreenshot();
            this.attach(screenShot, "image/png");
    }
});

Таким образом, после каждого сценария выполняется код внутри after. Который сделает скриншот сценария.result.status не удалось.

Теперь мой conf.js

'use strict';
exports.config = {
directConnect: true,
//Running chrome 
Capabilities: { browserName: 'chrome'
},
//point spec to feature file , my feature file was under feature folder
specs: ['feature/*.feature'],
//set framework options
framework: 'custom',
frameworkPath: require.resolve('protractor-cucumber-framework'), 
//just maximizing window before testing
onPrepare: function(){
    browser.waitForAngularEnabled(true);
    browser.driver.manage().window().maximize();
 } ,
//Create html report 
onComplete: () => {
  var reporter = require('cucumber-html-reporter');
  var options = {
    theme: 'bootstrap',
    jsonFile: './results.json',
    output: './results.html',
    reportSuiteAsScenarios: true,
    launchReport: true,
    metadata: {
        "App Version":"0.3.2",
        "Test Environment": "STAGING",
        "Browser": "Chrome  54.0.2840.98",
        "Platform": "Windows 10",
        "Parallel": "Scenarios",
        "Executed": "Remote"
    },
    output: './report/cucumber_report.html',
  };
   reporter.generate(options);
 },
//set cucumber options
cucumberOpts: {
     require: ['./testsuites/*.js','./commons/chaiAssertions.js','./commons/hooks.js'],
     strict: true,     
     format: [],    //don't put 'Pretty' as it is depreciated     
     'dry-run': false,   
     compiler: [],
     format: 'json:results.json',    //make sure you are not using multi-capabilities     
   },
 SELENIUM_PROMISE_MANAGER: false,
 };

Здесь я указываю на файл функции, используя свойство specs: [‘feature/*.feature’],

и приклеивает его к определению шага, используя cucumberopts› require:

Между определением функции и шага нет однозначного сопоставления, платформа автоматически находит определение шага, которое содержит определение для шага, из предоставленных определений шагов (файлов .js) в требуемом поле.

Теперь напишите файл функции:

test.feature

Feature: Google search
 Scenario Outline: Log in with given API
     Given I navigates to google
     And searches for '
'
     Then I should see ''
 Examples:
 |input|this|
 |test|pass|
 |test2|fail|

Теперь напишите определение шага:

step.js:

var { Given } = require('cucumber');
 Given('I navigates to google', async function () {
   await browser.get('https://www.google.com/');
 });
 Given('searches for {string}', async function (searchValue) {
   await element(by.css('input[role="combobox"]')).sendKeys(searchValue)
 });
 Given('I should see {string}', async function (expectedValue) {
   expect(expectedValue).to.equal('pass')
 });

поэтому здесь мы используем просто Given, как и во время выполнения Given, когда then и т. д. будут игнорироваться, и будет рассматриваться только строка после этого.

Таким образом, даже если в нашем файле функций есть И ищет ‘input’ , мы можем записать определение шага как Given(‘searchs for {string}’.

Обратите внимание, что мы используем не регулярные выражения для получения параметров, а тип данных.

вы могли видеть в других учебниках Given( /^searchs for (\w+)$/ ). Проще использовать формат, который я использовал Given(‘searchs for {string}’. Оба подхода работают нормально.

Теперь запустите сценарии:

protractor conf.js

Отчет:

Отчет будет создан в папке отчетов

Архив фреймворка:

Просто скачайте и запустите npm install.

Для выполнения выполните команду protractor conf.js.

https://github.com/praveendvd/Protractor_cucumber_PoC.git