@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
JavaScript
"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;