【问题标题】:Protractor clicking through an array of elements量角器单击元素数组
【发布时间】:2017-10-13 15:57:19
【问题描述】:

我对 e2e 测试和使用量角器 / jasmine 框架非常陌生。我知道如何获取元素数组以及如何单击锚点。但是如何/甚至可以点击元素选择器/中继器返回的锚点列表?

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

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

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

        });
    });
});

这似乎需要第一个元素并点击,但是下一次迭代它会挂起(我明白为什么,但很难找到解决方法 - 这是我需要考虑的某种承诺和解决因素帐户?)

返回的错误是

失败:过时的元素引用:元素未附加到页面文档

任何指导/帮助链接将不胜感激 - 到目前为止,谷歌搜索还没有向我返回任何值得注意的信息...

提前致谢!

【问题讨论】:

  • 尝试以下操作:element.all(by.repeater('link in links')).then(function(links){ for (var i = 0; i < links.length; i++){ (function(test){ links.get(i).click(); })(links[i]); } }); 抱歉标记不好,但我认为它不值得作为答案,因为它最多只是猜测。
  • 嘿,不用担心。我确实尝试过类似的东西。不幸的是,这会返回一个错误,指出对象没有方法 'get' --> 失败:对象 [object Object],[object Object],[object Object] 没有方法 'get'
  • 我假设您尝试过同样的方法,但不是links.get(i).click, links[i].click?
  • @TomNijs 我尝试用 test.click(); 替换 links.get(i).click(); 但这会在原始帖子中返回相同的 stale element reference 错误:(
  • @TomNijs links[i].click 返回相同的过时元素问题

标签: javascript angularjs jasmine protractor


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

【讨论】:

【解决方案2】:

为避免“陈旧”问题,您必须获得一组 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]);
    }
});

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多