dAppeteer
E2E testing for dApps using Puppeteer + MetaMask
Installation
$ npm install -s @chainsafe/dappeteer
$ yarn add @chainsafe/dappeteer
Usage
import dappeteer from '@chainsafe/dappeteer';
async function main() {
const { metaMask, browser } = await dappeteer.bootstrap();
const dappPage = await browser.newPage();
await dappPage.goto('http://my-dapp.com');
await metaMask.switchNetwork('goerli');
const addTokenButton = await dappPage.$('#add-token');
await addTokenButton.click();
await metaMask.acceptAddToken();
const payButton = await dappPage.$('#pay-with-eth');
await payButton.click();
await metaMask.confirmTransaction();
}
main();
Usage with Snaps
import dappeteer from '@chainsafe/dappeteer';
import { exec } from "child_process";
async function buildSnap(): Promise<string> {
console.log(`Building my-snap...`);
await new Promise((resolve, reject) => {
exec(`cd ./my-snap && npx mm-snap build`, (error, stdout) => {
if (error) {
reject(error);
return;
}
resolve(stdout);
});
});
return "./my-snap";
}
async function main() {
const builtSnapDir = await buildSnap()
const { metaMask, snapId, browser } = await dappeteer.initSnapEnv({
snapIdOrLocation: builtSnapDir,
});
const dappPage = await browser.newPage();
await dappPage.goto('http://example.org/');
await metaMask.snaps.invokeSnap(dappPage, snapId, "my-method")
await metaMask.snaps.dialog.positive();
const emitter = await metaMask.snaps.getNotificationEmitter();
const notificationPromise = emitter.waitForNotification();
await metaMask.snaps.invokeSnap(dappPage, snapId, "notify");
await notificationPromise;
const notifications = await metaMask.snaps.getAllNotifications();
}
main();