量角器点击一系列元素

时间:2015-04-23 12:39:51

标签: javascript angularjs jasmine protractor

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

我一直在尝试各种各样的方式,但作为一个例子(最新的一个尚未删除lol)这就是我得到的:

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

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

        });
    });
});

这似乎是第一个元素并点击,但是它会挂起它的下一个迭代(我可以看到原因,但努力想办法解决 - 这是我需要采取的某种承诺和解决因素考虑到了吗?)

返回的错误是

  

失败:陈旧元素引用:元素未附加到页面文档

任何有关帮助的指导/链接都会受到赞赏 - 到目前为止,谷歌搜索还没有给我留下任何重要信息......

提前致谢!

3 个答案:

答案 0 :(得分:1)

管理以找到解决方法,虽然这感觉不太合适。无论如何,如果有人有更好的建议随时发布:)

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.
    };
});

答案 1 :(得分:0)

避免"陈旧"问题是,您必须获得一系列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]);
    }
});

答案 2 :(得分:0)

解决方案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);
        });
    }