You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cypress自动化测试如何自动填充MetaMask扩展助记词与密码

Cypress 加载MetaMask扩展自动初始化/解锁配置方案

方案一:预置扩展持久化数据(稳定性优先,推荐)

核心逻辑是提前把初始化完成、已经导入测试账户的MetaMask本地数据打包,每次Cypress启动浏览器时直接把数据塞到对应扩展目录,完全跳过初始化、解锁的手动操作环节,启动速度和稳定性远高于页面模拟点击。

  • 前置准备:
    1. 先运行现有配置启动Cypress Chrome实例,手动完成一次MetaMask初始化:导入固定测试助记词、设置统一测试密码(比如TestPass123!),提前配置好测试需要的网络、授权状态,确认扩展功能正常。
    2. 找到当前Cypress Chrome实例的MetaMask数据存储目录:Windows系统路径在临时目录下,格式为%TEMP%\cypress\cy\chrome-<随机串>\Default\Local Extension Settings\nkbihfnoocbhegkpmmjlgojdbipdcdemg,其中nkbihfnoocbhegkpmmjlgojdbipdcdemg是MetaMask官方固定扩展ID,目录内的文件就是所有本地加密存储的钱包数据。
    3. 把这个目录下的所有文件复制到项目内固定路径,比如./cypress/fixtures/metamask-data。
  • 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:06:16