gpt4 book ai didi

javascript - Protractor + Angular + requireJs

转载 作者:行者123 更新时间:2023-11-29 19:22:51 24 4
gpt4 key购买 nike

我想用 protracor 测试我的应用程序,但测试失败并出现以下错误:

Failed: Error while waiting for Protractor to sync with the page: "root element (html) has no injector. this may mean it is not inside ng-app."

似乎 angular 没有完全加载,并且 browser.waitForAngular(); 不工作。在 RequireJs 加载依赖项后,如何设置 Protractor 以继续测试?

同时添加这个:

onPrepare:function(){
browser.manage().timeouts().pageLoadTimeout(40000);
browser.manage().timeouts().implicitlyWait(25000);
}

ocnfig 文件(如前所述 here )导致此错误:

Failed: Error while waiting for Protractor to sync with the page: "angular could not be found on the window"

最佳答案

您将需要一种手动方式来了解 Angular 已从您的规范中启动。这是我如何使用 Angular、RequireJS 和 Protractor 进行设置的基本流程。这适用于 jasmine2 和 old jasmine。

我们想在 Angular 引导的元素中添加一个 ng-app 类。例如:

index.html

<html lang="en" class="ng-app">

但我们不想将它放在 HTML 文件中,而是希望使用手动引导 Angular 应用程序的同一 RequireJS 模块添加该类。例如:

ng-bootstrap.js

require(['angular'], function (angular, otherdeps) {

// Start the Angular App
angular.bootstrap(document, ['MyApp']);

// Set the ng-app class for Angular Protractor tests
var root = document.documentElement;

angular.element(root).addClass('ng-app');
});

检查您的页面是否在引导后添加了此类。然后设置您的 protractor.conf 导出以运行 onprepare 测试。每次启动 Protractor 时都会执行此规范,我们将使用它来检查您在 ng-bootstrap.js 模块中添加的类。

Protractor 配置文件

exports.config = {

// Every time protractor is launched:
onPrepare: 'onprepare.e2e.js',

};

在您的onprepare.e2e.js 规范文件中,您可以触发主页的加载。然后让 Protractor 等待,直到在根元素上找到类 .ng-app,即:Angular 已经启动并准备好运行 Protractor 测试。

onprepare.e2e.js

describe("On prepare", function () {

// Replace with your own URL
var baseUrl = 'http://127.0.0.1:8001/#/';

// Begin fetching the page
browser.driver.get(baseUrl);

// Wait until `.ng-app` is found on the root elem
browser.driver.wait(function () {
return browser.driver.getCurrentUrl().then(function (url) {
return browser.driver.isElementPresent(by.className('ng-app')).then(function () {
return true;
});
});
});

});

请记住,如果您同时运行大量规范文件,您的页面可能会在新测试开始时重新加载。如果您的 Angular 路由器使用的是 reload: true 参数,您的页面也可能正在重新加载。

这意味着应用程序必须重新启动;在使用 Protractor 之前,您将需要再次等待 Bootstrap 类。

为此添加一个帮助程序并将其包含在您的 protractor-conf.js 中。

helpers.js

module.exports = {

get: function (url) {
browser.driver.get(url);

browser.driver.wait(function () {
return browser.driver.getCurrentUrl().then(function (url) {
return browser.driver.isElementPresent(by.className('ng-app')).then(function () {
return true;
});
});
});
},

};

Protractor 配置文件

helpers = require('helpers.js');

exports.config = {
onPrepare: 'onprepare.e2e.js',

specs: [
'my-spec.js'
]
};

现在您的助手对您的规范是全局可见的,您可以使用新的 helper.get(url) 方法代替 browser.driver.get(url)。示例:

我的规范.js

describe("Users", function() {

it('should login', function () {

// Wait for Angular and RequireJS to finish
helpers.get('http://127.0.0.1:8001/#/login');

// ...tests here...

});

});

关于javascript - Protractor + Angular + requireJs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32369329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com