@serenity-js/web
Version:
Serenity/JS Screenplay Pattern library offering a flexible, web driver-agnostic approach for interacting with web-based user interfaces and components, suitable for various testing contexts
125 lines • 4.51 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CssClasses = void 0;
const core_1 = require("@serenity-js/core");
const models_1 = require("../models");
/**
* Uses the [actor's](https://serenity-js.org/api/core/class/Actor/) [ability](https://serenity-js.org/api/core/class/Ability/) to [`BrowseTheWeb`](https://serenity-js.org/api/web/class/BrowseTheWeb/) to retrieve
* a list of [CSS classes](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-class)
* of a given [`PageElement`](https://serenity-js.org/api/web/class/PageElement/).
*
* ## Example widget
*
* ```html
* <ul id="shopping-list" class="active favourite">
* <li class="bought">Coffee<li>
* <li class="buy">Honey<li>
* <li class="buy">Chocolate<li>
* </ul>
* ```
*
* ## Retrieve CSS classes of a given [`PageElement`](https://serenity-js.org/api/web/class/PageElement/)
*
* ```ts
* import { actorCalled } from '@serenity-js/core'
* import { Ensure, equals } from '@serenity-js/assertions'
* import { By, CssClasses, PageElement } from '@serenity-js/web'
*
* const shoppingList = () =>
* PageElement.located(By.css('#shopping-list'))
* .describedAs('shopping list')
*
* await actorCalled('Lisa')
* .attemptsTo(
* Ensure.that(
* CssClasses.of(shoppingList()),
* equals([ 'active', 'favourite' ])
* ),
* )
* ```
*
* ## Using CssClasses as [`QuestionAdapter`](https://serenity-js.org/api/core/#QuestionAdapter)
*
* ```ts
* import { actorCalled } from '@serenity-js/core'
* import { Ensure, equals } from '@serenity-js/assertions'
* import { By, CssClasses, PageElement } from '@serenity-js/web'
*
* const shoppingList = () =>
* PageElement.located(By.css('#shopping-list'))
* .describedAs('shopping list')
*
* await actorCalled('Lisa')
* .attemptsTo(
* Ensure.that(
* CssClasses.of(shoppingList()).length,
* equals(2)
* ),
* Ensure.that(
* CssClasses.of(shoppingList())[0],
* equals('active')
* ),
* )
* ```
*
* ## Using as filter in [Page Element Query Language](https://serenity-js.org/handbook/web-testing/page-element-query-language/)
*
* ```ts
* import { actorCalled } from '@serenity-js/core'
* import { Ensure, contain } from '@serenity-js/assertions'
* import { By, CssClasses, PageElement } from '@serenity-js/web'
*
* class ShoppingList {
* static items = () =>
* PageElements.located(By.css('#shopping-list li'))
* .describedAs('items')
*
* static outstandingItems = () =>
* ShoppingList.items()
* .where(CssClasses, contain('buy'))
* }
*
* await actorCalled('Lisa')
* .attemptsTo(
* Ensure.that(
* Text.ofAll(ShoppingList.outstandingItems()),
* equals([ 'Honey', 'Chocolate' ])
* ),
* )
* ```
*
* ## Learn more
* - [`BrowseTheWeb`](https://serenity-js.org/api/web/class/BrowseTheWeb/)
* - [`MetaQuestion`](https://serenity-js.org/api/core/interface/MetaQuestion/)
* - [`QuestionAdapter`](https://serenity-js.org/api/core/#QuestionAdapter)
* - [`Question`](https://serenity-js.org/api/core/class/Question/)
*
* @group Questions
*/
class CssClasses {
/**
* Instantiates a [`Question`](https://serenity-js.org/api/core/class/Question/) that uses
* the [actor's](https://serenity-js.org/api/core/class/Actor/) [ability](https://serenity-js.org/api/core/class/Ability/) to [`BrowseTheWeb`](https://serenity-js.org/api/web/class/BrowseTheWeb/) to retrieve
* a list of [CSS classes](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-class)
* of a given [`PageElement`](https://serenity-js.org/api/web/class/PageElement/).
*
* #### Learn more
* - [`MetaQuestion`](https://serenity-js.org/api/core/interface/MetaQuestion/)
*
* @param pageElement
*/
static of(pageElement) {
return core_1.Question.about((0, core_1.the) `CSS classes of ${pageElement}`, async (actor) => {
const element = await actor.answer(pageElement);
return element.attribute('class')
.then(attribute => attribute ?? '')
.then(attribute => attribute
.replace(/\s+/, ' ')
.trim()
.split(' ')
.filter(cssClass => !!cssClass));
}, (parent) => CssClasses.of(models_1.PageElement.of(pageElement, parent)));
}
}
exports.CssClasses = CssClasses;
//# sourceMappingURL=CssClasses.js.map