这是我的Page Object类

export class TopMenu {
  topbarMenu: ElementFinder;
  menuItems;
  numberofMenuItems: number;

  constructor() {
    console.log("TopMenu constructor called");
    this.setMenus();
  }

  async setMenus() {
    console.log("aaaaaaaaaa");
    this.topbarMenu = await element(by.css("ul[class*='topbar-menu']"));
    console.log("bbbbbbbbbb");
    this.menuItems = await this.topbarMenu.all(by.xpath("./li"));
    console.log("ccccccccc");
  }
}


这是我的“ it”块。这是程序的起点。

it("Click all Submenues 3", async () => {
    browser.waitForAngularEnabled(true);


    let topMenu: TopMenu = await new TopMenu();
    console.log("ddddddddddddddd");
}


我的输出是这样的

**TopMenu constructor called
aaaaaaaaaa
bbbbbbbbbb
ddddddddddddddd
ccccccccc


正如您从我上面的输出中看到的那样,在此行解析“ TopMenu类内的this.menuItems = await this.topbarMenu.all(by.xpath("./li"));”之前,调用了“ console.log(“ ddddddddddddddd”)“

可以省略吗?

我要在完全创建“ TopMenu”后执行我在“ it block”中的任何行。

如何像这样控制流量?

最佳答案

await构造一个构造函数,除非您构造一个Promise(不是这样),否则没有意义,因为构造函数无法返回Promise(创建Promise时除外)

您可能想要做类似的事情

export class TopMenu {
  topbarMenu: ElementFinder;
  menuItems;
  numberofMenuItems: number;
  somePromise;

  constructor() {
    console.log("TopMenu constructor called");
    this.somePromise = this.setMenus();
  }

  async setMenus() {
    console.log("aaaaaaaaaa");
    this.topbarMenu = await element(by.css("ul[class*='topbar-menu']"));
    console.log("bbbbbbbbbb");
    this.menuItems = await this.topbarMenu.all(by.xpath("./li"));
    console.log("ccccccccc");
  }
}

it("Click all Submenues 3", async () => {
    browser.waitForAngularEnabled(true);


    let topMenu: TopMenu = new TopMenu();
    await topMenu.somePromise;
    console.log("ddddddddddddddd");
}


现在,您的it块将等待setMenus返回的承诺

注意:根据您获得的输出,我可以放心地说element(...不是异步的(嗯,它没有返回Promise,它很可能具有异步性,但是根本没有“暴露”)-因此您不需要await element(....

关于javascript - Protractor 和异步/等待,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55084884/

10-14 20:34
查看更多