问题 选择量角器中的第一个可见元素


我正在编写量角器测试并喜欢它,虽然有时似乎陷入了似乎应该简单的事情。例如,我想循环浏览其中一个页面上具有“Nominate”文本的所有按钮。页面上有几十个,但只有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();
                }
            });
        }
    });

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

提前致谢


2517
2018-01-12 15:39


起源



答案:


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选择,或选择更具体的'Nominate'之类的 element(by.css('the section the nominate is under')).element(by.buttonText('Nominate'));

再次编辑:看 使用带有环的量角器 解释


15
2018-01-12 18:15



非常感谢。我整天都在和这个人打架。我不仅没有意识到x是罪魁祸首,我不知道你引用的first()函数,所以我非常感谢。我知道点击第一个元素不是一个好主意,通常我会避免它。这有点奇怪,但实际上它应该有效,虽然我知道我可能最终咬紧牙关。无论如何,我真的很感谢你花时间回答。它让我的测试用例终于工作了,并且在整个过程中教会了我一些东西。我是一个蟒蛇人,对JS和承诺相当新 - user2233949
别客气。你应该接受答案,如果它帮助你而不是回答新的答案=) - hankduan
我不知道我们可以链元素 - 谢谢 - mrwaim
是否有第二个功能,如第一个:)我想点击我找到的所有三个元素,一个接一个。 first()就像魅力一样,但是如何点击下两个呢? - prakash krishnan
得到了这个代码。它会得到(n)。例如: element.all(by.css('value')).get(1).click(); - prakash krishnan


答案:


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选择,或选择更具体的'Nominate'之类的 element(by.css('the section the nominate is under')).element(by.buttonText('Nominate'));

再次编辑:看 使用带有环的量角器 解释


15
2018-01-12 18:15



非常感谢。我整天都在和这个人打架。我不仅没有意识到x是罪魁祸首,我不知道你引用的first()函数,所以我非常感谢。我知道点击第一个元素不是一个好主意,通常我会避免它。这有点奇怪,但实际上它应该有效,虽然我知道我可能最终咬紧牙关。无论如何,我真的很感谢你花时间回答。它让我的测试用例终于工作了,并且在整个过程中教会了我一些东西。我是一个蟒蛇人,对JS和承诺相当新 - user2233949
别客气。你应该接受答案,如果它帮助你而不是回答新的答案=) - hankduan
我不知道我们可以链元素 - 谢谢 - mrwaim
是否有第二个功能,如第一个:)我想点击我找到的所有三个元素,一个接一个。 first()就像魅力一样,但是如何点击下两个呢? - prakash krishnan
得到了这个代码。它会得到(n)。例如: element.all(by.css('value')).get(1).click(); - prakash krishnan