2017-06-13 3 views
4

Ich schreibe folgenden JS Code mit Winkelmesser. Hier habe ich eine data.json-Datei verwendet, um Daten für meinen Testfall zu lesen. In diesem Testfall lese ich einfach das Objekt aus diesem JSON und vergleiche es mit einem Wert, den ich aus dem Browser lese.Variable wird falsch inkrementiert

Problem, mit dem ich hier konfrontiert bin, ist in meiner Expect-Anweisung, der Wert aus JSON-Datei ist nicht korrekt.

Könnte jemand bitte helfen, das Problem hier zu identifizieren.

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

     }  
     }); 

unter meinem data.json ist

[ 
    "A1","A2","A3" 
    ] 

unten ist ein Teil der 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

einen Blick auf [Beispiel 5] Nehmen Sie gefunden werden kann (https://stackoverflow.com/ a/111111/4472840) –

Antwort

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 nur Funktionsebene Umfang hat, gibt es keine Block-Ebene Umfang. Durch das Hinzufügen von var value innerhalb der for-Schleife werden keine Variablen für jede Iteration erstellt. Es wird an die Spitze der Funktion mit variablem Heben gehisst. Ihr getText() ist asynchron, bis die then Schleife endet und value der Wert wird, der in der letzten Iteration zugewiesen wird, dh. A3.

Als Lösung können Sie Es6 let anstelle von var verwenden, um Ihre value zu deklarieren. let gibt Ihnen den Blocklevelbereich.

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

aber sagen, dass die neuesten Versionen von Winkelmesser/Jasmin erfordert nicht getText() behandelt auf diese Weise mit then. Welche Version von Winkel, Jasmin und Winkelmesser verwendest du?

expect() bestimmt, ob die Parameter ein Versprechen ist oder nicht, und führt asynchron oder synchron auf dieser Basis.

Warum machst du browser.refresh() auf jeder Iteration? Die Absicht ist mir nicht klar.

+0

Vielen Dank. es funktionierte. – Pheonix68410

+0

in Bezug auf browser.refresh, habe ich versucht, diesen Testfall jedes Mal auf einer neuen Seite auszuführen. Ich hätte auch klare Funktion verwenden können. experimentieren und lernen. Die Lösung, die Steve in seiner Antwort unten gab, funktioniert ebenfalls. und jetzt versuche ich beides zu erzählen. Danke noch einmal! – Pheonix68410

1

Das Problem besteht darin, dass Sie den Wert in einem Versprechen überprüfen, das async ausgeführt wird.

Refaktorieren Code so erwarten() löst das Versprechen für Sie:

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

Weitere Informationen on the protractor documentation

+0

Vielen Dank Steve! – Pheonix68410

+0

Wie oben erwähnt, versuche ich zu verstehen, wie das Problem der Gültigkeit einer Variable gelöst wurde, indem expect verwendet wurde. Gibt es irgendwelche guten Zeigerverweise, um diese asynchronen Konzepte von JS zu verstehen? – Pheonix68410

Verwandte Themen