2016-07-12 4 views
0

Angenommen, ich habe einen Nightwatch-Test mit zwei Schritten, die ein Formular ausfüllen. Als Teil des ersten Schritts muss ich dynamisch einige Daten von der Seite abfragen (mit Selenium api), dann diese Daten verwenden, um zusätzliche Selen-Aufrufe zu machen, und das Endergebnis verwenden, um benutzerdefinierte Assertions zu erstellen. Der Grund, warum ich das Selenium api verwenden muss, ist nicht, dass ich nicht weiß, wie man die normalen Nightwatch-Behauptungen verwendet, sondern dass die normalen Behauptungen nicht ausreichen, um die Arten von Dingen zu testen, die ich testen möchte. Zusätzlich wird am Ende des ersten Schritts ein Knopf gedrückt, der zum nächsten Teil des Formulars weitergeht (in Vorbereitung auf den zweiten Schritt).Nightwatch.js Async Selenium Operationen

(Code-Version):

module.exports = { 
    'Part 1': (client) => { 

    // ... do cool stuff 

    client.SOME_SELENIUM_COMMAND(...SOME_ARGS..., (result) => { 

     client.SOME_OTHER_SELENIUM_COMMAND(...SOME_OTHER_ARGS..., (result2) => { 
     // ... do more cool stuff with result2 
     }); 
    }); 

    // moves the page onto part 2 
    client.click(SOME_BUTTON); 
    }, 

    'Part 2': (client) => { 
    // ... part 2 stuff 
    } 
}; 

Mein Problem ist folgendes: Der Test schiebt sich auf den zweiten Teil vor dem Selen Befehl Ergebnis Teil löst.

Ich bin mir bewusst, dass Nightwatch intern eine Art von Ereigniswarteschlange und EventEmitter verwendet, um sicherzustellen, dass Befehle in der richtigen Reihenfolge ausgeführt werden. Es scheint jedoch, dass der Klickbefehl am Ende von Teil 1 in die Warteschlange gestellt wird der Rückruf kann sein.

Antwort

5

können Sie die Nightwatch perform command verwenden einige andere Befehle auszuführen und done() aufrufen, wenn Sie die Prüfung Teil fortsetzen möchten 2. Sie würde so etwas wie tun: für die Antwort

module.exports = { 

    'Part 1': (client) => { 

    // ... do cool stuff 

    client 
    .perform(function(client, done) { 

     client.SOME_SELENIUM_COMMAND(...SOME_ARGS..., (result) => { 

      client.SOME_OTHER_SELENIUM_COMMAND(...SOME_OTHER_ARGS..., (result2) => { 
       // ... do more cool stuff with result2 
       // Call done to continue to Part 2 
       done(); 
      }); 
     }); 
    }) 
    // moves the page onto part 2 
    .click(SOME_BUTTON); 
    }, 

    'Part 2': (client) => { 
    // ... part 2 stuff 
    } 
}; 
+0

Dank! Wofür soll der Befehl .perform eigentlich verwendet werden? (Die Dokumentation scheint nicht zu beschreibend) – dwoodwardgb

+0

Ich würde sagen, dass es im Grunde verwendet wird, wenn Sie etwas tun möchten, das die API nicht standardmäßig unterstützt oder wenn Sie asynchrone Operationen ausführen möchten. 'Perform' könnte verwendet werden, um Javascript auszuführen oder die API aufzurufen, da das erste Argument für diese Funktion das Browser-Objekt ist. Die nette Sache ist, dass Sie steuern können, welche Operation ausgeführt werden soll, und rufen Sie dann die Funktion 'done()' auf, wenn Sie möchten, dass sie mit dem nächsten Schritt fortfährt. Hat das dein Problem gelöst? –

+0

Ja. Momentan habe ich viel Abstraktion aufgebaut (mit Versprechen und Seitenobjekten). Es wird einige Zeit brauchen, um herauszufinden, wie man diese neue Art des Aufrufs der API in diese Richtung anwendet ... – dwoodwardgb