就像Selenium webdriver为Java提供各种异常处理一样,有没有什么方法可以使用Protractor实现它。
如果我们想要处理未找到元素的异常,那么使用Protractor的最佳方法是什么?
答案 0 :(得分:14)
回答这个问题is now in Protractor's FAQ
WebDriver在命令无法完成时抛出错误 - 例如无法点击被其他元素遮挡的元素。如果您需要重试这些操作,请尝试使用webdriverjs-retry。如果您只想捕获错误,请按照这样做
适应您的问题:
elm.isPresent().then(function(present) {
/* no webdriver js errors here */}
if (present) {
/* element exists */
} else {
/* element doesn't exist */
}
, function(err) {
/* error handling here, i.e. element doesn't if got ElementNotFound
but, eventually and less likely, other issues will fall in here too like
NoSuchWindowsError or ElementStaleError etc...
*/
});
答案 1 :(得分:0)
感谢@Leo Gallucci适应OP的问题:
我今天遇到了这个问题,希望能找到一个看起来很干净的解决方案:
/* Function to check for three possible DOM elements; return the element which exists, and get the text contents. */
this.getMySelector = function(){
if (element(by.css('.mySelector')).isPresent()){
return element(by.css('.mySelector'));
}
else if (element(by.css('.mySelector2')).isPresent()){
return element(by.css('.mySelector2'));
}
else{
return element(by.css('.mySelector3'));
}
}

然而,它始终击中第一个if()
并且从不检查其他条件。结果我需要为我的场景链接承诺:
this.getMySelector = function(){
element(by.css('.mySelector')).isPresent().then(function (pres) {
if (pres){
defer.fulfill( by.css('.mySelector')).getText() );
}
else{
element(by.css('.mySelector2')).isPresent().then(function (pres) {
if (pres){
defer.fulfill(..);
}
}
}
}
}
// From calling test-spec.js file
getMySelector.then(function(text)){
console.log('Now I got the text ==> ' + text);
}

答案 2 :(得分:-1)
尝试,Catch在Protractor中具有以下语法。下面的代码将首先通过Id' IdTextBoxCode'找到一个元素。然后代码输入代码' codeTextBox.sendKeys(code);'是在TRY区块。如果代码抛出异常(在这种情况下,如果找不到具有Id' IdTextBoxCode'的元素),那么它将转到catch块和错误处理函数。
browser.driver.findElement(by.id(browser.params.loginPage.IdTextBoxCode)).then(function(codeTextBox)
{
try
{
console.log("Entering Code: "+code);
codeTextBox.sendKeys(code);
}
catch(err) {
console.log('In catch block');
}
}, function(err) {
console.info('Code Text Box not displayed on page. Proceeding with default Code');
});