重要信息:我使用的是编译为 ES5 的 TypeScript。
我的最终目标是拥有模块化规范,可以即时加载帮助程序并简化 PageObject 模式的使用。类似于(我将在问题末尾发布我的 protractor.conf.js 文件):
/// <reference path="./references.ts"/>
import HomePage = require('../ui/HomePage');
describe('Application should run without errors', function () {
var homePage = new HomePage();
describe('Home Page Functionality', function () {
beforeAll(function() {
browser.get(homePage.getUrl());
});
it('should be possible to navigate to the home page', function () {
expect(browser.getTitle()).toEqual(homePage.getTitle());
expect(browser.getCurrentUrl()).toEqual(homePage.getUrl());
});
});
});
现在Error: ReferenceError: define is not defined当我运行它时我得到了。如果我删除 HomePage 导入和使用该对象的任何内容,则测试通过,因此很明显加载 AMD 模块是让 Protractor 遇到困难的原因,但我不知道如何告诉它在它之前加载 RequireJS开始测试。
我尝试过的事情
一些答案(我认为这里有一个)提到使用 r.js 来让 Node 加载 RequireJS 模块。但是,这并没有那么好用,因为在我的模块中添加 require 方法会导致 TypeScript 编译器将其放入 generatedefine()中,因此无法达到目的。
我也找不到如何告诉 Protractor 在启动之前加载脚本,所以我考虑添加 RequireJS 作为规范,认为它会加载我的测试所需的方法,主要是define()andrequire()函数,但这也不起作用.
我的protractor.conf.js文件:
var HtmlScreenshotReporter = require('protractor-html-screenshot-reporter');
function onPrepareFunction() {
browser.driver.manage().window().maximize();
browser.ignoreSynchronization = true;
var TestsReporter = require('jasmine2-reporter').Jasmine2Reporter;
jasmine.getEnv().addReporter(new TestsReporter());
/**
* We are using a fork here, because the original would not work with jasmine2.
* We need to keep an eye on it.
*/
jasmine.getEnv().addReporter(new HtmlScreenshotReporter({baseDirectory: 'reports/acceptance-tests-results'}));
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
filePrefix: 'acceptance-tests-results',
savePath: 'reports'
}));
}
exports.onPrepareFunction = onPrepareFunction;
exports.config = {
framework: "jasmine2",
specs: [
'js/tests/acceptance/*.spec.js'
],
baseUrl: 'http://localhost:9000',
multiCapabilities: [
{
browserName: 'phantomjs',
'phantomjs.binary.path': require('phantomjs').path,
seleniumAddress: 'http://localhost:4444/wd/hub'
}
],
jasmineNodeOpts: {
'print': function() {}
},
onPrepare: onPrepareFunction
};