For Protractor中的Loop无法正常工作

时间:2018-03-09 06:03:50

标签: javascript node.js protractor js-xlsx

我正在研究Protractor以测试Angular JS应用程序。我已经编写了一个代码来从excel表中读取数据。我的情况就像我有一个应该执行的端到端流程。代码将从excel表中获取URL,UserName和Password,并将执行整个流程。再次,它将迭代另一个值。但它不会进入循环。

我的代码是:

    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 个答案:

答案 0 :(得分:0)

这是因为Protractor API执行Async,但 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) } 循环执行Sync。从here获取详细解释,这与您的问题相同。

要解决您的问题,我们可以使用javascript闭包。

class Car {
    private name : string;
    private velocity: number;

    constructor (name: string) {
        this.name = name;
        this.velocity = 0;
    }

    private speedUp = (incrementer: number): void => {
        console.log(this);
        this.velocity += incrementer;
    } 

    public pressAccelerator = (power: number): void => {

        console.log(this); //here this is a Car object       
        setTimeout(() => this.speedUp(power*1.34), 1000);
    }
    public getVelocity = (): number => {
        return this.velocity;
    }
}

let myCar = new Car("Mercedes");
myCar.pressAccelerator(2);
console.log(myCar.getVelocity());

答案 1 :(得分:0)

好吧最初与'exceljs'节点模块混淆了。它不用于您的测试。我认为这里的主要问题是该文件不存在。

readFile和ENOENT

readFile的第一件事是readFileSync的别名,它调用readSync调用(可能)read_binary,它会卸载到节点{{3} }}。很可能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会破坏您的测试,使您的测试更加脆弱并需要更多的维护。