我使用的是Protractor和Cucumber,并注意到有些情况我希望捕获NoSuchElementError: No element found using locator: By.cssSelector("someCssLocatorHere")
。但是,使用传统的try / catch块是行不通的,除非我同时调用.then()函数的回调和errBack并抛出错误,以便我可以像以下一样捕获它:
try{
somePromise.then(function(){
//callback function if promise gets resolved successfully
}, function(e){
console.log(e); //errBack in case promise gets rejected or fails
throw e; <--------------- THROW error here so can catch it in catch block below
});
}catch(e){
console.log('error:'+e);
}
上面的解决方案是/ Stackoverflow上的许多答案。所以我没有任何问题,但我将回答下面我自己的问题,向您展示处理此异常(NoSuchElementError: No element found using locator: By.cssSelector("someCssLocator")
)的正确方法,而不使用try / catch块显式包装您的代码。
答案 0 :(得分:1)
我最近遇到了这个问题并注意到你不需要try / catch块。在Protractor中,您可以实现如下的try / catch:
try { <---------------------------- Traditional TRY/CATCH method
loadWebApp();
login();
openUserPreferences();
changePassword();
} catch (err) {
console.error(
"An error was thrown! " + err);
}
loadWebApp().
then(login).
then(openUserPreferences).
then(changePassword).
then(null, function(err) { <----------------- PROTRACTOR equivalent of try/catch
console.error(
"An error was thrown! " + err);
});
以下是我从中获取此信息的来源:https://code.google.com/p/selenium/wiki/WebDriverJs#Promises
在Value Propagation and Chaining
下
再次,您不需要显式添加try / catch。
简而言之,此方法有效的原因是a promise can either be RESOLVED or REJECTED and in case of a rejected or failed promise, this line [ then(null, function(err) { ... } ] will act as the CATCH block.
还要注意then(null,function(err))(不接受任何回调(而不是NULL)但只是一个errBack;所以基本上,这就是说我们不关心promise是否得到解决,我们只关心它是否失败,因此回调的NULL和errBack的函数(错误)。 无需在try / catch中包装它,然后按照Stackoverflow上的许多答案的建议抛出错误。
希望这可以帮助那些像我一样在Protractor中挣扎的人。