我正在写一些这样的量角器测试:
import { browser, element, by, ExpectedConditions } from 'protractor';
export class SomePage {
private elements: any = {};
navigateToUpdate(name: string) {
return browser.get(`/policies/${name}`)
.then(() => browser.waitForAngular())
.then(() => browser.wait(this.statusIsPresent))
.then(() => this.initElements());
}
private initElements(): Promise<void> {
// Do stuff here
return Promise.resolve();
}
private get statusIsPresent(): Function {
return ExpectedConditions.presenceOf(element(by.id('status')));
}
}
由于wait()
navigateToUpdate()
返回Promise<Promise<void>>
。我不明白为什么,我不明白这是否是一个潜在的问题,造成我不明白的错误。
无论browser.wait()
返回的是什么,Promise.resolve().then(() =>browser.wait()).then(() => something())
都不会返回something()
返回的内容,而不是something()
返回的承诺?
答案 0 :(得分:2)
Protractor使用它自己的promise库(实际上它们是在selenium模块中实现的,但它并不重要),并且它的定义不能正确地解包默认的promises(内置的)。如果你使用量角器承诺,结果就像预期的那样:
private initElements(): promise.Promise<void> {
// Do stuff here
return promise.fullyResolved(null)
}
navigateToUpdate(name: string) { // return type is inferred to promise.Promise<void>
return browser.get(`/policies/${name}`)
.then(() => browser.waitForAngular())
.then(() => browser.wait(this.statusIsPresent))
.then(() => this.initElements());
}
它也适用于async/await
async navigateToUpdate(name: string) {// return type is inferred to promise.Promise<void>
await browser.get(`/policies/${name}`);
await browser.waitForAngular();
await browser.wait(this.statusIsPresent);
await this.initElements();
}
如果有人试图读取promise返回类型,这将导致错误,因为实现将解包promise,而类型系统不知道这个并且它会告诉你promise的结果是一个承诺事实上不是。