检查元素是否不存在

时间:2017-07-10 06:05:37

标签: javascript angularjs protractor

我正在尝试检查某个元素是否不存在但是因超时问题而失败。根据我的观察,我发现驱动程序首先尝试找出该元素,然后等待元素消失,而不是检查元素是否存在或不存在。我试过以下方法。

1. browser.element.all(selector)
2. browser.driver.findElements(selector)
3. browser.isElementPresent(browser.element(selector))
4. element(selector).isPresent()

背景:点击按钮时,会出现一个模态。它有取消和保存按钮。单击取消按钮时,模态窗口消失。现在我正在尝试编写一个期望条件来检查模态是否已经消失。

以上都是失败的。请告诉我一个正确的方法,我可以检查一个元素是否立即存在。

以上是

的错误
Error: function timed out after 60000 milliseconds

我真的不确定,为什么Protractor无法帮助我只检查DOM中是否存在该元素。我尝试了所有可能的方法。每个方法都试图查找现有元素是否正在转换为不存在的状态。那么为什么这么多API如果都做同样的工作呢。

5 个答案:

答案 0 :(得分:3)

不确定为什么您为选择器使用browser.,以及selector实际上是什么,但我怀疑您遇到了多个问题。

首先,.isPresent()确实要求在dom ; isDisplayed()  问是否可见。因此,您的策略将取决于您的模型是从dom中移除还是隐藏(例如。display:none等...)。

其次,它并不表示您正在处理这些方法中的任何一种返回的承诺。如果您在expect(自动等待承诺解决)中运行此操作,您也不会提及。

第三,不清楚你的模态选择器是返回单个元素还是多个元素(尽管你使用element.all确实指出了后者。

长篇故事稍微长一点,这是一个如何检查你的模态是否显示的例子,假设你的模态有一个.myModal的类,是唯一一个,它是未显示时从dom中删除。

$('.myModal').isPresent().then(function(inDom) {
    return inDom; // returns bool
};

上面的代码抓住你的元素,检查它是否在dom中,通过.then处理promise,如果元素在dom中则返回true / false。

那就是说,你的代码可能有多个模态,通过css隐藏。在这种情况下,您需要为该案例找到策略。也许你的代码为隐藏元素添加了一个.shown类?很好,检查$('.myModal.shown')的存在。也许你的代码在dom中有多个隐藏的模态...不太好,但你可以循环遍历每个元素,并测试任何是否与isDisplayed()一起显示。

希望这有点帮助...

答案 1 :(得分:1)

我知道这篇文章很老了。但我找到了一种有用的方法:我创建了一个具有3个参数的函数

  • 字段:不应出现的ElementFinder,
  • fieldName:仅用于日志的字段名称,
  • present:boolean使用此函数来测试是否存在字段。

可用于测试DOM中存在(而不是)的每个元素

export async function checkField(field: any, fieldName: string, present?: any) {
  let text: string;
  if (present === false) {
    if (field.length > 0) {
      field.forEach(async el => {
        try {
          text = await el.getText();
          expect('should not be present (' + fieldName + ')').toEqual('but it is');
        } catch (e) {
          expect(el.isPresent()).toBe(present);
        }
      });
    } else {
      try {
        text = await field.getText();
        expect('should not be present (' + fieldName + ')').toEqual('but it is');
      } catch (e) {
        expect(field.isPresent()).toBe(present);
      }
    }
  } else {
    if (field.length > 0) {
      field.forEach(async el => {
        try {
          text = await el.getText();
          expect(el.isPresent()).toBe(true);
        } catch (e) {
          expect('element present (' + fieldName + ')').toEqual('but i can\'t find it');
          throw e;
        }
      });
    } else {
      try {
        text = await field.getText();
        expect(field.isPresent()).toBe(true);
      } catch (e) {
        expect('element present (' + fieldName + ')').toEqual('but i can\'t find it');
        throw e;
      }
    }
  }
}

显然,这可以用更好的方式编写,但是确实有效!

对于每个可以再次搜索此帖子的人。

答案 2 :(得分:0)

以下是来自量角器api docs的示例

expect(element(by.binding('notPresent')).isPresent()).toBe(false);

所以你的解决方案应该是,

expect(element(by.css('.elementClass')).isPresent()).toBe(false);

答案 3 :(得分:0)

我遇到了类似的问题,在尝试使用expect语句之前,使用expectedConditions等待模态消失可能会更好。

var WaitForElement = function(item, timeout = 15000) {
  var el = element(by.css(item));
  var EC = protractor.ExpectedConditions;
  browser.wait(EC.not(EC.presenceOf(el)), timeout).then(function(){
    return;
  });
};

WaitForElement('.example').then(function() {
    expect(element(by.css('.example')).isPresent()).toBe(false);
}

这将使量角器等待指定的元素(在这种情况下为' .example')在运行expect语句之前消失,否则它将在十五秒后超时并且期望将失败。 / p>

答案 4 :(得分:-1)

expect($(".example").isPresent()).toBe(false)

量角器中的每个方法都会返回一个promise。您必须使用帮助程序来解决它。如内置期望功能。