【问题标题】:Can't use page objects pattern with protractor不能将页面对象模式与量角器一起使用
【发布时间】:2014-11-25 20:12:21
【问题描述】:

我正在按照我发现的几个示例开始使用页面对象来组织我的测试。

例如:https://github.com/juliemr/ng-page-e2e/blob/master/test/angularsite_page.js http://codingsmackdown.tv/blog/2014/07/08/using-page-objects-in-angularjs-protractor/

这是我的页面对象文件:

var PageObjects = function() {

    var preenchePsafe = browser.driver.findElement(by.id('global-search'));
    var opcaoPsafe = browser.driver.findElement(by.css('#search > ul > li:nth-child(1) > a'));

    this.abrirUrl = function() {
        dvr.get('http://home.pp.psafe.com/');
    };

    this.pesquisarPsafe = function (pesquisa){

        this.preenchePsafe.sendKeys(pesquisa);
        this.opcaoPsafe.click();
    };

};
module.exports = PageObjects;

这是我的测试:

var pageObjects = require('./page.js');

describe('PSafe Home', function () {


    beforeEach(function () {
        var pageObjects = new page();
        isAngularSite(false);
        handlePromise = dvr.getAllWindowHandles();
    });

    it ('Pesquisar PSafe', function () {

        browser.get('http://home.psafe.com/');
        pageObjects.pesquisarPsafe('PSafe');

    })});

然后,当我执行时,我收到以下错误:

1) PSafe Home Pesquisar PSafe 消息: ReferenceError:页面未定义堆栈跟踪: ReferenceError:页面未定义 在 [对象对象]。 (C:\Users\QARJ\WebstormProjects\ProtractorPiloto\piloto.js:6:31) 在 c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\jasminewd\index.js:94:14 在 [对象对象].webdriver.promise.ControlFlow.runInNewFrame_ (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1654:20) 在 [对象对象].webdriver.promise.ControlFlow.runEventLoop_ (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\promise.js:1518:8) ==== 异步任务 ==== 异步测试函数:beforeEach() 在 [对象对象]。 (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\jasminewd\index.js:93:33) 在 [对象对象]。 (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\minijasminenode\lib\async-callback.js:45:37) 在 [object Object].jasmine.Block.execute (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:1174:17) 在 [object Object].jasmine.Queue.next_ (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:2209:31) 在 [object Object]._onTimeout (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:2199:18) 错误 在 [对象对象]。 (C:\Users\QARJ\WebstormProjects\ProtractorPiloto\piloto.js:5:5) 在 [object Object].jasmine.Env.describe_ (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:913:21) 在 [object Object].jasmine.Env.describe (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:898:15) 在描述 (c:\Users\QARJ\WebstormProjects\ProtractorPiloto\node_modules\protractor\node_modules\minijasminenode\lib\jasmine-1.3.1.js:658:27) 在对象。 (C:\Users\QARJ\WebstormProjects\ProtractorPiloto\piloto.js:3:1)

编辑:

在尝试了一些事情之后,我“明白了”做了以下事情:

这是我的规范文件:

 var pageObjectsModule = require('./page.js');

describe('PSafe Home', function () {
    var pageObject;

    beforeEach(function () {
        pageObject = new pageObjectsModule();
        isAngularSite(false);
        handlePromise = dvr.getAllWindowHandles();
    });

    it('Pesquisar PSafe', function () {

        dvr.get('http://home.psafe.com/');
        pageObject.pesquisarPsafe('PSafe');

    })
});

这是我的页面对象文件

 var PageObjects = function() {

    //var preenchePsafe = dvr.findElement(by.id('global-search'));
    //var opcaoPsafe = dvr.findElement(by.css('#search > ul > li:nth-child(1) > a'));

    this.abrirUrl = function() {
        dvr.get('http://home.psafe.com/');
    };

    this.pesquisarPsafe = function(pesquisa) {

        dvr.findElement(by.id('global-search')).sendKeys(pesquisa);
        //preenchePsafe.sendKeys(pesquisa);
        //this.opcaoPsafe.click();

    };

};

module.exports = PageObjects;

但我必须映射所需的元素并在 pesquisarPsafe(pesquisa) 内使用 sendKeys,而不是将其映射到函数之外(那些注释行)。我不知道为什么会这样。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您似乎没有正确命名变量。试试这样的:

    var PageObjects = require('./page.js');
    
    describe('PSafe Home', function () {
    
        beforeEach(function () {
            var pageObjects = new PageObjects();
            isAngularSite(false);
            handlePromise = dvr.getAllWindowHandles();
        });
    
        it ('Pesquisar PSafe', function () {
    
            browser.get('http://home.psafe.com/');
            pageObjects.pesquisarPsafe('PSafe');
    
        })
    }); 
    

    【讨论】:

    • 我是否必须更改 module.exports = PageObjects;在 page.js 中?因为只是这样做(这更有意义)是行不通的。它说:TypeError: undefined is not a function
    • 嗯,我明白你的意思了。我已经更新了答案 - 现在对你有用吗?
    • 谢谢,是的。但我已经编辑了我的问题,因为我在解决这个问题后发现了其他东西。请检查一下好吗?
    【解决方案2】:
    export class CosmicNovaSelectWardPage extends PageBase 
    {
    
      private btnWardList     : any;
      private lblHeaderTitle  : any;
      private btnCancel       : any;
    
      constructor() {
        super();
        const element = Elements.CosmicNovaSelectWardPage;
        this.btnWardList = super.findLocators(element.btnWardList.findBy, element.btnWardList.value);
        this.lblHeaderTitle = super.findLocators(element.lblHeaderTitle.findBy, element.lblHeaderTitle.value);
        this.btnCancel = super.findLocators(element.btnCancel.findBy, element.btnCancel.value);
      }
    
      /**
       * Step: select specific ward from given ward list
       * @param ward
       * @returns {CosmicNovaBaseWardPage}
       */
      public step_selectUserWard(ward: string): CosmicNovaBasePhysicianPage 
      {
        log.info("Step: choose "+ward+" in ward list [:step_selectUserWard:]");
        this.Helper_Actions.findTextAndClick(this.btnWardList,ward);
        return new CosmicNovaBasePhysicianPage();
      }
    

    【讨论】:

    • 请在您的回答中添加一些解释/描述。
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多