1

Ich verwende nightwatch-cucumber mit der Verwendung von PageObjects, um Tests zu automatisieren. basierend auf nightwatch.js. Also, ich bin komplett neu in JavaScript. Bisher bevorzugte ich Java als Sprache für die Selenium/WebDriver-Automatisierung.Behandeln Sie mehrere Elemente mit dem gleichen Selektor mit nightwatch.js

Ich möchte mehrere Eingabefelder mit definierten Werten bearbeiten. Das Problem ist, dass alle diese Eingabefelder denselben Selektor haben. Und die Anzahl der Eingabefelder ist zu Beginn eines Tests nicht bekannt oder unterscheidet sich von Test zu Test. Also, ich brauche eine Lösung. In der „heiligen“ java Welt kann ich etwas tun:

List<WebElement> listOfElements = webdriver.getElements('input.myclass'); 
for (WebElement el : listOfElements) { 
    el.sendKeys("abc"); 
} 

In JavaScript ist es ein wenig kompliziert, und ich weiß nicht, mit zu behandeln. In meinem PageObject habe ich versucht, die folgenden:

module.exports = { 
    elements: {}, 
    commands: [{ 
    test() { 
     this.api.elements('css selector', 'input.myclass',function (result) { 
     for (var i = 0; i < result.value.length; i++) { 
      console.log(result.value[i].ELEMENT); 
      this.api.elementIdValue(result.value[i].ELEMENT, 'abc'); 
     } 
     }); 

     this.api.pause(3000); 
     return this.api; 
    } 
    }] 
}; 

Aber das funktionierte nicht für mich. In diesem Fall bekomme ich einen Fehler während der Testausführung (TypeError: Cannot read property 'elementIdValue' of undefined). Außerdem möchte ich nicht alles in der asynchronen Callback-Funktion behandeln, da die folgenden Testschritte möglicherweise die vollständige Bearbeitung der mehreren Eingabefelder erfordern.

Also, wie kann ich eine solche Lösung implementieren, um mehrere Elemente in nightwatch-cucumber mit und ohne Callback-Funktionen zu behandeln? Und was bevorzugen Sie in diesem Fall?

+0

Es gibt keine Möglichkeit, den Rückruf zu vermeiden, da alle Befehle asynchron ausgeführt werden. Was den Fehler anbelangt, ist dies auf den Kontext von "this" zurückzuführen, der eine andere Referenz in dem an "this.api.elements" bereitgestellten Callback enthält. –

Antwort

0

thx an @Florent B.

ich meine eigene Frage beantwortet. Der folgende Code funktioniert bei mir jetzt:

module.exports = { 
    elements: {}, 
    commands: [{ 
    test() { 
     this.api.elements('css selector', 'input.myclass',function (result) { 
     for (var i = 0; i < result.value.length; i++) { 
      this.elementIdValue(result.value[i].ELEMENT, 'abc'); 
     } 
     }); 

     return this.api; 
    } 
    }] 
}; 

Da der Code innerhalb der Callback-Funktion asynchron läuft Ich denke, Sie für einen besonderen Zustand warten müssen (beispielsweise mit waitForElementVisible) mit dem automatisierten Test zu gehen. Denn manchmal muss man für die erfolgreich abgeschlossene Callback-Funktion erst noch mit den nächsten Schritten in automatisierten Tests fortfahren.

Verwandte Themen