重要信息:我使用的是编译为 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
};