如何在 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 一起在移动设备上进行网站测试
如何使用 REST + CodeceptJS 测试 API,访问受 Auth0 保护?
使用 WebDriver 在 codeceptJS 中按类获取元素