如何将EC.elementToBeClickable()与.first()结合使用以返回第一个元素?

时间:2016-04-12 21:30:24

标签: selenium protractor

目前,我正在使用:

browser.wait(EC.elementToBeClickable($('div[ng-model="loginInput"]')), 5000));

但是,这会返回多个元素。我不想使用凌乱的xpath或css选择器,因为在这种情况下路径很长。

我的browser.wait条件有效,但控制台返回:

WARNING - more than one element found for locator By.cssSelector("div[ng-model=\"loginInput\"]") - the first result will be used
WARNING - more than one element found for locator By.cssSelector("div[ng-model=\"loginInput\"]") - the first result will be used

我可以在elementToBeClickable()上使用.all和.first()吗?

2 个答案:

答案 0 :(得分:1)

一种选择是使用first()来获取与定位器匹配的第一个元素:

var elm = $$('div[ng-model="loginInput"]').first();
browser.wait(EC.elementToBeClickable(elm), 5000));

另外,如果您想等待所有元素都可点击,那么您可以使用elementToBeClickableEC.and组合个人reduce()来制作自定义预期条件 (未经测试):

var allElementsToBeClickable = function(elements) {
  return elements.all().reduce(function(acc, elm) {
      return EC.and(acc, EC.elementToBeClickable(elm));
  }, function () {});
};

var elements = $$('div[ng-model="loginInput"]');
browser.wait(allElementsToBeClickable(elements), 5000));

答案 1 :(得分:0)

使用,获取要使用的数组中的相应元素 element.all(by.css( '某某'))得到(0);