UNPKG

@assert-equals/dappdriver

Version:

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

150 lines (149 loc) 5.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebDriverPageObject = void 0; const selenium_webdriver_1 = require("selenium-webdriver"); const dapp_driver_1 = require("../session/dapp-driver"); const utils_1 = require("../utils"); class WebDriverPageObject { driver; url; title; constructor() { this.driver = dapp_driver_1.DappDriver.Instance.Driver; } async addCookie(cookie) { return await this.driver.manage().addCookie(cookie); } async back(page) { await this.driver.navigate().back(); return await dapp_driver_1.DappDriver.getPage(page); } async clearCookie(name) { return await this.driver.manage().deleteCookie(name); } async clearCookies() { return await this.driver.manage().deleteAllCookies(); } async close(page) { await this.driver.close(); return await dapp_driver_1.DappDriver.getPage(page); } async closeAndSwitchToWindow(page) { const windowHandles = await this.getAllWindowHandles(); await this.driver.close(); return await this.waitAndSwitchToWindow(page, windowHandles.length - 1, utils_1.isAtMost); } async executeScript(script) { script = script.startsWith('return ') ? script : ''.concat('return ', script); return await this.driver.executeScript(script); } async executeScriptAndSwitchToWindow(script, page) { this.driver.executeScript(script); return await this.waitAndSwitchToWindow(page); } async forward(page) { await this.driver.navigate().forward(); return await dapp_driver_1.DappDriver.getPage(page); } async getAllWindowHandles() { return await this.driver.getAllWindowHandles(); } async getCookie(name) { let cookie = null; try { cookie = await this.driver.manage().getCookie(name); } catch (e) { } return cookie; } async getCookies() { return await this.driver.manage().getCookies(); } async getCurrentUrl() { return await this.driver.getCurrentUrl(); } async getPageSource() { return await this.driver.getPageSource(); } async getTitle() { return await this.driver.getTitle(); } async getWindowHandle() { return await this.driver.getWindowHandle(); } async maximize() { await this.driver.manage().window().maximize(); } async navigateTo(url, page) { await this.driver.navigate().to(url); return await dapp_driver_1.DappDriver.getPage(page); } async navigateToPageInNewWindow(url, page) { await this.driver.switchTo().newWindow('tab'); const windowHandles = await this.getAllWindowHandles(); await this.driver.switchTo().window(windowHandles.at(-1)); return await this.navigateTo(url, page); } async refresh(page) { await this.driver.navigate().refresh(); return await dapp_driver_1.DappDriver.getPage(page); } async setSize(width, height) { await this.driver.manage().window().setSize(width, height); } async switchBack() { return await this.driver.switchTo().defaultContent(); } async switchToFrame(cssLocator) { const frameElement = await this.driver.findElement({ css: cssLocator }); return await this.driver.switchTo().frame(frameElement); } 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 { await this.driver.switchTo().window(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.driver.wait(selenium_webdriver_1.until.elementLocated({ css: cssLocator }), 20000); } async waitForTitle(title) { await this.driver.wait(selenium_webdriver_1.until.titleMatches(title), 20000); } async waitForURL(url) { await this.driver.wait(selenium_webdriver_1.until.urlMatches(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.WebDriverPageObject = WebDriverPageObject;