UNPKG

@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

100 lines 3.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BrowsingSession = void 0; /** * Represents the pages open in the current browsing context. * * You'll need to use this class directly only if you're planning to integrate Serenity/JS * with a new Web integration tool. * * @group Models */ class BrowsingSession { currentBrowserPage; pages = new Map(); async closePagesOtherThan(pageOfInterest) { for (const page of await this.allPages()) { if (!page.id.equals(pageOfInterest.id)) { await page.close(); this.pages.delete(page.id); } } await this.changeCurrentPageTo(pageOfInterest); } /** * Returns a [`Page`](https://serenity-js.org/api/web/class/Page/) representing the currently active top-level browsing context. */ async currentPage() { if (!this.currentBrowserPage || !await this.currentBrowserPage.isPresent()) { this.currentBrowserPage = await this.registerCurrentPage(); } return this.currentBrowserPage; } /** * Registers specified [pages](https://serenity-js.org/api/web/class/Page/) to be managed by this [`BrowsingSession`](https://serenity-js.org/api/web/class/BrowsingSession/). * * @param pages */ register(...pages) { for (const page of pages) { this.pages.set(page.id, page); } } /** * Informs this [`BrowsingSession`](https://serenity-js.org/api/web/class/BrowsingSession/) that it should no longer manage [pages](https://serenity-js.org/api/web/class/Page/) * identified by the given `pageIds`. * * @param pageIds */ deregister(...pageIds) { for (const pageId of pageIds) { this.pages.delete(pageId); } } /** * Returns a [pages](https://serenity-js.org/api/web/class/Page/) representing all the available * top-level browsing context, e.g. all the open browser tabs. */ async allPages() { return Array.from(this.pages.values()); } /** * Returns the ids of any [pages](https://serenity-js.org/api/web/class/Page/) this [`BrowsingSession`](https://serenity-js.org/api/web/class/BrowsingSession/) is aware of. */ registeredPageIds() { return Array.from(this.pages.keys()); } /** * Informs the [`BrowsingSession`](https://serenity-js.org/api/web/class/BrowsingSession/) that the "current page" has changed to `page`. * * Please note that different Web integration tools have a different definition of what a "current page" is. * For example, Selenium or WebdriverIO use a single "focused" window that a developer * needs to explicitly "switch to" in their tests in order to interact with it. * This is similar to how a regular user would interact with Web pages; * switching from one tab to another, but not interacting with more than one * window/tab simultaneously. * * Playwright and Puppeteer, on the other hand, don't have a concept of the "current" page at all, since they * allow the developer to interact with multiple open tabs/windows at the same time. * * Web integration-specific implementations of this class should override this method to define * how the concept of the "current page" should be interpreted by Serenity/JS. * * @param page */ async changeCurrentPageTo(page) { this.currentBrowserPage = page; } /** * Closes all the pages available in this browsing context */ async closeAllPages() { for (const page of this.pages.values()) { await page.close(); } this.pages.clear(); this.currentBrowserPage = undefined; } } exports.BrowsingSession = BrowsingSession; //# sourceMappingURL=BrowsingSession.js.map