我为略微模糊的标题道歉,我不确定如何说出这一点。
我有我的页面对象,除了一个例外,它完美地运行。这是摘录:
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并完成它吗?
答案 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();
});