量角器元素(..)从单独的文件返回undefined

时间:2016-10-12 14:30:14

标签: javascript angularjs protractor

我正在编写一个Protractor测试,在我的test.step.js文件中我有

element(by.css('...')).getText().then(function (text) {
    expect(text).to.equal('expectedText');
});

这可以按预期工作并通过。

相反,我创建了一个test.page.js文件并放在那里this.field = element(by.css('...'));然后在我的步骤文件中

"use strict"

module.exports = function exampleTest() {
    var TestPage = require("...");
    var testPage = new TestPage;
    ...
    test.Then(..., function (next) {
       testPage.field.getText().then(function (text) {
          expect(text).to.equal('expectedText');
       });
    });
}

然后字段未定义。我也尝试在页面文件中添加getText(),但是再次得到未定义或被告知我无法调用'然后'在未定义。

在我看来,这应该与第一个例子完全相同,但我远不是Angular或JavaScript的专家。

test.page.js看起来像:

"use strict";

module.exports = (function () {
    function TestPage() {
        this.field = element(by.css('...'));
    }

    return TestPage;
});

希望有人可以了解为什么会发生这种情况以及我应该做些什么来代替将CSS选择器放在页面文件中以便重复使用。

由于

2 个答案:

答案 0 :(得分:3)

您的代码new TestPage;会返回构造函数TestPage,但它永远不会被调用。

你可以退回课程:

function TestPage() {
    this.field = element(by.css('...'));
}

module.exports = TestPage;
var TestPage = require("...");
var testPage = new TestPage;
testPage.field.getText().then(...

或者类的实例:

function TestPage() {
    this.field = element(by.css('...'));
}

module.exports = new TestPage();
var testPage = require("...");
testPage.field.getText().then(...

答案 1 :(得分:1)

您定义可重用元素定位器的方式看起来不同。我正在关注下面的一些事情

步骤1:定义一个.js文件,该文件应包含Locator对象和可重用的方法

var Login = {

    PageElements: {
        emailInput: element(by.css('#email')),
        passwordInput: element(by.css('#password')),
        loginForm: element(by.css('#form')),
    },
    doLogin: function doLogin() {
        this.PageElements.emailInput.sendKeys('blahblah@email.com');
        this.PageElements.passwordInput.sendKeys('blahblah');
        this.PageElements.loginForm.submit();
    },
};

module.exports = Login;

第2步:在测试类中调用这些页面对象。

var LoginPage = require('../pageobjects/LoginPage.js');
it('Scenario1_Login',function(){
 LoginPage.PageElements.emailInput.sendKeys('blahblah');
});

更多details here