Элемент транспортира (..), возвращающий неопределенное значение из отдельного файла

#javascript #angularjs #protractor

#javascript #angularjs #транспортир

Вопрос:

Я пишу тест транспортира и в моем 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() в файл подкачки, но снова получил undefined или получил сообщение, что я не могу вызвать ‘then’ для undefined .

На мой взгляд, это должно делать то же самое, что и в первом примере, но я далек от эксперта в Angular или JavaScript.

test.page.js выглядит как:

 "use strict";

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

    return TestPage;
});
  

Надеюсь, кто-нибудь сможет пролить свет на то, почему это происходит, и что я должен сделать вместо этого, чтобы иметь возможность поместить селектор CSS в файл подкачки для повторного использования.

Спасибо

Комментарии:

1. Вы определили его в разделе module.exports ? Можете ли вы добавить содержимое test.page.js ?

2. Добавили содержимое test.page.js . Я считаю, что это способ определить его в module.exports.

3. Что такое HomePage ? Вы должны return TestPage . Также вам нужно сделать var testPage = new TestPage();

4. Я следую подходу группировки локаторов под PageElements' объектом, и все экспортируемые методы могут быть заменены. Предоставили ответ ниже

5. Изменен на TestPage. И верхняя часть step.js файл инициализирует новую тестовую страницу;

Ответ №1:

Ваш код 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. Первое предложение (возврат класса) сработало, но я не понимаю, почему это отличается от того, что у меня было раньше с module.exports = ... и function TestPage() { ... }; return TestPage; там.

2. В вашем коде new TestPage; executing выполняет анонимную функцию, назначенную module.exports . Он возвращает конструктор / функцию TestPage , которая не была выполнена. So this.field не существует.

Ответ №2:

Способ определения повторно используемых локаторов элементов выглядит иначе. Я следую чему-то вроде приведенного ниже

Шаг 1: Определите файл .js, который должен содержать объекты локатора и повторно используемые методы

 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');
});
  

Подробнее здесь

Комментарии:

1. ваш loginPage объект, вопрос задается при экспорте LoginPage как функции! Ответ @Florent B — это правильный способ создания экземпляра и использования экспортированных функций PageObject!