2016-03-29 14 views
1

Ich habe viele Tests, wo das Skript zuerst ausgeführt wird, bevor der Browser tatsächlich startet, und dies manchmal den Test falsch ausgeführt wird. Das letzte Szenario, das mich tatsächlich Probleme verursacht, ist ein try/catch Ausdruck, wo es nicht wirklich die Tatsache abfängt, dass einige der Elemente nicht vorhanden sind (obwohl erwartet wird, nicht vorhanden zu sein).Nightwatch Skript läuft Code bevor Browser öffnet

In meinem Test versuche ich eine Liste von 5 Produkten zu durchlaufen, versuche sie in den Warenkorb zu legen und suche nach einer Schaltfläche. Für einige der Produkte, die ich kenne, muss die Schaltfläche "In den Warenkorb" vorhanden sein. In einigen Fällen weiß ich, dass sie nicht da sein wird. Daher versuche ich, den Fehler zu erkennen und mit dem nächsten fortzufahren. (Ich weiß, es ist nicht der klügste Ansatz, aber ich versuche nach und nach zu lernen und meine Programmierkenntnisse in Javascript zu verbessern).

Also das ist mein Test enthält als Hauptfunktionalität neben Testdaten aus einer Datei zu lesen und einige Variablen Deklaration:

var myFunction = function (x) { 
     var productID = data[x][0]; 
     var quantity = data[x][1]; 
     browser.url(homepage + 'p/' + productID); 


     try { 
      pageObject.addToCart(quantity); 
      pageObject.click('@continueShopping'); 
      browser.pause(500); 
      browser.assert.ok(true); 
      } 
     catch (err) { 
      console.log('This error is expected'); 
      browser.asset.ok(true, 'but the product is not addable to cart'); 
     }; 
    } 


for (var i = 0; i < data.length; i++) { 
     myfunction(i); 
    } 

ich diese bekommen:

[Add To Cart Different Products] Test Suite 
================================================================== 

Running: Add to cart different types of products 
? Passed [ok]: true ok 
? Passed [ok]: true ok 
? Passed [ok]: true ok 
? Passed [ok]: true ok 
? Passed [ok]: true ok // this means is ran through whole list of 5 products already and just afterwards it starts trying to actually add them to cart (run the code) 
? Element <body> was visible after 360 milliseconds. 
ERROR: Unable to locate element: "#addToCartButton" using: css selector 
ERROR: Unable to locate element: ".continueShopping" using: css selector 

Was hier passiert, ist, dass das Skript die Assertionen sofort nach dem Start ausführt, aber bevor das Browserfenster tatsächlich gestartet wird. Und sobald es gestartet wird, startet es die Add-to-Cart-Aktionen. So sieht es für mich aus, dass es nicht wirklich die ganze Sequenz von Code innerhalb try läuft, die den Punkt der Verwendung der try/catch an erster Stelle bricht.

Wie kann ich diese Situation lösen? Gibt es eine Möglichkeit, das Skript darauf warten zu lassen, dass der Browser tatsächlich gestartet wird? Oder vielleicht, um zu überprüfen, ob es gestartet wurde? Ich habe das Gefühl, dass es etwas Bestimmtes für Nightwatch gibt, das dieses asynchrone Verhalten erzeugt und das ich vermisse, wenn ich meine Tests schreibe. Könnten Sie bitte etwas Licht dazu bringen?

Hinweis:/Bearbeiten Bitte beachten Sie, dass ich habe einen before Block vor meinem Test, dass es den Browser erste und stellen Sie sicher, dass der Körper sichtbar starten sollte. Wie Sie jedoch in den Konsolenergebnissen feststellen können, tritt dies nach dem Ausführen der Assertionen auf und hat daher keine Auswirkungen.

before : function (browser) { 
     browser.url(homepage) 
     .waitForElementVisible('body', 5000); 
}, 

Update: suggestiv jemand, sollte dies durch die Verwendung Rückrufe bei dieser Funktion erreicht werden, was ich versucht habe. wenn ich es wie folgt verwendet:

var myFunction = function (x) { 
     console.log("on line" + x); 
     return x; 
    }; 

    var callback = function (y) { 
     //var declaration etc 
     try { //the code here } 
     catch (err) { //the code here }    
    }; 

    for(var lineNr = 0; lineNr < data.length; lineNr++) { 
     myFunction(lineNr, function(){ 
      console.log(lineNr); 
      callback(lineNr); 
     }); 
    } 

oder so:

var myFunction = function (x,callback) { 
     console.log("on line" + x); 
     callback(x); 
    }; 

    var callback = function (y) { 
     // variables declaration 
     try { //code here} 
     catch (err) { //code here } 
    }; 
    for(var lineNr = 0; lineNr < data.length; lineNr++) { 
     myFunction(lineNr); 
    } 

ich habe die gleichen Ergebnisse erhalten, keinen Erfolg damit. oder mache ich es falsch?

Antwort

0

bisschen spät, um dies zu beantworten ...sondern auch für andere, die noch auf dieser Blockierung

Da Selen api sind asynchrone Nachtschwärmer sie betrügen uns lassen Test in synchronen Weise

zu zwingen nightwach laufen Aktionen synchronouly Sie haben 2 Möglichkeiten:

- js Art und Weise => erstellen Versprechen

- Nachtwache Weg => setzen Sie Ihre Aktionen in einen "perform" bloc

this.perform(function() { 
    try { 
     pageObject.addToCart(quantity); 
     pageObject.click('@continueShopping'); 
     browser.pause(500); 
     browser.assert.ok(true); 
    } 
    catch (err) { 
     console.log('This error is expected'); 
     browser.asset.ok(true, 'but the product is not addable to cart'); 
    }; 
}); 
+0

Recht, wir gingen mit den Versprechungen, obwohl es ein bisschen mehr Programmierkenntnisse erfordert. Danke für die Antwort, ich denke, das ist der richtige Weg, ja. – anasarbescu