Петля в транспортире не работает должным образом

Я работаю над Protractor для тестирования приложения Angular JS. Я написал код для чтения данных из листа Excel. Мой сценарий похож на выполнение сквозного потока, который должен выполняться. Код будет извлекать URL, Имя пользователя и Пароль из листа Excel и будет выполнять весь поток. Затем он будет повторять другое значение. Но это не идет в петлю.

Мой код:

    var Excel = require('exceljs');
    var XLSX = require('xlsx');
    var os = require('os');
    var TEMP_DIR = os.tmpdir();
    var wrkbook = new Excel.Workbook();

    //---------------------Duration as Days------------------------------------------
    describe('Open the clinicare website by logging into the site', function () {
      it('IP Medication Simple flows for Patient Keerthi for Days,Weeks and Months', function () {
        console.log("hello6");
        browser.driver.manage().window().maximize();
        var wb = XLSX.readFile('E:\\LAM WAH EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');
        var ws = wb.Sheets.Sheet1;
        var json = XLSX.utils.sheet_to_json(wb.Sheets.Sheet1);
        console.log("json", json);  

        //var json = XLSX.utils.sheet_to_json(wb.Sheets.Sheet1);
        //console.log("json", json);

        for(var a = 0; a < json.length ; a++){           
          console.log("Test_URL", json[a].Test_URL);
          console.log("User_Name", json[a].User_Name);
          console.log("Password", json[a].Password);
          browser.get(json[a].Test_URL); 

          console.log("hello10");

          //Perform Login:UserName 
          element(by.model('accessCode')).sendKeys(json[a].User_Name); 
          browser.sleep(6000);
          // browser.driver.sleep(6000);

          //Perform Login:Password 
          element(by.model('password')).sendKeys(json[a].Password); 
          browser.sleep(6000);

          //Hospital Name
          element(by.cssContainingText('option', 'HLWE')).click();
          browser.sleep(6000);


          //Perform Login:LoginButton 
          element(by.css('.btn.btn-primary.pull-right')).click(); 
          browser.sleep(6000);


          //Clicking on Admitted Tab
          element(by.xpath("//span[contains(text(),' Admitted(25)')]")).click();
          browser.sleep(6000);
          // browser.driver.sleep(6000);


          //Clicking on First Admitted Patient
          element(by.cssContainingText('span.clearfloat', '35690')).element(by.xpath('//*[@id="searchPatientImgAdmittedF"]')).click();
          jasmine.DEFAULT_TIMEOUT_INTERVAL = 600000;
          // browser.sleep(600);


          //Clicking anywhere to proceed
          element(by.xpath('/html/body/div[3]/div[1]/div[16]/div[1]/div/table[4]/tbody/tr[2]/td/div/div/div[3]/table/tbody/tr[1]/td[3]')).click();
          jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
          browser.sleep(800);

Любая помощь приветствуется. Заранее спасибо.

2 ответа

Хорошо изначально перепутали с 'exceljs' узловой модуль. Он не используется в вашем тесте. Я думаю, что основная проблема заключается в том, что файл не существует.

readFile и ENOENT

Первое из readFile это псевдоним для readFileSync какие звонки readSync какие звонки (наверное) read_binary который разгружается на узел fs.readFileSync, Более чем вероятно fs.readFileSync бросает ENOENT, потому что путь не существует.

Глядя на ваш путь, вам может потребоваться обратная косая черта перед пробелами.

var wb = XLSX.readFile('E:\\LAM\ WAH\ EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');

Это может быть хорошей практикой, чтобы получить путь к файлу с path.resolve до вызова метода чтения файла.

var path = require('path');
var patientEntryFilePath = path.resolve('E:\\LAM\ WAH\ EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');
console.log(patientEntryFilePath);
var wb = XLSX.readFile(patientEntryFilePath);

Дополнительные комментарии и мысли об оригинальном фрагменте кода

Некоторые дополнительные комментарии о фрагменте кода из исходного вопроса. Возможно соображения для будущей очистки.

  1. Подумайте об использовании beforeAll или же beforeEach для установки размера окна драйвера вашего браузера и чтения в файл. Чтение в файл один раз потенциально экономит время и ресурсы.

    describe('Open the clinicare website by logging into the site', function () {
      var json = null;
    
      beforeAll(() => {
        browser.driver.manage().window().maximize();
        var wb = XLSX.readFile('E:\\LAM\ WAH\ EE_Testing Enviornment\\IP_Medication_Flow\\Patients_Entry.xlsx');
        var ws = wb.Sheets.Sheet1;
        json = XLSX.utils.sheet_to_json(wb.Sheets.Sheet1);
      });
    
    
      it('IP Medication Simple flows for Patient Keerthi for Days,Weeks and Months', function () {
        console.log("json", json); 
        ...
    
  2. Если вы посмотрите на ваш тест, что это логин и он имеет одинаковый поток, вам действительно нужно протестировать его только один раз. Цикл for является приемлемым, поскольку файл json разрешен, и каждая строка выполняется в потоке управления, который использует Protractor.

  3. Избегайте использования xpath. Лучше найти элементы по css или id или по частичному пути. Разработчик добавляет дополнительный div в список div'ов, который сломает ваш тест, делая ваш тест более хрупким и требующим дополнительного обслуживания.

Это потому, что Protractor API выполняет Async, но For цикл выполнения Sync. Получите подробное объяснение отсюда, это та же проблема, что и у вас.

Чтобы исправить вашу проблему, мы можем использовать закрытие JavaScript.

 for(var a = 0; a < json.length ; a++) {

    (function(a){

        console.log("Test_URL", json[a].Test_URL);
        console.log("User_Name", json[a].User_Name);
        console.log("Password", json[a].Password);
        browser.get(json[a].Test_URL); 

        console.log("hello10");

        //Perform Login:UserName 
        element(by.model('accessCode')).sendKeys(json[a].User_Name); 
        browser.sleep(6000);
        //  browser.driver.sleep(6000);

        //Perform Login:Password 
        element(by.model('password')).sendKeys(json[a].Password); 
        browser.sleep(6000);

        ...

    })(a)     

}
Другие вопросы по тегам