我正在尝试检查是否存在模态。如果模态不存在,那么它会将计时器的值放入browser.sleep()。这将为模态显示时间。我在页面对象中遇到for循环问题。当我运行下面的代码时,我没有收到alert下的alert和console.log消息if if当我通过更改对象强制失败时。另外,我没有收到Timer过期消息。
来自page_object文件(相关代码)
editVinModal: { get: function () {
return browser.element({id: 'editableVINPart'});
}},
doEditVIN: { value: function () {
modalFailedToAppear = true;
console.log('In doEditVIN');
for(modal_timer = 0 ; modal_timer <= 30; modal_timer++) {
if (!(this.editVinModal)) {
alert('In If');
console.log('Modal failed to appear');
console.log('Under if - modalFailedToAppear: ', modalFailedToAppear);
browser.sleep(modal_timer);
console.log('under if - modal_timer: ',modal_timer);
}
else {
console.log('In else if else loop');
// console.log(browser.isElementPresent(this.editVinModal));
console.log('modalFailedToAppear: ',modalFailedToAppear);
modalFailedToAppear = false;
console.log('modalFailedToAppear: ',modalFailedToAppear);
console.log('modal_timer: ',modal_timer);
break;
}
}
if (modalFailedToAppear){
console.log("Modal is not present within the given time period. Timer has expired.");
}
this.editVinLink.click();
}},
提前致谢
答案 0 :(得分:3)
看起来你在这里很新。欢迎!
一般来说, browser.sleep()
不属于您的量角器测试(除了调试目的)。这是个坏消息。好消息是,Protractor实际上提供的功能完全(我认为)完成了您尝试做的事情。它被称为browser.wait()
,它的工作方式如下:
browser.wait( function() {
return element(by.id('editableVINpart')).isPresent().then( function(present) {
return present;
});
}, 5000)
.then(function() {
element(by.id('editableVINpart')).click();
}, function() {
console.log('Element not found. :( ');
});
browser.wait()
有两个参数:第一个是匿名函数,它将重复执行,直到它返回true
;第二,等待的时间以毫秒为单位(顺便说一句,browser.sleep()
也需要一毫秒的等待时间,所以你的for
循环只等待465毫秒,如果它一直迭代,或者约半秒 - 不是很长。)
然后,由于browser.wait()
返回一个promise,就像所有Protractor函数一样,我们可以在它的末尾附加一个.then()
语句,如果promise是,它将执行第一个传入函数成功,或第二个传入函数,如果不是。
如果您经常需要等待元素存在(并且由于某种原因它不与Angular页面加载同步),那么您可以使用该函数的可重用形式,如这样:
var waitThenClick = function(el) {
browser.wait( function() {
return el.isPresent().then( function(present) {
return present;
});
}, 5000)
.then(function() {
el.click();
}, function() {
console.log('Element with locator: ' + el.locator + ' was not found. :( ');
});
};
然后你就可以这样称呼它,无论你需要什么元素:
waitThenClick(element(by.id('editableVINpart')));
祝你好运!确保通过这样的问题获得异步(尤其是承诺)的好处和聪明。量角器承诺最好的旅行。