Angular 7,量角器,随机错误“ angularJS可测性和角度可测性均未定义”

时间:2019-01-17 10:06:14

标签: angular protractor

随机收到错误消息:

  

失败:等待量角器与页面同步时出错:   “ angularJS可测试性和角度可测试性均未定义。   这可能是因为这是一个非角度页面,或者是因为   您的测试涉及客户端导航,这可能会干扰   量角器的引导程序。有关详情,请参见https://github.com/angular/protractor/issues/2643

运行

$ ng e2e --webdriverUpdate=false --devServerTarget=

在我的spec.ts文件中,我进行了以下2个测试,第一个始终有效,第二个随机失败,并显示上述错误。

  beforeEach(async () => {
    myPage = new MyPage();
    browser.get('my-page');
  });

  it('should work', async () => {
    console.log('should work');
    expect(true).toBeTruthy();
  });

  it('should display the title', async () => {
    const title = await $('my-title-selector').getText();
    expect(title).toEqual('My-Title');
  });

这是MyPage PageObject:

import { $, $$ } from 'protractor';

export class MyPage {
  title = $('my-title-selector');
}

这是我的protractor.conf.js

  // Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts

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

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

您有什么想法吗?

3 个答案:

答案 0 :(得分:0)

如果您正在使用async / await(就是这样!),则需要等待所有诺言。因此,我的猜测是您的beforeEach承诺无法加载页面,并且您正在寻找可能没有由量角器正确引导的Web元素。

beforeEach(async () => {
  myPage = new MyPage();
  await browser.get('my-page');   // browser.get returns a webdriver.promise.Promise
});

it('should work', async () => {
  console.log('should work');
  expect(true).toBeTruthy();
});

it('should display the title', async () => {
  const title = await $('my-title-selector').getText();  // <-- this is right, getText returns a webdriver.promise.Promise<string>
  expect(title).toEqual('My-Title');
});

如果您使用的是Protractor 5.4,它仍在使用selenium-webdriver控制流/ Promise库,而不是本机Promises。因此,webdriver.promise.Promise来自selenium-webdriver类型,promise名称空间,Promise对象。在量角器6(超出beta版本)中,这将切换为本地Promises。

希望有帮助。

答案 1 :(得分:0)

您的第一个测试将始终通过,因为它没有与应用程序交互,因此不检查角度站点的可测试性。但是,您的第二项测试确实尝试与应用程序进行交互,但由于该页面在该阶段尚未变为可测试状态,因此似乎正在超时。这也是为什么在waitForAngularEnabled(false)时测试通过的原因,因为它们不再检查可测试性。

如果角度代码以特定方式使用$ interval或$ timeouts,则页面设置可能会出现问题。在下面的链接中检查主要问题的更新,看看它们是否可以应用于您的项目。

How to debug timed out waiting for asynchronous Angular tasks? Failure to find elements on angular page occurring

答案 2 :(得分:0)

您可能会遇到以下概述的Testabilities API中的竞赛条件错误:https://github.com/angular/angular/issues/15743

TL / DR是-如果您注入了异步的APP_INITIALIZER-例如加载配置文件-量角器有可能在角度报告存在之前“检查角度”。解决方法不是等待角度,而是等待完整角度应用程序呈现的DOM元素的存在。

下面是一些示例代码:

await browser.wait(ExpectedConditions.urlContains(this.baseUrl));
await browser.waitForAngularEnabled(false);
await browser.wait(ExpectedConditions.visibilityOf($('.main-app-content'), 10000);
await browser.waitForAngularEnabled(true);