量角器规格泄漏

时间:2016-04-15 14:16:52

标签: protractor angular-promise

我对承诺等还是很陌生,我需要一些帮助来解决这个问题。我的其中一个块在下一个块开始在StaleElementReferenceError结束之前没有结束,后面是一个完整的specfile,后面应该调用代码。

listView.js(我知道它看起来很奇怪,但是出于不相关的原因我这样设置):

module.exports = function () {
    var public = {};

public.checkFilters = function (filters) {
        var promises = [];
        for (var i = 0; i < filters.length; i++) {
            promises[i] = getFilterPromise(filters[i]);
        }
        return protractor.promise.all(promises);
    };

    var getFilterPromise = function (filter) {
        return public.getHeaderIndex(filter.on).then(function (headerIndex) {
            return checkRows(filter.values, headerIndex);
        });
    };

    public.getHeaderIndex = function (text) {
        var headers = table.all(by.tagName('th'));
        var correctHeaderIndex;
        return headers.each(function (header, index) {
            header.getText().then(function (actualHeaderText) {
                if (actualHeaderText === text) {
                    correctHeaderIndex = index;
                }
            })
        }).then(function () {
            return new Promise(function (resolve, reject) {
                if (correctHeaderIndex) {
                    resolve(correctHeaderIndex);
                } else {
                    reject('Header not found');
                }
            });
        });
    };

    public.getWorkflowCount = function () {
        return workflows.count();
    };

    var checkRows = function (matchers, headerIndex) {
        var mismatch = false;
        return workflows.each(function (element, index) {
            public.getTextFromCell(index, headerIndex).then(function (actual) {
                if (!anyMatch(actual, matchers)) {
                    mismatch = true;
                }
            });
        }).then(function () {
            return new Promise(function (resolve, reject) {
                if (mismatch) {
                    reject('Header not found');
                } else {
                    resolve('all rows matched');
                }
            });
        });
    };

    var anyMatch = function (actual, matchers) {
        var match = false;
        for (var j = 0; j < values.length; j++) {
            if (text === values[j]) {
                match = true;
            }
        }
        return match;
    };

    public.getTextFromCell = function (row, column) {
        return workflows.get(row).all(by.tagName('td')).get(column).getText();
    };


    return public;
}();

LV_00:

describe('LV_00:', function () {

    it('statusfilter', function () { 
        P.listView.filter('status', H.regStatus.S.inProgress);
    });
    it('statusfilter works', function () {
        P.listView.checkFilters([{
            on: H.lang.S.status,
            values: [H.regStatus.S.inProgress]
        }]);
    });

});

2 个答案:

答案 0 :(得分:1)

我认为您应该将测试准备代码移到beforeEach()

describe('LV_00:', function () {
    beforeEach('statusfilter', function () { 
        P.listView.filter('status', H.regStatus.S.inProgress);
    });

    it('statusfilter works', function () {
        P.listView.checkFilters([{
            on: H.lang.S.status,
            values: [H.regStatus.S.inProgress]
        }]);
    });
});

您可能还需要使用done callback function

describe('LV_00:', function (done) {
    beforeEach('statusfilter', function () { 
        P.listView.filter('status', H.regStatus.S.inProgress).then(function () {
            done();
        });
    });

    it('statusfilter works', function () {
        P.listView.checkFilters([{
            on: H.lang.S.status,
            values: [H.regStatus.S.inProgress]
        }]);
    });
});

假设filter()返回一个承诺。

答案 1 :(得分:1)

找到解决方案感谢alecxe建议使用done()我在谷歌搜索后使用了以下内容。

it('statusfilter', function () {
        P.listView.filter('status', H.regStatus.S.inProgress);
    });
    it('statusfilter works', function () {
        protractor.promise.controlFlow().execute(function () {
            return P.listView.checkFilters([{
                on: H.lang.S.status,
                values: [H.regStatus.S.inProgress]
            }]);
        });
    });

在此处找到:Prevent Protractor from finishing before promise has been resolved