web-dev-qa-db-ja.com

分度器では、browser.isElementPresent vs element.isPresent vs element.isElementPresent

分度器では、基本的に、要素が存在するかどうかを確認する3つの方法があります。

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

browser.isElementPresent(Elm);
Elm.isPresent();
Elm.isElementPresent();

これらのオプションは同等で互換性があり、一般的にどのオプションが優先されるべきですか?

25
alecxe

すべてが同様に機能し、微妙な違いがあります。ここに私が見つけたいくつかの違いがあります-

Elm.isPresent() -

  1. ElementFinderの拡張であるため、 Angularを待つ は、アクションを実行する前にページに収まります。
  2. ElmElementFinderではなくelement(locator)またはElementArrayFinderである場合に機能します。指定されたlocatorを使用して複数の要素が返される場合、最初の要素がDOMでisEnabled()かどうかがチェックされます。入力としてパラメーターを取りません。
  3. AngularページおよびAngular要素で最適です。
  4. 要素が存在するかどうかを見つける必要がある場合に使用する最初の設定。

Elm.isElementPresent(subLoc)Elmへのサブロケーターがある場合)

  1. ElementFinderの拡張であるため、アクションを実行する前にAngular=がページに収まるのを待ちます。
  2. 親のサブ要素である要素の存在を確認するために使用されます。親としてElmにパラメータとして_sub locator_を取ります。 (これとElm.isPresent()との違いのみ)
  3. AngularページおよびAngular要素で最適です。
  4. 親のサブ要素が存在するかどうかを確認する必要がある場合に使用する最初の設定。

---(browser.isElementPresent(element || Locator) -

  1. webdriverの実装であるため、angularが確定するのを待ちません。
  2. locatorまたはelementをパラメーターとして受け取り、同じロケーターを使用して複数の要素が見つかった場合は最初の結果を使用します。
  3. 角度のないページに最適です。
  4. 角度のないページでテストするときに使用する最初の設定。

上記のすべては、DOMの要素の存在をチェックし、booleanの結果を返します。ただし、angularおよび非角度機能はこれらのメソッドの使用には影響しませんが、メソッドがangularでデフォルトで解決するのを待つ場合には追加の利点がありますangular element not foundまたはstate element reference exceptionsなどの場合のエラーを回避するのに役立ちます...

34
Girish Sortur

どちらが好まれるかは言えませんが、ソースコードを見つけて調べることができました。

ドキュメントによると、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;
  });
};

Elm.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;
    }
  });
};

Elm.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();
};
3
JeffC