Объекты страницы транспортира - ошибка типа: объект #‹Object› не имеет метода 'methodName'

Я пытаюсь написать простой тест с использованием шаблона объектов страницы - на основе 'документы/объекты-страницы'.

Я создал файл, описывающий объект страницы и другие, используя этот объект страницы для тестирования страницы.

//page object
var LoginPage = function() {

this.userInput = browser.driver.findElement(by.id('username'));
this.pwdInput  = browser.driver.findElement(by.id('password'));
this.btnEnter  = browser.driver.findElement(by.id('btnLogin'));

this.get = function(){
    browser.get('http://example.com');
};

this.setUser = function (user){
    this.userInput.sendKeys(user);  
};

this.setPasswd = function (password) {
    this.pwdInput.sendKeys(password);
};

this.clickBtnEnter = function (){
    btnEnter.click();
};};

Файл спецификации:

var loginPage = require('./LoginPage.js');
describe('myApp', function() {
  it('should save contract config', function (){        
    loginPage.get();
    loginPage.setUser('userid');
    loginPage.setPasswd('passwd');
    loginPage.clickBtnEnter();
  });
});

Когда я запускаю этот тест, появляется следующая ошибка: TypeError: Object # has no method 'get' - в этой строке: loginPage.get();.

Когда я искал эту проблему, я нашел различные подходы к использованию объектов страницы в Protractor, такие как Astrolable. Теперь я не уверен в правильном использовании объектов страницы.

Есть ли у вас какие-либо идеи о том, как я могу исправить этот тест?

Спасибо вам, ребята.


person flaviomeira10    schedule 27.08.2014    source источник


Ответы (2)


Попробуй это:

Убедитесь, что в вашем файле LoginPage.js есть следующее

module.exports = LoginPage;

Добавьте отсутствующее ключевое слово new

var LoginPage = require('./LoginPage.js');
var loginPage = new LoginPage();
person Leo Gallucci    schedule 27.08.2014
comment
Я отредактировал файлы, как было предложено, но теперь у меня другая ошибка: C:\Users\flavio.meira\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\atoms\error.js: 109 шаблон var = новая ошибка (это.сообщение); ^ NoSuchElementError: такого элемента нет (информация о сеансе: chrome=36.0.1985.143) (информация о драйвере: chromedriver=2.10.267521, платформа=Windows NT 6.3 x86_64) (ВНИМАНИЕ: сервер не предоставил никакой информации о трассировке стека). PS: это не полный вывод ошибки - person flaviomeira10; 27.08.2014
comment
Это говорит о том, что элемент не найден на тестовой странице. Сейчас вы задаете другой вопрос, вы должны открыть новый вопрос и закрыть этот вопрос как ответ, так как ошибка отсутствующего имени метода была исправлена. Не забывайте всегда упоминать, что вы используете Windows, иногда возникают определенные проблемы;) - person Leo Gallucci; 27.08.2014
comment
Привет Эльгалу. Элемент не найден, так как страница не загружена. Метод "получить" не сработал. Из-за этого ни один элемент не найден. Похоже, отсутствует драйвер браузера. Спс за ответ. PS: браузер Chrome показывает этот URL: data:, - person flaviomeira10; 28.08.2014
comment
Предложение Leo работает для меня без необходимости включать Astroable. - person Pablo Gómez; 12.11.2015

Попробовав приведенный выше синтаксис (безуспешно), я переписал объект страницы, используя Astrolable. Теперь это работает! Мой тест выглядит так:

//pageobject
'use strict';
var env = require('./environment.js')

var LoginPage = function () {
  browser.driver.get('http://example.com');
};

LoginPage.prototype = Object.create({}, {

userInput:         {    get: function()    { return browser.driver.findElement(by.id('username'));}},
pwdInput:          {    get: function() { return browser.driver.findElement(by.id('password'));}},
btnEnter:          {    get: function()    { return browser.driver.findElement(by.id('btnLogin'));}},

setUser:           {     value: function (loginName) {
    this.userInput.sendKeys(loginName);        
}},

setPasswd: { value: function (loginPass) {
    this.pwdInput.sendKeys(loginPass);
}},

clickBtnEnter:    {    get: function()    { return this.btnEnter.click();}}    
});

module.exports = LoginPage;

Спецфайл:

'use strict';
var loginPage = require('./LoginPage.js');

describe('myApp', function() {
    var poLogin = new loginPage();

    it('should save contract config', function (){        
        poLogin.setUser('userid');
        poLogin.setPasswd('passwd');
        poLogin.clickBtnEnter;
    });
});

Теперь он работает нормально. Спасибо за ответы.

person flaviomeira10    schedule 28.08.2014