如何检查元素是否不在页面中?

时间:2014-12-09 15:43:01

标签: angularjs testing protractor

我已经定义了一个可以在按钮上使用的指令,如果单击该按钮,它将远程显示文档中的一些元素,代码如下:

.directive("mydirective", function() {
  return {
     link: function(scope, element) {
        element.bind('click', function() {
           $timeout(function() {
               angular.element("#aaa").remove();
           }, 1000);
        });
     }
});

现在我想用量角器测试它,代码如下:

$("#mybutton").click();   // the button has the 'mydirective'

// wait until "#aaa" is removed
browser.wait(function() {
    var deferred = protractor.promise.defer();
    $("#aaa").isPresent().then(function(data) {       // !!!!
        deferred.fulfill(!data);
    });
    return deferred.promise;
}, 2000);

// checking
expect($("#aaa").isPresent()).toBe(false);

但是当我运行测试时,它会报告:

Error: Locator cannot be empty

代码中的!!!!行。

为什么以及如何解决它?

2 个答案:

答案 0 :(得分:1)

为什么不使用ElementFinder

  

对于大多数用途,可以将ElementFinder视为WebElement   特别是,您可以对它们执行操作(即click,getText)   你会是一个WebElement。 ElementFinders扩展了Promise,并且曾经   动作是在ElementFinder上执行的,最新结果来自于   可以使用那时访问链。与WebElement不同,   在执行查找之前,ElementFinder将等待角度稳定   或行动。

element(by.id('mybutton')).click();
expect(element(by.id('aaa')).isPresent()).toBe(false);

UPD。事实证明isElementPresent()最终在这种情况下起作用:

expect(browser.isElementPresent(by.id('aaa'))).toBe(false);

答案 1 :(得分:1)

你不需要承诺。他们暗示着。

browser.driver.wait ->
    browser.driver.isElementPresent(By.id 'aaa').then (present) -> !present