量角器页面对象定义未按预期工作

时间:2018-05-22 18:24:15

标签: protractor pageobjects

我为略微模糊的标题道歉,我不确定如何说出这一点。

我有我的页面对象,除了一个例外,它完美地运行。这是摘录:

module.exports = function(){
this.facilityList = element(by.name('facility')).all(by.tagName('option'));
this.randomFacility = element(by.name('facility')).all(by.tagName('option')).count().then(function(numberOfItems) {
    var rnum = parseInt(Math.random() * numberOfItems);
    return rnum;
}).then(function(randomNumber) {
    element(by.name('facility')).all(by.tagName('option')).get(randomNumber)
});

}

我可以访问并使用facilityList就好了。但后来我意识到我几乎总是对facilityList做同样的事情,所以为什么我不创建另一条线来让它选择一个随机的线。所以我使用主conf.js中的代码创建randomFacility

它不起作用。我看到的错误是:

Failed: Error while waiting for Protractor to sync with the page: "both angularJS testability and angular testability are undefined.  This could be either because this is a non-angular page or because your test involves client-side navigation, which can interfere with Protractor's bootstrapping.  See http://git.io/v4gXM for details"

我很困惑。这是说我不能在页面对象中进行所有处理来获取随机的,或者我只需要在conf.js中操作facilityList并完成它吗?

1 个答案:

答案 0 :(得分:1)

您需要了解量角器如何找到元素的机制。量角器只能在调用量角器的动作 API时从页面开始查找元素,例如getText()click()count()等。

因此,当您定义变量以表示页面上的某个元素时,当Nodej执行此行时,量角器不会从页面开始查找元素:

// page object login.page.js
module.exports = function LoginPage(){
   this.sumbitButton = element(by.css('#submit'));
   this.countName = element.all(by.css('.username')).count();
}

// use page object in conf.js
var LoginPage = require('./login.page.js');
var loginPage = new Loginpage();

当Nodej执行行var loginPage = new Loginpage();时,将执行函数LoginPage中的所有行。

执行第一个行时,量角器不会从当前打开的页面中找到元素,

当执行第二个行时,量角器将从当前打开的页面中找到元素,但是在这个时间点,量角器可以启动带有空白页面的浏览器,目标页面尚未打开或导航到。

要解决您的问题,您需要将randomFacility定义为类Method,而不是Property

module.exports = function() {
    this.facilityList = element(by.name('facility')).all(by.tagName('option'));

    this.randomFacility = function() {
        return element(by.name('facility'))
            .all(by.tagName('option')).count()
            .then(function(numberOfItems) {
                console.log('count: '+numberOfItems);
                var rnum = parseInt(Math.random() * numberOfItems);
                console.log('random index: '+rnum);
                return rnum;
            })
            .then(function(randomNumber) {
                console.log('argument randomNumber: '+randomNumber);                
                return element(by.name('facility'))
                    .all(by.tagName('option')).get(randomNumber)
            });
    }
};
// how to use
pageObject.randomFacility().then(function(ele){
   return ele.click();
});