I am new to protractor. Can anyone please guide me for data driven testing using protractor. Below is the code, config file and testdata.json file.
'use strict';
var testData = require('../example/Test Data/Test.json');
describe('LoginPage', function() {
var loginData = require('../example/Test Data/Test.json');
testData.forEach(function (data) {
    it("data.description", function (data) {
        browser.get("http://127.0.0.1:8080/#/login");
element(by.model("username")).sendKeys(data.username);
element(by.model("password")).sendKeys(data.passwordField); 
element(by.buttonText("Authenticate")).click();
});
});
});  
Config file:
 // An example configuration file.
exports.config = {
directConnect: true,
//seleniumAddress: 'http://localhost:4444/wd/hub',
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
// Spec patterns are relative to the current working directory when
// protractor is called.
specs: ['Testpage.js'],
// Options to be passed to Jasmine.
jasmineNodeOpts: {
defaultTimeoutInterval: 30000
}
};
Json File:
[
{
 "username": "admin",
 "passwordField": "admin"
},
{
"username": "admin1",
"passwordField": "admin2"
}
]
Issue is that instead of taking data , it is writing undefined in all input boxes. Please Help
We have jasmine-data-provider package which will helps us in doing data driven testing with Protractor.
Code Snippet:
var using = require(‘jasmine-data-provider);
var loginData = require('../example/Test Data/Test.json');
 describe('Data driven test spec', function () { /*define sets of input data as array in method called arrayOfData*/
     function arrayOfData() {
       return [
              {
                "username": "admin",
                "passwordField": "admin"
              },
             {
              "username": "admin1",
              "passwordField": "admin2"
              }
          ]
         //or return loginData json object here
   } /*below one will loop the test case based on data size and pass single data set every time till complete the end of array*/
using(arrayofData, function (inputData) {
    it('test case logic to be executed for each set of data', function () {
        browser.get("http://127.0.0.1:8080/#/login");
        element(by.model("username")).sendKeys(inputData.username);
        element(by.model("password")).sendKeys(inputData.passwordField); 
        element(by.buttonText("Authenticate")).click();
    });
  });
 });
NOTE: If jasmine-data-provider package NOT yet installed in your machine, please install it by running below command before going to run test script.
 npm install jasmine-data-provider
                        I am assuming its an Array of objects, you can iterate each array element and directly access its contents and you don't need testdata.forEach(), you could try something like this - 
 'use strict';
var testData = require('../example/Test Data/Test.json');
describe('LoginPage', function() {
it("data.description", function () {
    browser.get("http://127.0.0.1:8080/#/login");
    element(by.model("username")).sendKeys(testData[0].username);
    element(by.model("password")).sendKeys(testData[0].passwordField); 
    element(by.buttonText("Authenticate")).click();
   });
  });
 });  
I haven't tested the above code and you should use Page Objects rather than directly using them in your tests!
A simpler approach using map function:
var testParams = testConfig.testArray;
testParams.map(function(testdata) {
        it('write your test here', function() {
          console.log('Username: ', testData.username);
         });
 });
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With