В транспортнике, browser.isElementPresent vs element.isPresent vs element.isElementPresent
В транспортимере есть, в основном, три способа проверить, присутствует ли элемент:
var elm = element(by.id("myid"));
browser.isElementPresent(elm);
elm.isPresent();
elm.isElementPresent();
Являются ли эти варианты эквивалентными и взаимозаменяемыми, и какой из них должен быть вообще предпочтительным?
Ответы
Ответ 1
Все функции аналогичны с небольшими различиями. Вот несколько отличий, которые я нашел -
elm.isPresent()
-
- Является расширением
ElementFinder
, и поэтому ждет Angular для установки на странице перед выполнением каких-либо действий.
- Это работает, когда
elm
является element(locator)
или ElementFinder
, а не ElementArrayFinder
. Если несколько элементов возвращаются с использованием указанного locator
, то первый элемент проверяется, если он isEnabled()
в DOM. Не принимает никаких параметров в качестве входных данных.
- Лучше всего работает с страницами Angular и Angular.
- Первое предпочтение использования, когда есть необходимость найти, присутствует ли элемент.
elm.isElementPresent(subLoc)
- (Когда есть суб-локатор elm
)
- Является расширением
ElementFinder
и поэтому ждет, пока Angular установится на странице перед выполнением каких-либо действий.
- Используется для проверки наличия элементов, которые являются вспомогательными элементами родителя. Для параметра
elm
требуется взять sub locator
в качестве параметра. (только разница между этим и elm.isPresent()
)
- Лучше всего работает с страницами Angular и Angular.
- Первое предпочтение использования, когда есть необходимость проверить, присутствует ли дополнительный элемент родителя.
browser.isElementPresent(element || Locator)
-
- Является реализацией
webdriver
и поэтому не ждет завершения Angular.
- В качестве параметра принимает
locator
или element
и использует первый результат, если несколько элементов расположены с использованием одного и того же локатора.
- Лучше всего использовать страницы без Angular.
- Первое предпочтение следует использовать при тестировании на страницах без Angular.
Все вышеперечисленные проверки на наличие элемента в DOM и возврат результата boolean
. Хотя функции Angular и не Angular не влияют на использование этих методов, но есть дополнительное преимущество, когда метод ожидает, что Angular установится по умолчанию и поможет избежать ошибок в случае Angular подобного элемента не найдены или исключены ссылки на элементы элемента элемента и т.д.
Ответ 2
Я не могу говорить, какой из них предпочтительнее, но я смог найти исходный код и изучить его.
В соответствии с документами elm.isPresent()
и elm.isElementPresent()
эквивалентны. Надеюсь, что это поможет.
Документы API-интерфейса транспортира
Существует ссылка на View code
справа от названия.
browser.isElementPresent(ильм);
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
Вы можете проверить, присутствует ли элемент или нет, используя функцию isPresent.
Итак, ваш код будет примерно таким:
var myElement = element(by.css('.elementClass'));
expect(myElement.isPresent()).toBeFalsy();
Здесь - документы транспортира для функции isPresent.