首页 > 解决方案 > Angular 7,量角器,随机错误“angularJS 可测试性和角度可测试性都未定义”

问题描述

随机收到错误:

失败:等待 Protractor 与页面同步时出错:“angularJS 可测试性和 Angular 可测试性都未定义。这可能是因为这是一个非 Angular 页面,也可能是因为您的测试涉及客户端导航,这可能会干扰 Protractor 的引导。有关详细信息,请参阅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 页面对象:

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 } }));
  },
};

你有什么想法吗?

标签: angularprotractor

解决方案


如果您正在使用 async / await (您就是这样!),您将需要等待所有承诺。所以我的猜测是你beforeEach没有完成加载页面的承诺,你正在寻找一个可能没有被 Protractor 正确引导的 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 对象。在 Protractor 6 中(当它超出测试版时),这将切换到原生 Promise。

希望有帮助。


推荐阅读