1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-27 04:46:10 +01:00
metamask-extension/test/e2e/webdriver/firefox.js
Mark Stacey 12fb5ad985 Refactor webdriver setup (#7690)
The setup for each browser web driver instance has been extracted from
`helpers.js` and moved to the `webdriver` directory.
2019-12-11 11:14:58 -08:00

100 lines
2.9 KiB
JavaScript

const fs = require('fs')
const os = require('os')
const path = require('path')
const { Builder, By, until } = require('selenium-webdriver')
const firefox = require('selenium-webdriver/firefox')
const { Command } = require('selenium-webdriver/lib/command')
/**
* The prefix for temporary Firefox profiles. All Firefox profiles used for e2e tests
* will be created as random directories inside this.
* @type {string}
*/
const TEMP_PROFILE_PATH_PREFIX = path.join(os.tmpdir(), 'MetaMask-Fx-Profile')
const GeckoDriverCommand = {
INSTALL_ADDON: 'install addon',
}
/**
* A wrapper around a {@code WebDriver} instance exposing Firefox-specific functionality
*/
class FirefoxDriver {
/**
* Builds a {@link FirefoxDriver} instance
* @param {{extensionPath: string}} options the options for the build
* @return {Promise<{driver: !ThenableWebDriver, extensionUrl: string, extensionId: string}>}
*/
static async build ({ extensionPath, responsive }) {
const templateProfile = fs.mkdtempSync(TEMP_PROFILE_PATH_PREFIX)
const profile = new firefox.Profile(templateProfile)
const options = new firefox.Options()
.setProfile(profile)
const driver = new Builder()
.forBrowser('firefox')
.setFirefoxOptions(options)
.build()
const fxDriver = new FirefoxDriver(driver)
await fxDriver.init()
const extensionId = await fxDriver.installExtension(extensionPath)
const internalExtensionId = await fxDriver.getInternalId()
if (responsive) {
driver.manage().window().setSize(320, 600)
}
return {
driver,
extensionId,
extensionUrl: `moz-extension://${internalExtensionId}/home.html`,
}
}
/**
* @constructor
* @param {!ThenableWebDriver} driver a {@code WebDriver} instance
*/
constructor (driver) {
this._driver = driver
}
/**
* Initializes the driver
* @return {Promise<void>}
*/
async init () {
await this._driver.getExecutor()
.defineCommand(
GeckoDriverCommand.INSTALL_ADDON,
'POST',
'/session/:sessionId/moz/addon/install',
)
}
/**
* Installs the extension at the given path
* @param {string} addonPath the path to the unpacked extension or XPI
* @return {Promise<string>} the extension ID
*/
async installExtension (addonPath) {
const cmd = new Command(GeckoDriverCommand.INSTALL_ADDON)
.setParameter('path', path.resolve(addonPath))
.setParameter('temporary', true)
return await this._driver.schedule(cmd)
}
/**
* Returns the Internal UUID for the given extension
* @return {Promise<string>} the Internal UUID for the given extension
*/
async getInternalId () {
await this._driver.get('about:debugging#addons')
return await this._driver.wait(until.elementLocated(By.xpath('//dl/div[contains(., \'Internal UUID\')]/dd')), 1000).getText()
}
}
module.exports = FirefoxDriver