Rolf B: Problem TypeScript with Promise

Beitrag lesen

Hallo Newbie,

ich bin in Typescript, Angular und Protractor nicht wirklich geübt.

Aber: die Methoden clear() und sendKeys() des ElementFinder liefern Dir ein Promise zurück. Auf dieses Promise solltest Du warten, bis es resolved ist, damit die Folgeaktionen Sinn ergeben.

Genau das tust Du bereits mit dem await. Das ist der Typescript-Weg um zu sagen: Da kommt ein Promise, warte darauf und mach dann weiter. Dein Code sollte ausreichen, um die diversen .clear() und .sendKeys() Aufrufe strikt nacheinander aufzurufen.

Dadurch, dass deine perform-Methode ihrerseits async ist, gibt sie ebenfalls ein Promise zurück. Das heißt:

obj.perform();
obj.testrequest(2019, 06, 11, 13, 14, 15);

funktioniert so nicht, weil perform sofort zurückkehrt. Die clear() und sendKeys() Aufrufe sind nocht nicht fertig.

Das hier sollte besser funktionieren:

await obj.perform();
obj.testrequest(2019, 06, 11, 13, 14, 15);

Das muss wiederum in einer async-Funktion stehen, damit es funktioniert.

Das von Dir programmierte Beispielpromise tut jedenfalls nicht viel; es wartet eine Sekunde und gibt dann this.CoP zurück. In reinem JavaScript wäre das ein Fehler, weil in einer Callback-Funktion this eine andere Bedeutung bekommt. Aber es ist Typescript und der Transpiler könnte das anders sehen.

Ein Hinweis noch zu deinen Lokatoren:

element(by.id("hf-d1")).element(by.className("dateform year"))

Das soll doch sicherlich bedeuten: Finde das Element mit id hf-d1 und suche darin ein Element mit dem class-String "dateform year". Zum einen kann man das sinnvoller kombinieren, zum anderen ist eine Suche nach className sehr fragil. Das class-Attribut kann mehrere Klassen auflisten, und man kann da "dateform year" genauso schreiben wie "year dateform". Du wärest hier mit dem css Lokator besser bedient, der einen CSS Selector akzeptiert:

element(by.css("#hf-d1 .dateform.year"))

Damit bist Du von der konkreten Reihenfolge im class-Attribut unabhängig, und es können auch noch weitere Klassen oder Leerzeichen im Attribut stehen, ohne dass deine Suche kaputtgeht.

Rolf

--
sumpsi - posui - clusi