分度器では、基本的に、要素が存在するかどうかを確認する3つの方法があります。
var Elm = element(by.id("myid"));
browser.isElementPresent(Elm);
Elm.isPresent();
Elm.isElementPresent();
これらのオプションは同等で互換性があり、一般的にどのオプションが優先されるべきですか?
すべてが同様に機能し、微妙な違いがあります。ここに私が見つけたいくつかの違いがあります-
ElementFinder
の拡張であるため、 Angularを待つ は、アクションを実行する前にページに収まります。Elm
がElementFinder
ではなくelement(locator)
またはElementArrayFinder
である場合に機能します。指定されたlocator
を使用して複数の要素が返される場合、最初の要素がDOMでisEnabled()
かどうかがチェックされます。入力としてパラメーターを取りません。Elm.isElementPresent(subLoc)
Elm
へのサブロケーターがある場合)
ElementFinder
の拡張であるため、アクションを実行する前にAngular=がページに収まるのを待ちます。Elm
にパラメータとして_sub locator
_を取ります。 (これとElm.isPresent()
との違いのみ)---(browser.isElementPresent(element || Locator)
-
webdriver
の実装であるため、angularが確定するのを待ちません。locator
またはelement
をパラメーターとして受け取り、同じロケーターを使用して複数の要素が見つかった場合は最初の結果を使用します。上記のすべては、DOMの要素の存在をチェックし、boolean
の結果を返します。ただし、angularおよび非角度機能はこれらのメソッドの使用には影響しませんが、メソッドがangularでデフォルトで解決するのを待つ場合には追加の利点がありますangular element not foundまたはstate element reference exceptionsなどの場合のエラーを回避するのに役立ちます...
どちらが好まれるかは言えませんが、ソースコードを見つけて調べることができました。
ドキュメントによると、Elm.isPresent()
とElm.isElementPresent()
は同等です。お役に立てば幸いです。
タイトルのすぐ右に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();
};