是的,可以使用多种类型的等待,我 95% 的时间都使用隐式等待,但在某些情况下需要使用显式等待。如果您的应用程序完全是 Angular 并正确同步(即没有未完成的 $http 调用 - more info),您不需要太多等待,因为 Protractor 往往会知道 Angular/您的应用程序何时准备就绪。但是我不知道您的应用程序,这很可能不适用于您的情况,我将就该主题提出一些想法:
隐式:为了一致性和稳定性,这些是您的最佳选择。我会挑战你并说你的大部分等待问题可能可以通过正确使用隐式等待来解决(更强大的用例,在多个条件下复合等)。但同样,我不知道你的应用程序,但我认为值得重新审视。您可以查看列表here,我经常使用的是presenceOf()、visibilityOf() 和它们的对应物stalenessOf() 和invisibilityOf()。
显式:我非常努力地避免这些,但我发现在某些情况下这是必要的。例如几秒钟内发生的动画,并且没有任何内容可以通过隐式等待进行跟踪。我创建了一些自己的方法来尝试捕捉这些场景并使用更隐式的等待方法,例如下面的方法:
// wait for an attribute to be present i.e. "ng-invalid" to be added to a class
// el = element, attr = attribute to check (i.e. class, id etc), target = attribute value to look for
Util.prototype.waitForAttributePresent = function (el, attr, target, time) {
var timeout = time || 0;
return browser.wait(function () {
return el.getAttribute(attr).then(function (val) {
return ~val.indexOf(target) < 0;
});
}, timeout);
};
用例:
// waits 5 seconds for the elements class to contain "active"
var el = $('div');
Util.waitForAttributePresent(el, 'class', 'active', 5000);
expect(true).toBe(true);
静态:不确定您所说的静态是什么意思,这听起来与显式等待相同。您将停止它一段时间,而不是基于任何条件。