Protractor 量角器:当元素未找到错误时,为什么测试不会失败?

Protractor 量角器:当元素未找到错误时,为什么测试不会失败?,protractor,chai,cucumberjs,Protractor,Chai,Cucumberjs,这是我的测试堆栈: “chai”:“^3.5.0”, “承诺的柴”:“^6.0.0”, “黄瓜”:“^1.3.3”, “量角器”:“~5.1.2”, “量角器框架”:“^3.1.0”, +selenium-server-standalone-3.4.0.jar 当我运行我的场景但未找到元素时(自上次运行测试以来DOM已更改),所有步骤均为绿色,但测试以异常结束: [15:51:49]E/launcher-使用定位器未找到任何元素:by.cssContainingText(“复选框”,“énerg

这是我的测试堆栈:
“chai”:“^3.5.0”,
“承诺的柴”:“^6.0.0”,
“黄瓜”:“^1.3.3”,
“量角器”:“~5.1.2”,
“量角器框架”:“^3.1.0”,
+selenium-server-standalone-3.4.0.jar

当我运行我的场景但未找到元素时(自上次运行测试以来DOM已更改),所有步骤均为绿色,但测试以异常结束:

[15:51:49]E/launcher-使用定位器未找到任何元素:by.cssContainingText(“复选框”,“énergie”)
[15:51:49]E/launcher-NoSuchElementError:使用locator:by.cssContainingText(“复选框”,“énergie”)未找到任何元素

我希望测试失败并显示红色结果,失败的步骤应该抛出一条异常消息。这是我使用Behat时的行为。量角器或量角器配置有问题吗

编辑:

以下是我的实现:

this.When(/^I fill "([^"]*)" step$/, function (step) {    
    element(by.cssContainingText("checkbox", "Électricité")).click();  
    element(by.cssContainingText("checkbox-multi", "Chauffage")).click();  
    element(by.buttonText("Suivant")).click();  
});

我还没有看到您的step实现,但我认为您的代码中有一个“bug”。我们通常会看到这些错误:

  • 已使用回调完成步骤实现,但尚未返回回调
  • step的实施是有承诺的,但承诺没有得到解决
在这里,您将找到这两种方法的示例实现。请尝试一下,看看是否有帮助,否则请将步骤实现粘贴到此处,让我们更好地帮助您

//带有回调
然后(/^我希望它变成绿色$/,函数(回调){
expect(元素(by.css(“#选择器”)).getText()
.to.finally.equal('I am green')。和.notify(回调);
});
//承诺
然后(/^我希望它变成绿色$/,函数(){
返回expect(元素(by.css(“#选择器”)).getText()
.to.finally.equal('我是绿色的');

});如果进程以199返回代码退出,它就是量角器捕获该异常并结束进程。您需要告诉它忽略未捕获的异常,如图所示

编辑:

您还需要返回最后一个承诺,以便cucumber知道该步骤何时实际完成。在您的步骤定义中,这只不过是安排这些单击发生,然后返回

return element(by.buttonText("Suivant")).click(); 

解决了我的问题。现在很清楚,我必须对DOM中所有可能的错误进行编码。它添加了大量代码,我怀疑它也会减慢我的测试速度…

当我添加“ignoreUncaughtExceptions:true”时,测试仍然是绿色的:1个场景(1个已通过),但如果找不到元素,它已退出。对我来说,行为是不一致的。我不是在这个场景的这一部分断言,我只是在我的表单上填写步骤。如果元素发生更改或丢失,我是否必须明确地在所有元素上编写所有chai断言才能获得消息?我用我的实现编辑了我的帖子。谢谢你的回答。基于你的新信息。你搜索过量角器的git了吗,例如,你会在那里找到。这是“默认”行为。如果这种情况发生在特定元素上,则可以捕获它们。顺便问一下,
checkbox
是一个自定义标记,因为复选框本身没有文本,所以
cssContainingText
不起作用,所以我应该为所有元素编写所有“try…catch”代码,以查看报告中的错误消息。这不是一个好消息。谢谢你讲清楚了。(是的,这里的“checkbox”是一个自定义类,因此它有一个与文本相关的类)。不,您不必显式地处理承诺拒绝和重新提交。返回承诺将允许cucumber处理它并使步骤失败。关键是回报承诺。@darrin:你的方式也在起作用。现在的选择是保留默认错误消息或编写更友好的错误消息,然后我必须抛出错误。您可以在expect语句中编写自己的消息:return expect(element.getAttribute('foo'),“此消息在失败时显示”)。to.finally.equal('bar')。。。最初的问题可能是,如果您不告诉量角器,它不会等待您的承诺解决,因此它将在执行所有步骤之前通过该步骤(单击某个元素也会返回承诺!)==>函数thistep(回调){element.click()。然后(函数(){anotherElement.click())。然后(回调)}