为什么browser.wait(ExpectedConditions.presenceOf())导致我的方法链返回Promise >

问题描述 投票:1回答:1

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

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

typescript promise protractor
1个回答
2
投票

量角器使用它自己的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的结果实际上不是是。