UNPKG

@assert-equals/dappdriver

Version:

DappDriver is an e2e testing framework designed for testing decentralized applications (dApps) using MetaMask, Rainbow or Zerion

159 lines (158 loc) 6.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PlaywrightPageObject = void 0; const page_1 = require("../page"); const dapp_driver_1 = require("../session/dapp-driver"); const utils_1 = require("../utils"); class PlaywrightPageObject { page; driver; pageObject; url; title; constructor(page) { this.initialize(page); this.driver = dapp_driver_1.DappDriver.Instance.Driver; this.pageObject = new page_1.PageObject(); } initialize(page) { this.page = page; dapp_driver_1.DappDriver.Instance.Page = this.page; } async addCookie(cookie) { return await this.driver.addCookies([cookie]); } async back(page) { await this.page.goBack(); return await dapp_driver_1.DappDriver.getPage(page); } async clearCookie(name) { return await this.driver.clearCookies({ name }); } async clearCookies() { return await this.driver.clearCookies(); } async close(page) { await this.page.close(); return await dapp_driver_1.DappDriver.getPage(page); } async closeAndSwitchToWindow(page) { const windowHandles = await this.getAllWindowHandles(); await this.page.close(); return await this.waitAndSwitchToWindow(page, windowHandles.length - 1, utils_1.isAtMost); } async executeScript(script) { return await this.page.evaluate(script); } async executeScriptAndSwitchToWindow(script, page) { this.page.evaluate(script); return await this.waitAndSwitchToWindow(page); } async forward(page) { await this.page.goForward(); return await dapp_driver_1.DappDriver.getPage(page); } async getAllWindowHandles() { return await Promise.resolve(this.driver.pages()); } async getCookie(name) { const url = await this.getCurrentUrl(); const origin = new URL(url).origin; const cookies = await this.driver.cookies(origin); const [cookie] = cookies.filter((cookie) => cookie.name === name); return cookie || null; } async getCookies() { const url = await this.getCurrentUrl(); const origin = new URL(url).origin; return await this.driver.cookies(origin); } async getCurrentUrl() { return await Promise.resolve(this.page.url()); } async getPageSource() { return await this.page.content(); } async getTitle() { return await this.page.title(); } async getWindowHandle() { return await Promise.resolve(this.page); } async maximize() { const { width, height } = await this.executeScript('window.screen'); await this.page.setViewportSize({ width, height }); } async navigateTo(url, page) { await this.page.goto(url); return await dapp_driver_1.DappDriver.getPage(page); } async navigateToPageInNewWindow(url, page) { await this.driver.newPage(); const windowHandles = await this.getAllWindowHandles(); this.initialize(windowHandles.at(-1)); return await this.navigateTo(url, page); } async refresh(page) { await this.page.reload(); return await dapp_driver_1.DappDriver.getPage(page); } async setSize(width, height) { await this.page.setViewportSize({ width, height }); } async switchBack() { dapp_driver_1.DappDriver.Instance.Frame = null; } async switchToFrame(cssLocator) { const frame = this.page.frameLocator(cssLocator); dapp_driver_1.DappDriver.Instance.Frame = frame; } async switchToWindow(page) { const delay = 1000; const retries = 60; for (let attempt = 1; attempt <= retries; attempt++) { const windowHandles = await this.getAllWindowHandles(); for (const handle of windowHandles) { try { this.initialize(handle); const actualTitle = await this.getTitle(); const actualUrl = await this.getCurrentUrl(); const newPage = new page(); const title = (0, utils_1.toRegExp)(newPage.title); const url = (0, utils_1.toRegExp)(newPage.url); if (RegExp(title).exec(actualTitle) !== null && RegExp(url).exec(actualUrl) !== null) { return await dapp_driver_1.DappDriver.getPage(page); } } catch (e) { } } await dapp_driver_1.DappDriver.sleep(delay); } throw new Error('switchToMatchingWindow timed out finding a matching window'); } async waitAndSwitchToWindow(page, total = 2, comparator = utils_1.isAtLeast) { await this.waitForWindows(total, comparator); return await this.switchToWindow(page); } async waitForElement(cssLocator) { await this.pageObject.waitForFunction(async () => (await this.page.locator(cssLocator).count()) > 0, `Waiting for element to be located ${cssLocator}`); } async waitForTitle(title) { await this.pageObject.waitForFunction(async () => RegExp(title).exec(await this.getTitle()) !== null, `Waiting for title to match ${title}`, 20000); } async waitForURL(url) { await this.pageObject.waitForFunction(async () => RegExp(url).exec(await this.getCurrentUrl()) !== null, `Waiting for url to match ${url}`, 20000); } async waitForWindows(total, comparator) { const delay = 1000; const retries = 10; for (let attempt = 1; attempt <= retries; attempt++) { const windowHandles = await this.getAllWindowHandles(); if (comparator(windowHandles.length, total)) return; await dapp_driver_1.DappDriver.sleep(delay); } throw new Error('waitForWindows timed out polling window handles'); } } exports.PlaywrightPageObject = PlaywrightPageObject;