无法使用量角器正确执行页面对象模式

Can't execute page objects pattern with protractor properly

本文关键字:执行 面对 对象 模式 量角器      更新时间:2023-09-26

我一直在尝试在页面对象模式中调整我的测试代码。但是我对此有些困难。

我有以下代码:

这是我的页面对象文件

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

    this.pesquisarPsafe = function(pesquisa) {
        //dvr.findElement(by.id('global-search')).sendKeys(pesquisa);
        preenchePsafe.sendKeys(pesquisa);
        opcaoPsafe.click();
    };
    };
module.exports = PageObjects;

这是我的规范文件

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 preenchePsafe = dvr.findElement(by.id('global-search'));
 var opcaoPsafe = dvr.findElement(by.css('#search > ul > li:nth-child(1) > a'));
 preenchePsafe.sendKeys(pesquisa);
 opcaoPsafe.click();

并取消注释该行

 //dvr.findElement(by.id('global-search')).sendKeys(pesquisa);

我的测试工作正常。但我不想这样做,使用这样的页面对象是没有意义的。由于我是javascript和Jasmine的初学者,我认为这可能是一个代码结构问题。

我猜你的堆栈跟踪的一部分说 TypeError: object is not a function

因为在 beforeEach 函数的 spec 文件中,您尝试将 pageObject 实例化为 pageObjectsModule 函数的新实例,但 pageObjectsModule 在第一行中被定义为对象

var pageObjectsModule = require('./page.js'); 
describe('PSafe Home', function () {
    var pageObject;
    beforeEach(function () {
        pageObject = pageObjectsModule; // This line should fix the problem.
        isAngularSite(false);
        handlePromise = dvr.getAllWindowHandles();
    });
    it('Pesquisar PSafe', function () {
        dvr.get('http://home.psafe.com/');
        pageObject.pesquisarPsafe('PSafe');
    });
});

或者,您可以这样做:

var pageObject = require('./page.js'); // define the pageObject object as soon as you require it.
describe('PSafe Home', function () {
   // var pageObject;
    beforeEach(function () {
     // pageObject = new PageObjectsModule(); // now you don't need this line
        isAngularSite(false);
        handlePromise = dvr.getAllWindowHandles();
    });
    it('Pesquisar PSafe', function () {
        dvr.get('http://home.psafe.com/');
        pageObject.pesquisarPsafe('PSafe');
    });
});
dvr

在页面对象中定义。要么你需要:

var dvr = require('some/path.js')

位于页面对象文件的顶部或构造函数内部。

另外,我建议您使用element(by.css())$()而不是dvr.findElement(by)。例如:

// $() is the same as element(by.css())
var preenchePsafe = $('global-search'));
// You can chain element calls.
var opcaoPsafe = $('#search > ul').$$('li').get(1).$('a');