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?
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