2017-06-13 202 views
4

我正在用量角器编写下面的JS代码。这里我使用了一个data.json文件来读取我的测试用例的数据。在这个测试用例中,我很简单地从这个JSON中读取项目,并将其与我从浏览器中读取的值进行比较。变量正在递增不正确

我在这里面临的问题是在我的Expect语句中,来自JSON文件的值不正确。

有没有人可以帮助找出问题。

var datafile = require('./Data.json') 

    beforeEach(() => { 
     browser.get("https://angularjs.org"); 
    }); 

    describe('Test Angular Page ',() => 
    { 

     it('user name should be displayed correctly #try',() =>  
     { 

      var count = datafile.length; 

      for (var i=0; i<count; i++) 
       { 
       var value = datafile[i];    
       browser.refresh(); 
       element(by.model('yourName')).sendKeys(value); 
       (element(by.binding('yourName'))).getText() 
         .then(function (txt) 
           {                   
          expect(txt).toEqual('Hello '+ value+'!'); 
          //this is failing        
}) 

     }  
     }); 
下面

是我data.json

[ 
    "A1","A2","A3" 
    ] 
下面

是的result-

1) Test Angular Page user name should be displayed correctly #try 
    Message: 
    Expected 'Hello A1!' to equal 'Hello A3!'. 
    Stack: 
     Error: Failed expectation 
     at D:\Demo_Protractor\test.spec.js:24:44 
     at elementArrayFinder_.then (C:\User s\leenasharma\AppData\Roaming\npm\node_modules\protractor\lib\element.ts:840:22) 
    at ManagedPromise.invokeCallback_ (C:\Users\leenasharma\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:1366:14) 
    at TaskQueue.execute_ (C:\Users\leenasharma\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2970:14) 
    at TaskQueue.executeNext_ (C:\Users\leenasharma\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2953:27) 
    at asyncRun (C:\Users\leenasharma\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:2813:27) 
    at C:\Users\leenasharma\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\promise.js:676:7 
    at process._tickCallback (internal/process/next_tick.js:109:7) 
    Message: 
     Expected 'Hello A2!' to equal 'Hello A3!'. 
     Stack: 
     Error: Failed expectation 
+0

在【例5】看看(https://stackoverflow.com/ a/111111/4472840) –

回答

1
it('user name should be displayed correctly #try',() => { 
    var count = datafile.length; 
    var value, i; 
    for (i = 0; i < count; i++) { 
    value = datafile[i]; 
    browser.refresh(); 
    element(by.model('yourName')).sendKeys(value); 
    (element(by.binding('yourName'))).getText() 
     .then(function(txt) { 
     expect(txt).toEqual('Hello ' + value + '!'); 
     //this is failing        
     }) 
    } 
}); 

var某些部分具有唯一的功能水平范围,不存在块级别范围。在for循环中添加var value不会为每次迭代创建变量。它将被悬挂在变量提升功能的顶部。您的getText()是异步的,到then被称为循环结束时,value成为上次迭代中指定的值,即。 A3

作为解决方案,您可以使用es6 let而不是var来声明您的valuelet会给你块级别的范围。

it('user name should be displayed correctly #try',() => { 
    var count = datafile.length; 
    for (let i = 0; i < count; i++) { 
    let value = datafile[i]; 
    browser.refresh(); 
    element(by.model('yourName')).sendKeys(value); 
    (element(by.binding('yourName'))).getText() 
     .then(function(txt) { 
     expect(txt).toEqual('Hello ' + value + '!'); 
     //this is failing        
     }) 
    } 
}); 

话虽这么说,量角器/茉莉犯规的最新版本要求getText()这样处理与then。您使用的是哪种角度,茉莉花和量角器?

expect()确定参数是否是一个承诺或不和 基于执行异步或同步。

为什么在每次迭代时都要做browser.refresh()?我的意图不明确。

+0

非常感谢。有效。 – Pheonix68410

+0

关于browser.refresh,我试着每次在新页面上运行这个测试用例。我也可以使用清除功能。试验和学习。史蒂夫在下面的回应中提供的解决方案也在起作用。现在我正试图将两者联系起来。再次感谢! – Pheonix68410

1

问题是您正在检查异步完成的承诺中的值。

重构代码因此预计()解析对您的承诺:

expect(element(by.binding('yourName'))).getText())).toEqual('Hello '+ value+'!'); 

的更多信息,可以发现on the protractor documentation

+0

非常感谢史蒂夫! – Pheonix68410

+0

如上所述,我想了解如何通过使用expect来解决变量的范围问题。有没有什么好的指针和引用来理解JS的这些异步概念? – Pheonix68410