Website-Suche

Wie man die Verkettung (ControlFlow) von Protractor (WebDriver)-Aktionen in TypeScript reflektiert


In einem Protractor-Test ist es möglich, Aktionen wie „clear“ und „sendKeys“ auf einem Element wie folgt zu verketten:

element(by.id('myId')).clear().sendKeys('123456789')

Ich mag den kompakten Stil davon. Aber warum funktioniert es?

Laut der API-Dokumentation von webdriver.Element.clear() ist der Rückgabewert von clear() webdriver.promise.Promise.<void>

Wenn ich es mit TypeScript (1.8.x) kompiliere, beschwert sich der Compiler, dass es keine Eigenschaft namens sendKeys() auf Promise gibt. Und ich denke, dass das tatsächlich der Fall ist.

Ich glaube, dass dies zur Laufzeit aufgrund des WebDriver ControlFlow-Magics funktioniert.

Wie kann ich die TypeScript-Deklarationsdatei von Protractor erweitern, um diese ControlFlow-Magie widerzuspiegeln und meinen TypeScript-Compiler zufrieden zu stellen?

Antwort #1

Sie können es wie folgt in den Typ <any> umwandeln:

(<any> someInput.clear()).sendKeys()

Hässlich, aber funktioniert ohne die TS-Beschwerde.

Antwort #2

Wir haben schließlich die Funktion auf diese Weise zum Namespace hinzugefügt

declare namespace webdriver.promise {
    interface Promise<T> {
        sendKeys(s: String);
    }
}

Verwandte Artikel