量角器 - ScriptTimeoutError:异步脚本超时:在20秒内未收到结果

Quc*_*ucu 12 javascript automation jasmine protractor

我是Protractor的新手,我正在尝试运行我的脚本.

describe('Navigator homepage', function() {
it('should proceed to login', function() {
browser.get('url');
})
it('Clicks the proceed button',function() {
const proceedButton = element(by.id('auth-login-page-button'));

proceedButton.click();
});
});
Run Code Online (Sandbox Code Playgroud)

但每当我运行它时,浏览器打开并进入网站,然后等待20秒,我得到错误: ScriptTimeoutError: asynchronous script timeout: result was not received in 20 seconds.元素显然在那里,可以点击,但不适用于量角器.难道我做错了什么?配置文件如下所示:

// An example configuration file.
exports.config = {
  directConnect: true,

  // Capabilities to be passed to the webdriver instance.
  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: ['login_spec.js'],

  allScriptsTimeout: 20000,
  getPageTimeout: 15000,
  framework: 'jasmine',
  jasmineNodeOpts: {
    isVerbose: false,
    showColors: true,
    includeStackTrace: false,
    defaultTimeoutInterval: 40000
  }
  };
Run Code Online (Sandbox Code Playgroud)

Ern*_*gli 11

鉴于您添加的错误消息(请参阅注释),原因似乎是持续轮询$timeout,这使得承诺无限期无法解析,因此导致量角器的异步超时(请参阅此处的详细信息).

正确的解决方案是避免使用$timeout和使用$interval.这样,量角器可以继续掌控ControlFlow,管理您的异步任务.所以它是一种软件错误,而不是量角器错误.

你的错误信息:

Failed: Timed out waiting for asynchronous Angular tasks to finish after 20 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeo??uts.md#waiting-for-a??ngular While waiting for element with locator - Locator: By(css selector, md-raised md-primary md-button md-ink-ripple). *The following tasks were pending: - $timeout: function (){return _this.getVersion()}*

解决方法

不太好的解决方法是通过设置browser.waitForAngularEnabled(false);(在beforeEach中或直接在规范中)来关闭Protractor的waitForAngular部分.

然而,这也意味着,在测试规范本身内手动处理controlFlow.这需要使用很多,.then()并且ExpectedConditions失去了Protractor的一个主要优点.

调试可能性

请查看此处的说明,了解可能的原因和解决方法.特别是尝试browser.waitForAngularEnabled(false);排除角度量角器问题.

如果你找不到原因,那可能是一个时间问题(不太可能,但值得在那时进行检查).

您可以尝试添加日志消息以缩小执行的有效顺序:

describe('Navigator homepage', function() {
    it('should proceed to login', function() {
    browser.get('url').then(function(){
        console.log("Page is fully loaded");
        });
    });
    it('Clicks the proceed button',function() {
        console.log("Start 2nd Test");
        const proceedButton = element(by.id('auth-login-page-button'));
        proceedButton.click();
    });
});
Run Code Online (Sandbox Code Playgroud)

或者您将操作放在同一测试用例中,使用then()它们同步执行它们:

describe('Navigator homepage', function() {
    it('should proceed to login', function() {
    browser.get('url').then(function(){
        const proceedButton = element(by.id('auth-login-page-button'));
        proceedButton.click();
    });
});
Run Code Online (Sandbox Code Playgroud)

打开主页 onPrepare

作为一个不错的评论:如果你总是首先加载主页,只需将它放入conf.js的onPrepare部分,它将始终在测试开始前执行一次:

onPrepare: function () {
    browser.driver.manage().window().maximize();
    browser.get('url');
},
Run Code Online (Sandbox Code Playgroud)


Ray*_*Ray 5

我有一个类似的问题,我通过打开忽略同步解决了

browser.ignoreSynchronization = true
Run Code Online (Sandbox Code Playgroud)

  • 这为我解决了这个问题! (2认同)
  • 太棒了!经过三天的尝试,不同的解决方案可以奏效。在此处在conf.ts中共享我的onPrepare:onPrepare:()=> {让全局变量= require('protractor'); 让浏览器= globals.browser; browser.manage()。window()。maximize(); browser.manage()。timeouts()。implicitlyWait(10000); browser.ignoreSynchronization = true; } (2认同)