0

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

1 回答 1

0

您可以使用“amdefine”库(https://github.com/jrburke/amdefine)来完成。

包含"amdefine": ">=0.1.0"在您的 devDependencies 中并添加require('amdefine/intercept');onPrepare量角器配置中的功能。它将自动插入以下代码段

if (typeof define !== 'function') { var define = require('amdefine')(module) }

在 Node 加载的每个 .js 文件中。之后该节点将能够加载 requirejs 依赖项。

define或者,您可以在具有函数调用的文件中手动包含上述代码段。

于 2017-06-20T12:43:04.137 回答