【问题标题】:Why does browser.wait(ExpectedConditions.presenceOf()) cause my method chain to return Promise<Promise<boolean?>>为什么 browser.wait(ExpectedConditions.presenceOf()) 导致我的方法链返回 Promise<Promise<boolean?>>
【发布时间】:2018-03-06 21:01:00
【问题描述】:

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

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&lt;Promise&lt;void&gt;&gt;。我不明白为什么,我不明白这是否是一个潜在的问题,会产生我不明白的错误。

无论browser.wait() 返回什么,Promise.resolve().then(() =&gt;browser.wait()).then(() =&gt; something()) 不应该返回任何something() 返回,而不是任何something() 返回的 Promise?

【问题讨论】:

  • then 方法的类型不明确,可能 Typescript 无法正确推断结果类型。尝试将navigateToUpdate 的返回类型显式注释为Promise&lt;void&gt;,它可能仍然可以正常编译。

标签: typescript promise protractor


【解决方案1】:

Protractor 使用它自己的 Promise 库(实际上它们是在 selenium 模块中实现的,但这并不重要),并且它的定义没有正确解开默认的 Promise(内置的 Promise)。如果您使用量角器承诺,则结果符合预期:

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 的结果是 promise其实不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2020-04-11
    相关资源
    最近更新 更多