0
votes

Framework used - Protractor BDD - Cucumber Language - Typescript

  • Now i have implemented the framework and a test scenario is also running fine with protractor.
  • But the problem i am facing is when i write another cucumber scenario my test fails saying 'A session is either terminated or not started'

    • The above failure is because when my first cucumber scenario starts the appium server starts with in my config and at the end i close the server/driver
    • Now i have written another test scenario, since cucumber is independent of each scenario , when the sec starts it does not do the config again. Now i need a beforeTest method to call.
    • So i am not sure how to implement that in typescript,as i am new to it.

    • Tried the same concept of java way but not working out. There where examples for javascript but still did not help me out.

    • Tried creating a new util folder and placing my beforeTest inside that but the function is not calling there
    • Tried to use beforeLaunch()with in my config file, but still does not work out

my config file: config.ts

export  let config: Config = {
        allScriptsTimeout: 40000,
        getPageTimeout: 40000,
        setDefaultTimeout: 60000,
        defaultTimeoutInterval: 30000,
        specs: [
            // '../../utils/beforeEach.ts',
            '../../features/*.feature',
        ],
        onPrepare: () => {
            Reporter.createDirectory(jsonReports);
            tsNode.register({
                project: './tsconfig.json'
            });
        },
        multiCapabilities: [
            androidPixel2XLCapability,
            // iPhoneXCapability
        ],
        framework: 'custom',
        frameworkPath: require.resolve('protractor-cucumber-framework'),
        cucumberOpts: {
            compiler: "ts:ts-node/register",
            glue: ["steps"],
            format: [
                "json:./reports/json/cucumber_report.json",
            ],
            require: ['supports/timeout.js', '../../stepdefinitions/*.ts'],
            tags: "@firstPurchasePopup",
        },
        seleniumAddress: serverAddress,

        onComplete: () => {
            Reporter.createHTMLReport();
        },


       // =====
       // Hooks
       // =====
       beforeTest: function () {

       },

       beforeLaunch(){
            console.log("Before");
            seleniumAddress: 'http://localhost:4723/wd/hub';
       },

       afterLaunch() {
            console.log("After");
       },
    };

my other beforeEach.ts: This is not working but what i tired and was not working.

import {After, AfterAll, Before} from "cucumber";
const serverAddress = 'http://localhost:4723/wd/hub';
import {beforeEach, afterEach, describe} from "selenium-webdriver/testing";



    beforeEach(function () {
    console.log("Before");
    });
// });

afterEach(function () {
    console.log("Before");
});

// let beforeEach: () => void;
// beforeEach = () => {
//     console.log("Before Test");
//     // config.multiCapabilities;
//     seleniumAddress: serverAddress;
// };
//
// let afterEach: () => void;
// afterEach = () => {
//     console.log("After Test");
// };

This is my feature file: bonus.feature

this is my feature file:

Background:
    Given I launch the app
    Then I should see the popup window for the Bonus
    And I verify the UI
    Then I tap on ok button
    And The popup window should not be seen

  @firstPurchasePopup
  Scenario: firstPurchasePopup new join button
    When I tap on the 'New ' button
    And The popup window should not be seen
    Then I navigate back from join page to home page
    Then The popup window should not be seen
    Then I close the app

  @firstPurchasePopup
  Scenario: firstPurchasePopup login button
    And I tap on log in button on the initial screen
    Then I navigate back from login page to home page
    And The popup window should not be seen
    Then I close the app

I expect my the scenario what i have written to execute both one after the other , like execute Scenario: firstPurchasePopup new join button which it does . But when it launches the app again for the sec Scenario: firstPurchasePopup login button does not work as the driver is not started again, since it was closed in prev one. to start it i need to create beforeTest which i am facing difficutly to write the code

2

2 Answers

0
votes

I haven't used Protractor with Cucumber, but I have used Cucumber & Typescript together. I resolved the problem by having a file cucumber.js in a root that is being loaded at the very beginning by default and looks like that:

var settings = "features/**/*.feature -r step-definitions/**/*.ts -r hooks/**/*.ts -r support/**/*.ts "

module.exports = {
  "default": settings
}

However, I think in your case the solution would be adding a path to hooks file to config.cucumberOpts.require list instead to config.specs one.

Did you try it?

0
votes

@All Thanks for your inputs @mhyphenated I figured out that the rather than using inside the config, i tried using the before and after in the hooks.ts ,also other than calling the server i was not actually calling the android driver, as below and that worked beforeTest: function () {

beforeTest: function () {

       },

       beforeLaunch(){
            console.log("Before");
            seleniumAddress: 'http://localhost:4723/wd/hub';
       },

hooks.ts

import { AndroidDriver } from "appium/node_modules/appium-android-driver";

let driver:AndroidDriver, defaultCaps;
driver =  new AndroidDriver();
Before(function () {
    // This hook will be executed before all scenarios
    browser.ignoreSynchronization = false;
    browser.manage().timeouts().implicitlyWait(500);
    let defaultCaps = config.multiCapabilities[0];
    console.log("defaultCaps = ", defaultCaps );
    driver.createSession(defaultCaps);
    driver.defaultWebviewName(); 
  });