页面对象中的 For 循环不正确 运行
For Loop in a Page Object Not Running Properly
我正在尝试检查是否存在模态。如果模态不存在,那么它将把计时器的值放入 browser.sleep()。这将为模态的出现留出时间。我在页面对象中遇到 for 循环问题。当我 运行 下面的代码时,当我通过更改对象强制失败时,我没有收到 if 下的警报和 console.log 消息。另外,我没有收到计时器过期消息。
来自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();
}},
提前感谢
看来你是新来的。欢迎!
browser.sleep()
,一般来说,不属于你的 Protractor 测试(调试目的除外)。这是坏消息。好消息是 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()
有两个参数:第一个是匿名函数,它将重复执行直到 returns true
;其次,以毫秒为单位的等待时间(顺便说一句,browser.sleep()
也需要毫秒的等待时间,所以你的 for
循环如果一直迭代,只等待 465 毫秒,或者大约半秒——不是很长)。
然后,因为 browser.wait()
returns 一个承诺,就像所有 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')));
祝你好运!确保对此类问题的异步内容(尤其是承诺)变得精通和聪明。量角器承诺会绊倒我们中最好的人。
我正在尝试检查是否存在模态。如果模态不存在,那么它将把计时器的值放入 browser.sleep()。这将为模态的出现留出时间。我在页面对象中遇到 for 循环问题。当我 运行 下面的代码时,当我通过更改对象强制失败时,我没有收到 if 下的警报和 console.log 消息。另外,我没有收到计时器过期消息。
来自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();
}},
提前感谢
看来你是新来的。欢迎!
browser.sleep()
,一般来说,不属于你的 Protractor 测试(调试目的除外)。这是坏消息。好消息是 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()
有两个参数:第一个是匿名函数,它将重复执行直到 returns true
;其次,以毫秒为单位的等待时间(顺便说一句,browser.sleep()
也需要毫秒的等待时间,所以你的 for
循环如果一直迭代,只等待 465 毫秒,或者大约半秒——不是很长)。
然后,因为 browser.wait()
returns 一个承诺,就像所有 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')));
祝你好运!确保对此类问题的异步内容(尤其是承诺)变得精通和聪明。量角器承诺会绊倒我们中最好的人。