2017-06-13 198 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