#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
, которая не была выполнена. Sothis.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!