Cypress自动化测试如何自动填充MetaMask扩展助记词与密码
Cypress 加载MetaMask扩展自动初始化/解锁配置方案
方案一:预置扩展持久化数据(稳定性优先,推荐)
核心逻辑是提前把初始化完成、已经导入测试账户的MetaMask本地数据打包,每次Cypress启动浏览器时直接把数据塞到对应扩展目录,完全跳过初始化、解锁的手动操作环节,启动速度和稳定性远高于页面模拟点击。
- 前置准备:
- 先运行现有配置启动Cypress Chrome实例,手动完成一次MetaMask初始化:导入固定测试助记词、设置统一测试密码(比如
TestPass123!),提前配置好测试需要的网络、授权状态,确认扩展功能正常。 - 找到当前Cypress Chrome实例的MetaMask数据存储目录:Windows系统路径在临时目录下,格式为
%TEMP%\cypress\cy\chrome-<随机串>\Default\Local Extension Settings\nkbihfnoocbhegkpmmjlgojdbipdcdemg,其中nkbihfnoocbhegkpmmjlgojdbipdcdemg是MetaMask官方固定扩展ID,目录内的文件就是所有本地加密存储的钱包数据。 - 把这个目录下的所有文件复制到项目内固定路径,比如
./cypress/fixtures/metamask-data。
- 先运行现有配置启动Cypress Chrome实例,手动完成一次MetaMask初始化:导入固定测试助记词、设置统一测试密码(比如
- 修改
cypress.config.ts配置,在浏览器启动时自动挂载预置数据:
import { defineConfig } from 'cypress' import path from 'path' import fs from 'fs-extra' export default defineConfig({ e2e: { setupNodeEvents(on, config) { on('before:browser:launch', (browser = {}, launchOptions) => { // 仅Chrome系浏览器支持该配置,Electron不兼容 if (browser.family === 'chromium' && browser.name !== 'electron') { // 加载本地MetaMask扩展 launchOptions.extensions.push('D:/Research/META3/metamask-chrome-10.15.0') // 挂载预置的MetaMask用户数据 const presetDataPath = path.resolve(__dirname, './cypress/fixtures/metamask-data') const userDataArg = launchOptions.args.find(arg => arg.startsWith('--user-data-dir=')) if (userDataArg) { const userDataDir = userDataArg.split('=')[1] const targetDataPath = path.join( userDataDir, 'Default/Local Extension Settings/nkbihfnoocbhegkpmmjlgojdbipdcdemg' ) fs.ensureDirSync(targetDataPath) fs.copySync(presetDataPath, targetDataPath) } // 添加启动参数绕过扩展安全校验 launchOptions.args.push('--disable-features=ExtensionsToolbarMenu') } return launchOptions }) return config }, } })
注意:升级MetaMask扩展版本后需要重新手动初始化一次,重新导出预置数据,避免版本不兼容导致数据加载失败。
方案二:扩展页面自动填充(灵活度优先,适合多账户切换场景)
如果需要动态切换助记词、测试不同钱包状态,可以直接在测试钩子中访问MetaMask的扩展页面,根据页面状态自动填写助记词/密码完成初始化/解锁。
- 在Cypress全局支持文件
cypress/support/e2e.ts中添加全局前置钩子:
// 测试用固定配置,可根据用例动态修改 const TEST_SRP = '替换为你的12位测试助记词 空格分隔' const TEST_PASSWORD = 'TestPass123!' beforeEach(() => { // 访问MetaMask扩展后台页 cy.visit('chrome-extension://nkbihfnoocbhegkpmmjlgojdbipdcdemg/home.html') cy.get('body').then($page => { // 场景1:处于解锁页,自动填密码解锁 if ($page.find('#password').length) { cy.get('#password').type(TEST_PASSWORD) cy.get('button[type="submit"]').click() } // 场景2:处于首次初始化页,自动导入助记词完成初始化 else if ($page.find('[data-testid="import-wallet-button"]').length) { cy.get('[data-testid="import-wallet-button"]').click() cy.get('[data-testid="agree-terms-button"]').click() // 填充12位助记词 TEST_SRP.split(' ').forEach((word, index) => { cy.get(`#import-srp__srp-word-${index}`).type(word) }) cy.get('[data-testid="import-srp-confirm"]').click() // 设置密码 cy.get('#create-password').type(TEST_PASSWORD) cy.get('#confirm-password').type(TEST_PASSWORD) cy.get('[data-testid="create-password-terms"]').click() cy.get('[data-testid="create-password-import"]').click() // 跳过引导页 cy.get('[data-testid="onboarding-complete-done"]').click() cy.get('[data-testid="pin-extension-next"]').click() cy.get('[data-testid="pin-extension-done"]').click() } }) // 钱包就绪后跳转回待测站点 cy.visit('替换为你的区块链站点测试地址') })
注意:不同MetaMask版本的页面选择器可能存在差异,如果你使用的10.15.0版本和示例选择器不匹配,手动打开扩展页检查元素属性替换即可。
方案对比
- 预置数据方案:启动速度快,无页面等待开销,稳定性最高,适合固定环境的日常回归测试。
- 页面自动填充方案:无需提前准备预置数据,支持动态切换测试账户/助记词,适合多场景用例覆盖,缺点是每次启动需要额外等待页面加载,版本迭代时需要同步更新选择器。
内容的提问来源于stack exchange,提问作者hunglv_54
相关产品推荐
相关产品推荐

