如何在 CodeceptJS 中尝试 Catch

Posted

技术标签:

【中文标题】如何在 CodeceptJS 中尝试 Catch【英文标题】:How to Try Catch in CodeceptJS 【发布时间】:2018-01-11 13:01:54 【问题描述】:

我在我的页面对象中这样做:

try
    I.selectOption(this.SELECT, this.OPTION);

catch(error)
    I.say('Option missing, but thats sometimes expected ' + error);

但当定位器与选项元素不匹配时,它仍然无法通过测试。

我想赶上并继续测试,不失败。

更新:

看起来这取决于 try 块中的内容。

如果我在那里放一个断言,比如I.see('something');,那么catch块就不会被跳过。但是 try 块中的非断言,例如 I.selectOption('something') 会抛出未被 catch 捕获的错误。

【问题讨论】:

这听起来很奇怪“缺少选项,但有时这是意料之中的”。不过既然你抓到了,这应该不会失败吧? @lorenz,这只是错误日志的任意字符串。我可以在那里传递“ABCD”。但我认为这不会导致我的 catch 块被跳过。 @PatMeeker 您是否曾经想出解决方案或解决方法?我遇到了同样的问题。不过有一些想法: (1) 由于 I.* 函数通常返回承诺,因此您需要将 await 放在 I.selectOption 调用之前,以便 catch 捕获失败。 (2) 我有一种预感,这是因为 CodeceptJS 使用了全局承诺链。因此,如果 I.* 失败,无论是否被捕获,内部全局承诺都会失败。 @drmercer 不幸的是没有。在我的情况下,可以将上下文信息传递给我用来有条件地选择选项的方法,这不像我上面的懒惰方法那样干净 - 先尝试选择然后做出反应。无论如何,我想另一种方法可能是使用 JS Executor,并将您需要的任何非断言方法的功能复制到您自己的自定义 JS 函数中,如果您真的想让这个流程工作的话。 【参考方案1】:

Try-catch 应该在 Promise 链上执行。我认为您可以通过这种方式获得它:

I.selectOption(this.SELECT, this.OPTION).catch(() => I.say(''));

【讨论】:

当我尝试你的方式时,我实际上看到了来自 I.say() 的日志,所以这是一个改进。未跳过 catch 块。但是,没有捕获到异常。它仍然没有通过我的测试...... 与我的原始代码一样,当 I.see() 之类的断言引发错误时,您的回答也可以按预期工作,但仍然不适用于 I.selectOption()【参考方案2】:
I.selectOption(this.SELECT, this.OPTION)
.then(() => I.say('try block'))
.catch(() => I.say('catch block'));

【讨论】:

这个答案可以通过解释为什么会有效来改进

以上是关于如何在 CodeceptJS 中尝试 Catch的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 CodeceptJs 与 appium 一起在移动设备上进行网站测试

使用 CodeceptJS 时如何打开新选项卡或窗口

如何使用 REST + CodeceptJS 测试 API,访问受 Auth0 保护?

使用 WebDriver 在 codeceptJS 中按类获取元素

使用 codeceptJS 在 appium 中单击 Element 不起作用

使用 CodeceptJS/WebdriverIO 并行执行浏览器