量角器-在localhost上运行良好,但远程抛出超时-在指定的超时时间内未调用异步回调

时间:2019-01-15 17:56:38

标签: javascript angular jasmine protractor e2e-testing

当我执行protractor protractor.conf.js --baseUrl=http://localhost:4200/时,它工作得很好-填充数据,验证元素等。

当我尝试通过远程URL protractor protractor.conf.js --baseUrl=http://the-same-website.com/测试完全相同的网站时,它会在浏览器中打开,登录并且所有必需的部分都像在localhost中一样被加载,但是Protractor / Jasmine不会填充/单击/验证任何内容,并且我在指定的时间后超时:

  - Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
      at ontimeout (timers.js:436:11)
      at tryOnTimeout (timers.js:300:5)
      at listOnTimeout (timers.js:263:5)
      at Timer.processTimers (timers.js:223:10)
  - Failed: script timeout: result was not received in 30 seconds
    (Session info: chrome=71.0.3578.98)

还有其他线程在堆栈溢出上也会有类似的问题-尝试过browser.ignoreSynchronization = trueProtractor.waitForAngular(false),但是页面无法正确加载,并且由于找不到元素而导致测试失败。

更新1

下面的测试在localhost上运行良好-根据h1输出成功或失败,但是在远程URL上,尽管加载了Web,它仍然不检查任何内容:

import { browser, by, element } from 'protractor';

describe('example-test', () => {

  const PATH_TO_TEST = 'specific-path/to/test';

  beforeEach(() => {
    browser.get(PATH_TO_TEST);
  });

  it('should exist header', () => {
    expect(element(by.css('h1')).getText()).toEqual('test');
  });
});

如果添加日志记录,则会看到输出,但未执行expect

import { browser, by, element } from 'protractor';

describe('example-test', () => {

  const PATH_TO_TEST = 'specific-path/to/test';

  beforeEach(() => {
    browser.get(PATH_TO_TEST);
    console.log('beforeEach');
  });

  it('should exist header', () => {
    expect(element(by.css('h1')).getText()).toEqual('test');
    console.log('test end');
  });
});

量角器配置:

const { SpecReporter } = require('jasmine-spec-reporter');

exports.config = {
  allScriptsTimeout: 30000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'chrome'
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  onPrepare() {
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  }
}

更新2

如果我添加了browser.sleepbrowser.ignoreSynchronization,则测试开始起作用,但是对于每次看起来不太好的同步,我都需要添加browser.sleep

beforeEach(() => {
  browser.get('path/to/test');
  browser.sleep(3000);
  browser.ignoreSynchronization = true;
});

似乎量角器无法识别页面为完全加载页面还是Angular网站。

尽管页面已正确加载,为什么量角器仍无法验证内容?

1 个答案:

答案 0 :(得分:0)

已更新:完成了更改后的原始建议答案。

此问题可能是由于您的登录页面的性质所致。如果您的登录是非角度的,那么您必须指示量角器不要等待角度变为可测试(默认情况下将是可测试的)。为此,您可以使用 browser.waitForAngularEnabled(false)命令,此命令是推荐的新方法,与以前的 browser.ignoreSynchronization = true 相反。

登录到应用程序后,可以将 browser.waitForAngularEnabled 设置为true,并且该规范中的其余测试应正常运行。

describe('Main', function {
  beforeAll(function () {
      browser.waitForAngularEnabled(false);
      Site.login();
      //after you have successfully logged into you site you can 
      browser.waitForAngularEnabled(true);
  });

  it('should show the main page', function () {
     //Your code
  });
});