在量角器中选择第一个可见元素

时间:2015-01-12 15:39:02

标签: selenium protractor

我正在编写量角器测试并且喜欢它,虽然有时似乎陷入了似乎应该简单的事情。例如,我想循环浏览其中一个页面上的所有按钮,这些按钮的文字为“提名”。页面上有几十个,但只有1或2个可见。所以我想点击第一个。这是我目前使用的代码:

    var nominateButtons = element.all(by.buttonText('Nominate'));
    nominateButtons.then(function(els){
        for(var x = 0;x < els.length;x++){
            //Since isDisplayed returns a promise, I need to do it this way to get to the actual value
            els[x].isDisplayed().then(function(isVisible){
                //isVisible now has the right value                 
                if(isVisible){
                    //But now els is not defined because of the scope of the promise!!
                    els[x].click();
                }
            });
        }
    });

当我运行此代码时,我得到一个&#39;无法调用方法点击未定义的&#39;错误,因为els [x]不再在范围内,但我似乎无法在不使用promise的情况下检查可见性。所以我的问题是,你怎么能循环遍历一系列元素,检查它们的可见性,然后点击第一个可见元素? (我试图不使用期望检查可见性,因为我知道大多数按钮都不可见)

提前致谢

1 个答案:

答案 0 :(得分:15)

els已定义。未定义的是x。 简单的方法是:

var nominateButtons = element.all(by.buttonText('Nominate'));
var displayedButtons = nominateButtons.filter(function(elem) {
   return elem.isDisplayed(); 
});
displayedButtons.first().click();

element.all(by.buttonText('Nominate')).
  filter(function(elem) {
    return elem.isDisplayed(); 
  }).
  first().
  click();
顺便说一句,编辑,你不应该依赖这种行为(单击文本'提名'的第一个按钮),因为它会在你更改你的应用时导致问题。看看您是否可以按ID选择,或者选择更具体的“提名”,例如element(by.css('the section the nominate is under')).element(by.buttonText('Nominate'));

再次编辑:请参阅Using protractor with loops了解