Hvordan reflektere kjeding (ControlFlow) av Protractor (WebDriver) handlinger i TypeScript


I en vinkelmåler-test er det mulig å kette handlinger som «clear» og «sendKeys» på et element på denne måten:

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

Jeg liker den kompakte stilen på den. Men hvorfor fungerer den?

I henhold til API-dokumentasjonen for webdriver.Element.clear() er returtypen til clear() webdriver.promise.Promise.<void>

Når jeg kompilerer det med TypeScript (1.8.x), klager kompilatoren på at det ikke finnes en egenskap kalt sendKeys() på Promise. Og jeg tror faktisk at det er tilfellet.

Jeg tror dette fungerer under kjøring på grunn av WebDriver ControlFlow-magi.

Hvordan kan jeg utvide TypeScript-deklarasjonsfilen til Protractor for å reflektere denne ControlFlow-magien og gjøre TypeScript-kompilatoren min fornøyd?

Svar #1

Du kan kaste det til typen <any> slik:

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

Stygt, men fungerer uten TS-klagen.

Svar #2

vi endte opp med å legge til funksjonen i navneområdet slik

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

Relaterte artikler