我随机收到错误消息:
失败:等待量角器与页面同步时出错: “ 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 } }));
},
};
您有什么想法吗?
答案 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,则页面设置可能会出现问题。在下面的链接中检查主要问题的更新,看看它们是否可以应用于您的项目。
答案 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);