如何在不依赖 SELENIUM_PROMISE_MANAGER 进行同步的情况下让量角器测试等待多个元素?

How do I make a Protractor-test wait for multiple elements without relying on SELENIUM_PROMISE_MANAGER for synchronization?

[类似的问题以前也有人问过和回答过,但可用答案依赖SELENIUM_PROMISE_MANAGER同步。]

我是 运行 一个处理所有异步 activity 和 async/await 的测试环境。 AUT 在 dom 中加载一些东西,比如

<span class="bicon-lock_closed" data-month="8" data-year="2020"></span>
<span class="bicon-lock_closed" data-month="9" data-year="2020"></span>
<span class="bicon-lock_closed" data-month="10" data-year="2020"></span>
<span class="bicon-lock_closed" data-month="11" data-year="2020"></span>

这些元素中至少有一个始终存在。 Protractor 需要等待至少一个出现的预期条件。这是我得到的:

let lockIconArray: ElementArrayFinder = $$( "span.bicon-lock_closed" );

await browser.wait( Utils.presenceOfAll(lockIconArray, 2) , Data.TIMEOUT.M);
await lockIconArray.count().then( async (numberOfLocks) => {
   await console.log( "Number of elements present: " + numberOfLocks );
   await expect( numberOfLocks ).toBeGreaterThanOrEqual(2);
} );

调用静态方法class 'Utils':

public static async presenceOfAll(elements: ElementArrayFinder, minCountNo: number): Promise<boolean> {
      return Promise.resolve( elements.count().then( (count) => {
            return count >= minCountNo;
      } ) );
}

Protractor 似乎根本没有等待。这会立即记录到控制台:

Number of elements present: 1

Expected 1 to be greater than or equal 2.

我认为这可以通过在 'presenceOfAll':

之前使用另一个 'await' 来解决
await browser.wait( await presenceOfAll(mEditor.lockIconArray, 2) , Data.TIMEOUT.M);

我走的路对吗?如果是这样:我如何让 'presenceOfAll' 方法解决第二个承诺?

如有疑问,您可以编写函数而不是使用 ExtectedConditions 库。在这种情况下,你可以做

let lockIconArray = $$('.bicon-lock_closed');
await browser.wait(
  async () => (await lockIconArray.count()) > 2, 
  5000, 
  `message on failure`
);