量角器:等待存在但未显示的元素

时间:2014-04-15 14:33:00

标签: angular-ui-bootstrap protractor

我已经编写了一个测试来检查一个元素是否在屏幕上可见,在我的例子中是一个angular-ui-bootstrap可折叠面板,也就是“警告”。代码有效,但测试过去只有75%的时间都会失败。

“警告”的显示上有一个崩溃动画,我不能为测试关闭动画,因为它是一个jquery动画。警告始终在DOM中“存在”,只有在没有理由显示时才会崩溃。

首先,我已经使用此代码进行了测试,这非常简单:

expect(element('.warning').isDisplayed()).toEqual(true);

当我需要测试元素时,问题出现了,例如:一旦显示警告,某些操作会导致其崩溃。

那个测试:

expect(element('.warning').isDisplayed()).toEqual(false);
仅在动画开始时才会传递

。在元素仍然显示的情况下检查条件时,它将失败。

我想出了两个解决方案。

使用ptor.driver.sleep(2000)的简单方法。放慢我的测试速度是不可接受的。

坚硬,丑陋,但这给了我很好的结果:

exports.isWarningDisplayed = function (expectedVisibility) {
  return ptor.driver.wait(function () {
     if (expectedVisibility) {
       return element(by.css('.warning')).isDisplayed().then(function(visibility) {
         return visibility === expectedVisibility;
       });
      } else {
        return element.all(by.css('.warning .collapse.in')).then(function(items) {
          return items.length === 0;
       });
      }
    }, 2000).then(function() {
      return element.all(by.css('.warning .collapse.in'));
    }).then(function (items) {
      return items.length > 0;
    });
};

我的问题是它感觉非常错误。您是否找到了更好的方法来处理这种情况?我的期望是拥有类似的东西:

expect(element('.warning').not.isDisplayed()).toEqual(true);

...但是量角器或webDriver AFAIK中没有.not

4 个答案:

答案 0 :(得分:18)

我遇到了类似的问题 - 想要测试何时不再禁用某个元素。我努力尝试在没有.not测试的情况下解决问题,然后意识到我可以移动“不是”#39;测试进入css选择器:

// we're looking for when the element doesn't have a .disabled class
var availableElement = by.css('.some-class:not(.disabled)');
browser.wait(function() {
  return ptor.isElementPresent(availableElement);
}, 30000);

expect(ptor.isElementPresent(availableElement)).toBeTruthy();

不确定它是否有帮助,但我有一点清晰,所以我想分享。

答案 1 :(得分:8)

使用elementexplorer(https://github.com/angular/protractor/blob/master/docs/debugging.md)我查看了量角器对象,找到了一个对我来说非常有效 的答案:

var el = element(by.id('visibleElementId'));
browser.driver.wait(protractor.until.elementIsNotVisible(el));

答案 2 :(得分:2)

expect(ptor.isElementPresent(by.css('.warning'))).toBe(false);

这是另一种检查页面上是否显示某些内容的方法

答案 3 :(得分:0)

根据我的经验,这是一个常见的“悲伤”问题。您知道您的代码已正确编写,但由于等待而导致测试失败。例如,在Chrome中我在控制台中收到下一个错误:

<未知错误:元素在点(952,275)处不可点击。 >

所以,我在我的WebDriver类中创建了单独的函数,似乎有效:

this.waitElementToBeShown = function (elmLocator) {
        browser.sleep(500);
        browser.wait(function () {
            return (elmLocator).isPresent();
        }, 3000);
        browser.wait(function () {
            return (elmLocator).isDisplayed();
        }, 3000);
    }