除了尝试捕获或承诺拒绝之外,有没有办法处理量角器的预期条件?

Posted

技术标签:

【中文标题】除了尝试捕获或承诺拒绝之外,有没有办法处理量角器的预期条件?【英文标题】:Is there a way to handle Protractor's Expected conditions when they're not met other than try catch or promise reject 【发布时间】:2021-07-01 08:26:32 【问题描述】:

我正在使用量角器来自动化 Web 测试以及异步/等待模式。

假设我有一个元素,它只在我第一次单击特定切换时出现。

问题是,当它出现时,我想点击它。

有没有办法等待这个元素,如果它出现我点击它,如果没有,我点击别的东西然后继续我的操作而不使用 try/catch 块

它应该是这样的(请注意,这是假设的):

/*This will click on the toggle that might trigger the extra element to appear*/
await this.toggle.click()
const isExtraElementPresent = await browser.wait(ExpectedConditions.presenceOf(extraElement),2000);
if (isExtraElementPresent )
    await extraElement.click();

我现在正在做的事情如下:

await this.toggle.click();
try 
    await this.extraElement.click();
    
catch (error) 
    await console.log("Extra element didn't appear.");
    

【问题讨论】:

我认为第一个 sn-p 看起来很合理。告诉我进展如何。 【参考方案1】:

try/catch 是处理这种情况的唯一方法。

try 
  // wait for the element
 catch (error) 
  // do whatever if the element is not present

但是,你应该考虑避免它,原因如下

你的逻辑如下

登录 等待可能不存在的元素 2 秒 尝试点击

在大多数登录尝试中,您的第二个项目需要 2 秒,因此几乎是browser.sleep

正确的模式应该是这样的

var EC = protractor.ExpectedConditions;
var welcomeMessagePresent = EC.presenceOf(welcomeMessageElement);
var firstLoginPopupPresent = EC.presenceOf(firstLoginPopup);
// Waits for either condition
await browser.wait(
  EC.or(welcomeMessagePresent, firstLoginPopupPresent), 
  5000,
  'neither condition satisfied'
);

所以它会等待条件之一。并且可以有任意数量的条件 - 1,2,3...在你的情况下,它是任何一个条件

【讨论】:

以上是关于除了尝试捕获或承诺拒绝之外,有没有办法处理量角器的预期条件?的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义和未处理的承诺拒绝的属性“捕获”

是否有可能在 Promise.all 中捕获所有被拒绝的承诺? [复制]

从 vuex 存储操作中的承诺返回错误

捕获存在时可能未处理的承诺拒绝

在量角器中使用本机承诺

量角器 - 处理“then”承诺使它们更具可读性