为什么browser.wait(ExpectedConditions.presenceOf())导致我的方法链返回Promise <promise <boolean?>&gt;

时间:2018-03-06 12:44:37

标签: typescript promise protractor

我正在写一些这样的量角器测试:

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()返回的承诺?

1 个答案:

答案 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的结果是一个承诺事实上不是。