在量angular器中,browser.isElementPresent vs element.isPresent vs element.isElementPresent
在量angular器中,基本上有三种方法来检查元素是否存在:
var elm = element(by.id("myid")); browser.isElementPresent(elm); elm.isPresent(); elm.isElementPresent();
这些select是否相同和可以互换,哪一个应该普遍受欢迎?
所有function都以类似的方式具有细微的差异。 这里有一些差异,我发现 –
elm.isPresent()
–
- 是
ElementFinder
的扩展,因此在执行任何操作之前等待Angular在页面上解决。 - 当
elm
是一个element(locator)
或者ElementFinder
而不是ElementArrayFinder
时,它是有效的。 如果使用指定的locator
返回多个元素,则检查第一个元素是否在DOM中为isEnabled()
。 不采取任何参数作为input。 - 最适合于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度页面上testing时首选使用。
以上所有内容都检查DOM中是否存在元素,并返回boolean
结果。 尽pipeangular度和非angular度特征不影响这些方法的使用,但是当方法等待angular度稳定时,默认情况下还有一个额外的优点,并且有助于在angular度类似元素未find或状态元素引用例外的情况下避免错误,等等…
我不能说哪一个是首选,但我能find源代码并检查它。
根据文档, elm.isPresent()
和elm.isElementPresent()
是等价的。 希望有所帮助。
量angular器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. ie `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(); };
您可以使用isPresent函数检查元素是否存在。
所以,你的代码会是这样的:
var myElement = element(by.css('.elementClass')); expect(myElement.isPresent()).toBeFalsy();
这里是isPresent函数的量angular器文档。