0

我正在使用 Protractor 来测试 Angular JS 应用程序。我编写了一个代码来从 excel 表中读取数据。我的场景就像我有一个应该执行的端到端流程。代码将从 excel 表中获取 URL、用户名和密码,并将执行整个流程。再一次,它将迭代另一个值。但它不会进入循环。

我的代码是:

    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);

任何人的帮助表示赞赏。提前致谢。

4

2 回答 2

0

这是因为 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)     

}
于 2018-03-09T15:09:39.120 回答
0

'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. 考虑使用beforeAllbeforeEach设置浏览器驱动程序窗口大小并读取文件。一次读取文件可能会节省时间和资源。

    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 会破坏您的测试,使您的测试更加脆弱并且需要更多的维护。

于 2018-03-09T20:47:19.303 回答