CodeceptJS中如何使用Try Catch

8

我正在我的页面对象中实现以下内容:

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 Meyer
@lorenz,那只是一个错误日志的任意字符串。我可以在那里传递“ABCD”。但我不认为这会导致我的catch块被跳过。 - Dingredient
@PatMeeker 你最终解决了这个问题或找到了解决方法吗?我也遇到了同样的问题。以下是我的一些想法: (1)由于I.*函数通常返回promises,因此您需要在I.selectOption调用之前放置await,以便catch捕获失败。 (2)我有一个预感,这是因为CodeceptJS使用全局promise链。因此,如果I.*失败,则内部全局promise将失败,而不管是否被捕获。 - drmercer
很遗憾,@drmercer。在我的情况下,我可以将上下文信息传递给我的方法,我用它来有条件地选择选项,这看起来不如我的懒惰方法那么干净 - 先尝试选择,然后再做出反应。无论如何,我想另一种方法可能是使用JS Executor,并将您需要的任何非断言方法的功能复制到自己的自定义JS函数中,如果您真的想使此流程工作。 - Dingredient
2个回答

2

在promise链中应该使用try-catch。我认为你可以这样做:

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

1
当我尝试你的方法时,我实际上看到了来自I.say()的日志,所以这是一个进步。但是,捕获块并没有被跳过。然而,异常并没有被捕获。它仍然未通过我的测试.... - Dingredient
与我的原始代码一样,您的答案在从像I.see()这样的断言抛出错误时也能正常工作,但仍无法处理I.selectOption()。 - Dingredient

0
I.selectOption(this.SELECT, this.OPTION)
.then(() => I.say('try block'))
.catch(() => I.say('catch block'));

1
这个答案可以通过解释为什么这样做可以起作用来大大改进。 - Rúnar Berg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接