我在量角器中有一段代码要做等待:
public waitForElement() {
return browser.wait(
ExpectedConditions.visibilityOf(element(by.id('#someEl'))),
10000,
'Unable to find the element'
);
}
我的问题是,如果它超时,我似乎无法捕获此异常。我尝试添加一个不起作用的catch()子句,例如:
this.waitForElement()
.then(() => { /* do something */ })
.catch(() => { /* handle the error -- this code never happens if there is a timeout!!! */ });
我尝试将代码放在try-catch块中,但这并没有帮助:
try { this.waitForElement().then(() => { }); }
catch (ex) { /* this exception is never caught, the test just fails!! */ }
我很难过:如何在没有测试失败的情况下捕获等待超时并继续测试?
答案 0 :(得分:3)
我为此创建了一个简单的测试用例,见下文
this

这给了我以下输出
// conf
exports.config = {
capabilities: {
'browserName': 'chrome'
},
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
// Spec patterns are relative to the current working directory when
// protractor is called.
specs: ['example_spec.js'],
// Options to be passed to Jasmine.
jasmineNodeOpts: {
defaultTimeoutInterval: 30000
},
allScriptsTimeout: 30000,
};
// Spec
describe('Wait for element', () => {
it('element will be found', () => {
browser.get('http://www.angularjs.org');
waitForElement(element(by.css('.hero')))
.then(() => {
console.log('element is found');
})
.catch((error) => {
console.log('error = ', error);
});
});
it('element will NOT be found', () => {
browser.get('http://www.angularjs.org');
waitForElement(element(by.css('.heroic')))
.then(() => {
console.log('element is found');
})
.catch((error) => {
console.log('element is not found, do something different');
});
});
});
function waitForElement(element) {
return browser.wait(
ExpectedConditions.visibilityOf(element),
3000,
'Unable to find the element'
);
}
所以它看起来像是有效的
你也可以用你的方法做这样的事情
~/wswebcreation/contributions/protractor npm run test.example
> protractor@5.1.2 test.example /Users/wswebcreation/contributions/protractor
> node ./bin/protractor example/conf.js
[10:32:17] I/launcher - Running 1 instances of WebDriver
[10:32:17] I/hosted - Using the selenium server at http://localhost:4444/wd/hub/
Started
element is found .
element is not found, do something different.
2 specs, 0 failures
Finished in 6.917 seconds
[10:32:24] I/launcher - 0 instance(s) of WebDriver still running
[10:32:24] I/launcher - chrome #01 passed

这使得更多" flexibel",你可以捕获方法中的错误,如果需要让它在那里失败,否则传递一个你可以用来进一步的布尔值。
答案 1 :(得分:1)
取消选择@wswebcreation有用的答案中特别重要的部分:为了使这项工作有效,我发现您必须指定一个明确的超时时间。
以下可行:
return browser.wait(ExpectedConditions.visibilityOf(...), 5000)
.catch(() => { throw new Error('my error'); });
但这不是 :
return browser.wait(ExpectedConditions.visibilityOf(...))
.catch(() => { throw new Error('my error'); });
给予:
Error: function timed out after 11000 milliseconds
at Timeout._onTimeout (C:\project\node_modules\cucumber\lib\user_code_runner.js:91:22)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:290:5)
其中11000只是我们配置的默认量角器超时。
还要注意,尽管browser.wait
的{{3}}表示仅当您想暂停所有Javascript执行而不是WebDriver时才需要Promise表单:
此功能阻止了WebDriver的控制流,而不是JavaScript 运行。它只会延迟将来的webdriver命令 已执行(例如,这将导致量角器在发送未来商品之前等待 命令到selenium服务器),并且仅在webdriver控制时 流已启用。
此函数返回一个promise,可以在需要时使用 阻止JavaScript执行,而不仅仅是控制流。
...显然, 也不可能在try-catch中捕获无超时,无承诺的browser.wait
的结果,因为条件在{ {1}}。
当与量角器-黄瓜框架4.2.0一起使用时,以上情况显然适用于量角器5.3.2。