量角器等待超时捕获并继续

时间:2017-07-27 15:58:51

标签: protractor

我在量角器中有一段代码要做等待:

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!! */ }

我很难过:如何在没有测试失败的情况下捕获等待超时并继续测试?

2 个答案:

答案 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。