在Protractor PageObject实现后,函数停止工作

时间:2015-02-25 05:38:44

标签: javascript angularjs jasmine protractor

我在执行多项测试时遇到了问题(我在这里有两项测试)。似乎函数deleteOneTask()停止工作,我的测试开始相互失败。在我开始使用PageObject之前,一切都还可以。

Stacktrace:
     TypeError: Cannot read property 'click' of undefined
    at c:\Users\Денис\WebstormProjects\ProtractorTest\pages\angular.page.js:29:30

它指的是这一行:this.deleteButton.click();

这是我的 spec.js

'use strict';

var todoAppPage = require('../pages/angular.page');

describe('angularjs todo list', function () {

    var page;

    beforeEach(function () {
        page = new todoAppPage();
        page.get();
    });

    it('should add a todo task', function () {
        page.addNewTask('my first task');

        expect(page.todoList.count()).toEqual(1);
        expect(page.todoList.get(0).getText()).toEqual('my first task');
        page.deleteOneTask(); //here it won't work
    });

    it('should show correct number of undone tasks', function () {
        page.addNewTask('my first task');

        expect((page.counter).getText()).toEqual('1'); 
        page.deleteOneTask(); //here it won't work
    });

    it('should show correct number of undone tasks2', function () {
        var deleteButton = element.all(by.className('destroy')).get(0);
        var viewArea = element(by.model('todo.completed'));

        page.addNewTask('my first task');
        expect((page.counter).getText()).toEqual('1'); 

        element(by.id('footer')).element(by.linkText('All')).click();
        browser.driver.actions().mouseMove(viewArea).perform().then(function () { //hover and delete single task
        deleteButton.click();
    });; //here it will work
  });
});

这是页面对象文件

'use strict';

var todoAppPage = function() {

    this.newTodo = element(by.model('newTodo'));
    this.todoList = element.all(by.repeater('todo in todos'));
    this.viewArea = element(by.model('todo.completed'));        
    this.deleteButton = element.all(by.className('destroy')).get(0);
    this.categoryAll = element(by.id('footer')).element(by.linkText('All'));
    this.counter = element(by.id('todo-count')).element(by.className('ng-binding'));

    this.get = function() {
        browser.get('#/');
    };

    this.addNewTask = function (taskName) {
        this.newTodo.sendKeys(taskName);
        this.newTodo.sendKeys(protractor.Key.ENTER);
    };

    this.deleteOneTask = function () {
        this.categoryAll.click(); //go to 'All' category
        browser.driver.actions().mouseMove(this.viewArea).perform().then(function () { //hover and delete single task
        this.deleteButton.click();
    });
  };
};

module.exports = todoAppPage;

1 个答案:

答案 0 :(得分:0)

正如评论中所述,使用that = this可以解决您的问题。例如。

this.deleteOneTask = function () {
  var that = this;
  this.categoryAll.click(); //go to 'All' category
  browser.driver.actions().mouseMove(this.viewArea).perform().then(function () { //hover and delete single task
  that.deleteButton.click();
});

这是我见过的最好的解决方案,但我也很乐意看到更好的解决方案。