量角器:10000毫秒后等待规格完成超时

时间:2014-03-31 11:51:24

标签: angularjs selenium protractor saucelabs browserstack

我有几个量角器测试,有时我会收到错误说:

Message:
     timeout: timed out after 10000 msec waiting for spec to complete
   Stacktrace:
     undefined

它可能会在某些测试中随机发生。 我通常在BrowserStack上测试,它在3-5版本中显示错误一次。但最近我尝试了SauceLabs几乎每一个(每个!)但并非所有的测试都失败了。可能,SauceLabs只是显着变慢,所以我更经常地得到错误......

以下是问题:

  1. Protractor / Selenium有没有办法改变测试运行超时?它也需要在BrowserStack / Saucelabs上进行更改。
  2. 为什么我经常收到错误?我的测试有什么问题吗?大多数似乎并不复杂或长期运行。再次,在本地机器上,它几乎总是很好。
  3. 以下是示例:

       it('should check that login gives error on empty or incorrect email', function () {
          p.get('/#/login');
          p.findElement(protractor.By.css('button[type="submit"]')).click();
          expect(p.findElement(protractor.By.css('.alert-danger')).getText()).toEqual('E-mailadres is niet geldig');
          p.findElement(protractor.By.model('user.email')).sendKeys('test-1xtc.vc');
          p.findElement(protractor.By.css('button[type="submit"]')).click();
          expect(p.findElement(protractor.By.css('.alert-danger')).getText()).toEqual('E-mailadres is niet geldig');
          p.findElement(protractor.By.model('user.email')).clear();
        });
    

    该应用正在使用 AngularJS,硒2.20,量角器0.20.1

5 个答案:

答案 0 :(得分:3)

  

在Protractor / Selenium中是否有办法改变测试运行超时?

是:)您可以通过量角器配置中的allScriptsTimeout(来自Protractor FAQ

来完成

您还可以在defaultTimeoutInterval选项中设置jasmineNodeOpts(来自Protractor referenceConf.js

  

为什么我经常收到错误?我的测试有什么问题吗?大多数似乎并不复杂或长期运行。再次,在本地机器上,它几乎总是很好。

很难说没有看到你的测试。你提供的例子对我来说很好。

答案 1 :(得分:2)

您的项目是一个angularjs项目吗?你在某处使用任何$ interval或$ timeout服务?如果是这样,请尝试使用$ interval而不是$ timeout并尝试调整可选的'计数'参数为1,例如(https://docs.angularjs.org/api/ng/service/ $ interval#usage)。 我最近遇到了类似的问题,我就这样解决了。

答案 2 :(得分:1)

我使用config文件的不同属性解决了这个问题,我在上面的答案中没有看到。

getPageTimeout : 100000 //in millis, i.e., 100 secs

答案 3 :(得分:0)

我相信酱油的默认时间是90秒。它可以使用idleTimeout变量通过conf.js文件进行更改,该变量的值为秒。例子

idleTimeout = 90; // equals 90 seconds
  exports.config = {
  //Includes test sub-sub-foldersbefore any tests in sub folders 
  specs: ['tests/*/*/*.js', 'tests/*/*.js', ],


  // use jasmine 2
  framework: 'jasmine2',
  capabilities :  {
                browserName: "chrome",
                // this takes seconds so 120 would be 120 seconds.
                idleTimeout = 120;
            },
},

现在,如果您需要更改特定规格文件的值,您可以在spec文件中使用它,当然如果您的saucelabs idleTimeout低于此值,那么它将首先在saucelabs上超时。或者如果您的saucelabs值更高但DEFAULT_TIMEOUT_INTERVAL更低,那么它将超时。

// this takes in miliseconds so 1000 = 1 second
jasmine.DEFAULT_TIMEOUT_INTERVAL = 120000;

答案 4 :(得分:0)

Jasmine对每个规范都有超时,即jasmine框架中的每个it。因此,如果任何规范(it)超过jasmine规范的默认超时,那么它将失败该规范。

<强>解决方案: 要覆盖单个规范的jasmine规范超时,请将第三个参数传递给它: it(description, testFn, timeout_in_millis)

it('description of test case', function() {
   /*your test 
               steps
                    here*/
},120000);//120 seconds timeout for this spec

有关timeouts is here

的更多信息