如何保存通过`element.all`找到的对象的定位器?

时间:2015-03-04 20:57:50

标签: protractor

我有一些代码可以找到所有"模态内容"在页面中使用div,并为找到的每个元素创建一些Modal包装器对象:

var deferred = protractor.promise.defer();
element.all(by.className('modal-content')).then(function(modals) {
  var wrappedModals = [];
  modals.forEach(function(webElementPromise) {
     // the "modal-content" should only be findable for modals
     // that are visible:
     expect(webElementPromise.isPresent()).toBe(true);
     expect(webElementPromise.isDisplayed()).toBe(true);

     wrappedModals.push(new Modal(webElementPromise.locator()));
     console.log(webElementPromise.locator());
  });
  deferred.fulfill(wrappedModals);
});

问题是我想要检查这些元素是否已经消失(在页面上进行了一些更改之后)。但是,每个元素的.locator()是相同的(只是"模态内容")。我是否可以通过编程方式计算这些对象的其他属性(保存的东西,以便我可以让Protractor稍后找到该对象?)

注意,如果我只保存webElementPromise本身,那么在对象消失的情况下我得到StaleElementReferenceError: Element is no longer attached to the DOM(这是有意义的,因为DOM已经发生了很大变化)。 (如果引用因其他原因而变得陈旧,我会保持警惕,所以我不确定是否应该依赖此异常来测试元素是否隐藏。)

1 个答案:

答案 0 :(得分:1)

您不需要"标识符,以便稍后再次查找元素"。您的elementFinder / elementArrayFinder是您对元素的引用。

var EC = protractor.ExpectedConditions;

var myElems = element.all(by.className('modal-content'));
expect(myElems.count()).toBeGreaterThan(0);
myElems.each(function(elem) {
  // assert that they're all present and visible
  expect(EC.visibilityOf(elem)()).toBeTruthy();
});

// now you do whatever actions that make your elements disappear.

myElems.each(function(elem) {
  // assert that they're all invisible (either not present or not visible)
  expect(EC.visibilityOf(elem)()).toBeFalsy();
});