【问题标题】:How to I find an element with protractor?如何使用量角器找到元素?
【发布时间】:2015-03-19 18:58:47
【问题描述】:

似乎如果我使用element(by.css('#id')); protractor 有时会找到它,有时不会。取决于 DOM 是否安定下来。我已经走了一些:

getElementsByCss: function (cssVal) {
  // return element.all((by.css(cssVal)));
  return self.wait(function () {
    return element.all((by.css(cssVal))).then(function (els) {
      return els;
    }, function () {
      return false; // Don't fail, we want to retry
    });
  }, GET_ELEMENT_TIMEOUT, 'Elements not found by css: '  + cssVal);
},

它玩了一个游戏,在一段时间内重试获取元素。我们使用 5 秒。这似乎在大多数情况下都有效。在本地运行时,我们没有问题。

当我们在云(酱实验室)上运行时,它们的虚拟机速度非常慢。我们仍然会遇到随机问题。不幸的是,这些游戏必须在任何地方玩,例如:

getText: function (el) {
  return self.wait(function () {
    return el.getText();
  }, 1000, 'Could not get element text.');
},

expectBulletin: function () {
  var el, text;
  return self.wait(function () {
      // Find the bulleting element, make sure it's visible and grab its text.
      // If any of those three fail, try all of them again.
      return self.getElementByCss('.bulletin')
        .then(function (elm) {
          el = elm;
          return self.isElementVisible(el);
        }, function () {
          return false;
        })
        .then(function () {
          return self.getText(el).then(function (text) {
            return text;
          }, function () {
            return false;
          });
        }, function () {
          return false;
        });
    }, 10000, 'Count not get bulletin text.')
    .then(function (result) {
      text = result;
      return self.executeScript('arguments[0].click();', el.getWebElement());
    })
    .then(function () {
      return self.isElementNotVisible(el);
    })
    .then(function () {
      return text;
    });
},

所有的self.waits 只是一个 browser.driver.wait 包装器...

wait: function (fn, timeout, msg) {
  return browser.driver.wait(fn, timeout, msg);
},

这感觉就像一大包创可贴,而且它始终无法正常工作。 expectBulletin 99% 的时间在本地运行,但在慢速虚拟机上远程运行时,它的运行时间约为 50%。有时文本会返回空白,或者出现关于单击不可见元素或只是找不到公告元素的问题。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 有时我们对远程测试的感觉真的是一样的——在等待和预期的条件下,有很多等待。如果您希望您的测试可靠,恐怕您必须这样做。这是一个有点疯狂的想法,但可能会产生影响,试试看:stackoverflow.com/a/27483971/771848。谢谢。

标签: protractor saucelabs


【解决方案1】:

如果我使用 element(by.css('#id'));量角器有时会发现 它,有时不会。

你知道它会返回一个承诺,对吧?如果你想得到一个元素的绝对值,你必须先处理它的promise。

量角器在执行任何断言之前等待页面准备好。如果您的页面“准备就绪”但缺少某些数据,则说明您的 Angular 应用程序有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多