量角器点击元素数组

Protractor clicking through an array of elements

我对端到端测试和使用量角器/茉莉花框架还很陌生。我知道如何获取元素数组以及如何单击锚点。但是如何/甚至可能点击元素选择器/转发器返回的锚点列表?

我一直在尝试各种方法,但作为一个例子(最新的还没有被删除哈哈)这就是我得到的:

element.all(by.repeater('link in links')).then(function(links) {
    links.forEach(function(link) {

        link.click().then(function() {
            console.log('callback for click ');

        });
    });
});

这似乎采用了第一个元素并点击通过,但是下一次迭代它挂起(我明白为什么,但正在努力寻找解决方法 - 这是我需要的某种承诺和解决因素吗考虑到?)

返回的错误是

Failed: stale element reference: element is not attached to the page document

任何指导/link 帮助将不胜感激 - 谷歌搜索到目前为止还没有返回任何值得注意的东西...

提前致谢!

设法想出了一个解决方法,尽管这感觉不太对。无论如何,如果有人有更好的建议,请随时 post :)

element.all(by.repeater('link in links')).map(
    function(link, index) {
        return {
            index: index,
            href: link.getAttribute('href')
        };
    })
    .then(function(links) {
        for (var i = links.length - 1; i >= 0; i--) {
        browser.get(links[i].href);
        // do some page specific stuff here.
    };
});

为了避免 "staleness" 问题,您必须获得一个 href 已解析属性值的数组,map()+then() 可以帮助您(因为您已经提供)。你只是不需要 index 并且你可以从第一个开始迭代链接:

element.all(by.repeater('link in links')).map(function(link) {
    return link.getAttribute('href');
}).then(function(links) {
    for (var i = 0; i < links.length; i++) {
        browser.get(links[i]);
    }
});

解决方案01

public findSpecificElementAndClick(element: ElementArrayFinder,expected: number){
        let clickedIndex: number = -1;
        element.filter(function (elementItem, index) {
            clickedIndex++;
            if(index === (expected-1)){
                element.get(clickedIndex).click();
                return true;
            }
        }).then(function (bool) {

        }).catch(function (err) {
            throw new FrameworkException('Ooops ! Error... '+err.message);
        });
    }

解决方案02

public findTextAndClick(element: ElementArrayFinder,expected: string) {
        let clickedIndex: number = -1;
        let status :boolean = false;
        element.filter(function (elementItem, index) {
            return elementItem.getText().then(function (text) {
                if(text === expected) {
                    clickedIndex = index;
                    status = true;
                    return true;
                }
            });
        }).then(function (bool) {
            if(!status){
                throw new ApplicationException("Ooops ! Couldn't found "+expected+" Record ...");
            }else{
                element.get(clickedIndex).click();
            }
        }).catch(function (err) {
            throw new FrameworkException('Ooops ! Error... '+err.message);
        });
    }