在我们的应用程序中,我们有一些问题需要回答,这将更新进度条。目前,我有一个等待HTML属性更改的功能,适用于大多数事情,但是对于进度条来说有点挑剔,因为当条形从0 - 10%等移动时动画发生超过1-2秒。所以失败我目前面临的是:Expected 11 to be within range 12, 14
。
代码:
Util.prototype.waitForAttributeChange = function (el, attr, time) {
var timeout = time || 0,
currentAttr;
el.getAttribute(attr).then(function (val) {
currentAttr = val;
return currentAttr;
}).then(function () {
return browser.wait(function () {
return el.getAttribute(attr).then(function (val) {
return val !== currentAttr;
});
}, timeout);
});
};
用法:
Util.waitForAttributeChange(Page.progressBar(), 'style', 10000).then(function () {
expect(Page.getProgressBarValue()).toBeWithinRange(12, 14);
};
问题:抓取的值不是进度条的最终结果,当它抓取它时它仍在移动(因为我的函数等待属性更改,此时属性确实发生了变化)
问题:还有其他方法可以等待动画,特别是等待它完成吗?和/或是否可以不使用browser.sleep()
?
答案 0 :(得分:1)
您可以使用Expected Conditions解决此问题。
每当我需要等待元素可见时,我会使用以下方法,然后在执行下一步之前等待它消失。这对于可能阻止与其他元素交互的临时确认模态很有用。
let waitTimeInSeconds = 15;
let EC = protractor.ExpectedConditions;
secondsToMillis(seconds) {
return seconds * 1000;
}
waitToBeVisible(element: ElementFinder) {
browser.wait(EC.visibilityOf(element), this.secondsToMillis(waitTimeInSeconds), 'The element \'' + element.locator() + '\' did not appear within ' + waitTimeInSeconds + ' seconds.');
}
waitToNotBeVisible(element: ElementFinder) {
browser.wait(EC.not(EC.visibilityOf(element)), this.secondsToMillis(waitTimeInSeconds), 'The element \'' + element.locator() + '\' still appeared within ' + waitTimeInSeconds + ' seconds.');
}