在量角器中,browser.isElementPresent vs element.isPresent vs element.isElementPresent

IT技术 javascript selenium selenium-webdriver protractor end-to-end
2021-02-19 01:06:54

在量角器中,基本上有 3 种方法可以检查元素是否存在:

var elm = element(by.id("myid"));

browser.isElementPresent(elm);
elm.isPresent();
elm.isElementPresent();

这些选项是否等效和可互换,通常应该首选哪一个?

3个回答

所有功能都以类似的方式运行,但有细微的差别。以下是我发现的一些差异 -

elm.isPresent() ——

  1. 是等的扩展,ElementFinder因此在执行任何操作之前等待 Angular在页面上稳定下来。
  2. 它在elmelement(locator)orElementFinder和 not时起作用ElementArrayFinder如果使用locator指定的返回多个元素,则检查第一个元素是否isEnabled()在 DOM 中。不接受任何参数作为输入。
  3. 最适用于 Angular 页面和 Angular 元素。
  4. 每当需要查找元素是否存在时使用的首选。

elm.isElementPresent(subLoc)- (当有一个子定位器时elm

  1. 是等的扩展,ElementFinder因此在执行任何操作之前等待 Angular 在页面上稳定下来。
  2. 用于检查作为父元素的子元素的元素是否存在。它以sub locator父代的elma 作为参数。(只有这个和那个的区别elm.isPresent()
  3. 最适用于 Angular 页面和 Angular 元素。
  4. 每当需要检查父元素的子元素是否存在时使用的首选。

browser.isElementPresent(element || Locator) ——

  1. 是等的实现,webdriver所以不等待 angular 稳定下来。
  2. 如果使用相同的定位器定位多个元素,则将alocator或 anelement作为参数并使用第一个结果。
  3. 最好与非 Angular 页面一起使用。
  4. 在非角度页面上测试时使用的首选。

以上所有检查元素在 DOM 中的存在并返回boolean结果。虽然角度和非角度特征不会影响这些方法的使用,但是当该方法默认等待 angular 稳定时,还有一个额外的优势,有助于避免在找不到 angular 元素或状态元素引用异常的情况下出现错误,等等...

这就是我希望得到的答案。非常感谢你!我发现这 3 种存在检查方式非常令人困惑,因为方法之间实际上存在差异,并且仅通过查看方法的命名方式就不清楚差异是什么。另外,差异没有正确记录。希望这个答案只是填补了空白,并在未来帮助其他人。
2021-05-11 01:06:54

我不能说哪个更受欢迎,但我能够找到源代码并检查它。

根据文档,elm.isPresent()elm.isElementPresent()是等效的。希望有帮助。

量角器 API 文档

View code标题右侧有一个链接

browser.isElementPresent(elm);

https://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.isElementPresent

/**
 * Schedules a command to test if there is at least one descendant of this
 * element that matches the given search criteria.
 *
 * @param {!(webdriver.Locator|webdriver.By.Hash|Function)} locator The
 *     locator strategy to use when searching for the element.
 * @return {!webdriver.promise.Promise.<boolean>} A promise that will be
 *     resolved with whether an element could be located on the page.
 */
webdriver.WebElement.prototype.isElementPresent = function(locator) {
  return this.findElements(locator).then(function(result) {
    return !!result.length;
  });
};

榆树.isPresent();

https://angular.github.io/protractor/#/api?view=ElementFinder.prototype.isPresent

/**
 * Determine whether the element is present on the page.
 *
 * @view
 * <span>{{person.name}}</span>
 *
 * @example
 * // Element exists.
 * expect(element(by.binding('person.name')).isPresent()).toBe(true);
 *
 * // Element not present.
 * expect(element(by.binding('notPresent')).isPresent()).toBe(false);
 *
 * @return {ElementFinder} which resolves to whether
 *     the element is present on the page.
 */
ElementFinder.prototype.isPresent = function() {
  return this.parentElementArrayFinder.getWebElements().then(function(arr) {
    if (arr.length === 0) {
      return false;
    }
    return arr[0].isEnabled().then(function() {
      return true; // is present, whether it is enabled or not
    }, function(err) {
      if (err.code == webdriver.error.ErrorCode.STALE_ELEMENT_REFERENCE) {
        return false;
      } else {
        throw err;
      }
    });
  }, function(err) {
    if (err.code == webdriver.error.ErrorCode.NO_SUCH_ELEMENT) {
      return false;
    } else {
      throw err;
    }
  });
};

榆树.isElementPresent();

https://angular.github.io/protractor/#/api?view=ElementFinder.prototype.isElementPresent

/**
 * Same as ElementFinder.isPresent(), except this checks whether the element
 * identified by the subLocator is present, rather than the current element 
 * finder. i.e. `element(by.css('#abc')).element(by.css('#def')).isPresent()` is
 * identical to `element(by.css('#abc')).isElementPresent(by.css('#def'))`.
 *
 * @see ElementFinder.isPresent
 *
 * @param {webdriver.Locator} subLocator Locator for element to look for.
 * @return {ElementFinder} which resolves to whether
 *     the subelement is present on the page.
 */
ElementFinder.prototype.isElementPresent = function(subLocator) {
  if (!subLocator) {
    throw new Error('SubLocator is not supplied as a parameter to ' + 
      '`isElementPresent(subLocator)`. You are probably looking for the ' + 
      'function `isPresent()`.');
  }
  return this.element(subLocator).isPresent();
};
没有投反对票,但也没有投反对票。我认为迈克尔对否决的原因肯定是正确的。感谢您参与并调查此事!
2021-04-16 01:06:54
我确实解释过两个是等价的……我认为其余的从源头来看是不言自明的。这些就像 2 到 3 行函数,不包括elm.isPresent(). 耸耸肩
2021-04-18 01:06:54
我认为downvotes只是复制粘贴源代码而不解释任何东西。
2021-04-21 01:06:54
谁投了反对票告诉我们为什么,答案对我来说看起来不错。
2021-05-07 01:06:54

您可以使用 isPresent 函数检查元素是否存在。

因此,您的代码将类似于:

var myElement = element(by.css('.elementClass'));
expect(myElement.isPresent()).toBeFalsy();

是 isPresent 函数的量角器文档。

谢谢!这就是问题所在 - 在量角器中实际上有 3 种方法可以做到这一点,这就是问题所在。
2021-05-02 01:06:54