Петля в транспортире не работает должным образом
Я работаю над 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);
Дополнительные комментарии и мысли об оригинальном фрагменте кода
Некоторые дополнительные комментарии о фрагменте кода из исходного вопроса. Возможно соображения для будущей очистки.
Подумайте об использовании
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); ...
Если вы посмотрите на ваш тест, что это логин и он имеет одинаковый поток, вам действительно нужно протестировать его только один раз. Цикл for является приемлемым, поскольку файл json разрешен, и каждая строка выполняется в потоке управления, который использует Protractor.
Избегайте использования 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)
}