Search code examples
javascriptselenium-chromedrivergherkincucumberjsfaker

selenium cucumber javascript use faker to fill different value on iteration


I am new on automation selenium using javascript, I have simple code like below that I am using faker data to generate random email, question is incase I have data table on scenario outline 2 types, when I run the code some how the data for email for second loop is using same data that generated on first loop, question is how to get different data for 2nd loop?

#feature file

@RegisterMerchant
Feature: Register new merchant
    Scenario Outline: As a new User, I want to create new merchant account
        Given User is on register page
        When User fill register form for "<businessChannel>" merchant
        And User click register
        Then User should see success pop up message
        Examples:
            | businessChannel |
            | offline         |
            | online          |

#data file

const faker = require('faker')

class registerData {
    email = faker.name.firstName().toLowerCase() + faker.name.lastName().toLowerCase() + "@mailinator.com"
}
module.exports = new registerData()

#step file

const { Given, When, Then } = require('cucumber');
const registerPage = require('../PageObjects/registerMerchantPage')
Given(/^User is on register page$/, () => {
    registerPage.isOnRegisterPage()
});

When(/^User fill register form for "([^"]*)" merchant$/, (businessChannel) => {
    registerPage.inputRegisterForm(businessChannel) .. 
});

When(/^User click register$/, () => {
    registerPage.signUpButton.click()
});

Then(/^User should see success pop up message$/, () => {
    registerPage.showPopUpSuccess()
});

Actual the 2nd iteration still using 1st faker data

#page object file

inputRegisterForm(businessChannel) {
        this.emailAddressField.addValue(registerData.email)
        switch (businessChannel) {
            case "online":
                this.onlineRadBtn.click()
                break;

            case "offline":
                this.offlineRadBtn.click()
                break;
        }
    }

Solution

  • solved by add function for this data file :

    email = faker.name.firstName().toLowerCase() + faker.name.lastName().toLowerCase() + "@mailinator.com"
    

    to be like this

    #data file

        class registerData {
            generateRegisterData() {
                this.email = faker.name.firstName().toLowerCase() + faker.name.lastName().toLowerCase() + "@mailinator.com"
                console.log("Test")
            }
    
    email = ""
    

    #page object file

    inputRegisterForm(businessChannel) {
            registerData.generateRegisterData()
            this.emailAddressField.addValue(registerData.email)
            switch (businessChannel) {
                case "online":
                    this.onlineRadBtn.click()
                    break;
    
                case "offline":
                    this.offlineRadBtn.click()
                    break;
            }
        }