量角器:等待角度完成动画

时间:2017-08-16 16:26:36

标签: protractor cucumberjs

我的页面上有一个滑块菜单,在动画播放一段时间后出现。我想知道如何在不使用browser.wait(condition, timeout)的情况下处理点击操作,因为这取决于在远程数据库中获取数据的网络流量。

页面渲染可能需要很长时间,因此量角器会触发超时错误。我一直试图使用jQuery来等待所有转换和动画事件完成,但它仍然无法正常工作。

BasePage.prototype.clickMenuButton = function(menuName) {

var link = element(by.linkText(menuName));

browser.ignoreSynchronization = true;
browser.executeScript("jQuery('html > *').one('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd', function(){})").then(
    function() {
        link.click();
    },
    function (error) { console.log("Error : ", error); }
);
}

有没有人知道在不使用browser.wait和超时的情况下等待angularjs完成渲染和动画的方法?

1 个答案:

答案 0 :(得分:0)

这是与Angular JS的Protractor“不兼容”。大多数人称这是一个错误,但没有人确定这一点。

但是,如果出现此问题,Angular和Protractor团队建议为了修复$ timeout等待,用$ interval函数替换$ timeout函数。他们几乎是一样的,他们都达到了同样的目的。

$ interval函数修复了量角器$ timeout问题。

Official documentation声明您应该将$ interval用于连续轮询的任何内容(在Angular 1.2rc3中引入)。

在这种情况下,$ timeout对于前端开发人员(AngularJS开发人员)而言,对于JavaScript自动化开发人员(量角器开发人员)来说都不是一个好选择。

另一种选择是在测试应用程序中使用超时,或关闭浏览器同步。 这是我的ignoreSynchronization函数的例子。

browser.ignoreSynchronization = true;
                browser.wait(toast.isPresent(), 3000).then(
                    function(arr) {
                        if (arr) {
                            toast.getText().then(function(txt) {
                                //  console.log(txt);
                                expect(txt).toContain(caption);
                            });
                        } else {
                            toast.getText().then(function(txt) {
                                console.log('current toast: ' + txt);
                                console.log('modal not catched. see bug with $timeout \n ' +
                                    caption + " \n" +
                                    "==> Error! NOT PRESENT");
                            });

                        }

                    }
                );
                browser.ignoreSynchronization = false;

您还可以查看their official github issue tracker。这个页面说明如果你有一个$ timeout函数,开发人员不能改变它(这似乎有点不太可能,并且看起来像是一个糟糕的QA / dev关系)你应该使用ignoreSynchronization函数。

主要结论是,为了修复量角器$ timeout等待Angular,前端开发人员应该很容易用$ interval替换$ timeout

如果有帮助,请告诉我。