dAppeteer
E2E testing for dApps using Puppeteer + MetaMask
Installation
$ npm install -s @nodefactory/dappeteer
$ yarn add @nodefactory/dappeteer
Usage
import puppeteer from 'puppeteer';
import dappeteer from '@nodefactory/dappeteer';
async function main() {
const browser = await dappeteer.launch(puppeteer);
const metamask = await dappeteer.setupMetamask(browser);
// you can change the network if you want
await metamask.switchNetwork('ropsten');
// go to a dapp and do something that prompts MetaMask to confirm a transaction
const page = await browser.newPage();
await page.goto('http://my-dapp.com');
const payButton = await page.$('#pay-with-eth');
await payButton.click();
// 🏌
await metamask.confirmTransaction();
}
main();
API
-
dappeteer.launch(puppeteer[, launchOptions])
: returns an instance ofbrowser
, same aspuppeteer.launch
, but it also installs the MetaMask extension. It supports all the regularpuppeteer.launch
options as a second argument with the addition of:-
metamaskVersion
: Metamask plugin version (by default it uses latest)
-
-
dappeteer.setupMetamask(browser[, {seed, password}])
: returns a promise that resolves to an object that allows you to interact with MetaMask by using the following methods:-
metamask.switchAccount(accountIndex)
: it commands MetaMask to switch to a different account, by passing the index/position of the account in the accounts list. -
metamask.importPK(privateKey)
: it commands MetaMask to import an private key. It can only be used while you haven't signed in yet, otherwise it throws. -
metamask.lock()
: signs out from MetaMask. It can only be used if you arelady signed it, otherwise it throws. -
metamask.unlock([password])
: it unlocks the MetaMask extension. It can only be used in you locked/signed out before, otherwise it throws. The password is optional, it defaults topassword1234
. -
metamask.switchNetwork(networkName)
: it changes the current selected network.networkName
can take the following values:"main"
,"ropsten"
,"rinkeby"
,"kovan"
,"localhost"
. -
metamask.addNetwork({ networkName, rpc, chainId[, symbol, explorer]})
: it adds a custom network to MetaMask. -
metamask.confirmTransaction([{ gas, gasLimit }])
: commands MetaMask to submit a transaction. For this to work MetaMask has to be in a transaction confirmation state (basically promting the user to submit/reject a transaction). You can (optionally) pass an object withgas
and/orgasLimit
, by default they are20
and50000
respectively. -
metamask.sign()
: commands MetaMask to sign a message. For this to work MetaMask must be in a sign confirmation state. -
metamask.approve()
: enables the app to connect to MetaMask account in privacy mode
-