使用Synpress进行E2E测试时MetaMask通知不弹出的问题求助
问题分析与解决方案
你遇到的是Synpress测试时MetaMask交易通知不弹出,但手动能在活动栏看到请求的问题,核心原因通常和自动化环境的焦点、权限、延迟或兼容性有关,以下是具体排查和解决方法:
1. 窗口焦点抢占导致弹窗不显示
自动化测试时Cypress控制的页面窗口默认占据焦点,MetaMask的交易弹窗需要焦点才会主动弹出,而非仅在活动栏显示。
- 解决方法:触发交易后切换到MetaMask窗口再执行确认:
// 触发合约交易 contract.createToken(metadata, selectedAddresses, { from: address, gasLimit: GAS_LIMIT }); // 切换到MetaMask扩展窗口 cy.switchToMetamaskWindow(); // 确认交易 cy.confirmMetamaskTransaction().then((txData) => { expect(txData).not.to.be.null; expect(txData.confirmed).to.be.true; }); // 切回测试页面窗口 cy.switchToCypressWindow();
2. 测试环境禁用了通知权限
Chrome在自动化模式下会默认限制扩展的通知权限,导致MetaMask无法弹出通知弹窗。
- 解决方法:在Synpress配置文件(
synpress.config.js)中添加允许通知的启动参数:
module.exports = { browsers: [ { name: 'chrome', browser: 'chrome', options: { args: [ '--disable-extensions-except=./node_modules/@synthetixio/synpress/metamask', // 对应你的MetaMask扩展路径 '--load-extension=./node_modules/@synthetixio/synpress/metamask', '--enable-notifications', '--no-default-browser-check' ] } } ] };
3. 交易触发后等待时间不足
自动化测试执行速度快,MetaMask还没完成交易请求的加载,就执行了确认命令,导致找不到弹窗。
- 解决方法:在交易触发后添加合理等待,或者监听MetaMask的状态:
// 触发交易 contract.createToken(metadata, selectedAddresses, { from: address, gasLimit: GAS_LIMIT }); // 等待MetaMask处理请求,时间根据实际情况调整 cy.wait(1500); // 执行确认 cy.confirmMetamaskTransaction().then((txData) => { expect(txData).not.to.be.null; expect(txData.confirmed).to.be.true; });
4. Synpress与MetaMask版本不兼容
不同版本的Synpress和MetaMask扩展可能存在适配问题,导致弹窗逻辑失效。
- 解决方法:检查Synpress官方文档,确认推荐的MetaMask版本,比如Synpress v1.x通常适配MetaMask v10.18.x左右的版本,下载对应版本的扩展包并在配置中指定加载路径。
5. MetaMask测试环境配置异常
测试环境的MetaMask可能默认关闭了通知弹窗,或者处于锁定状态,导致弹窗不显示。
- 解决方法:在测试初始化阶段配置MetaMask的通知设置:
beforeEach(() => { cy.visit('/'); // 解锁MetaMask cy.setupMetamask('your-test-password'); // 切换到MetaMask窗口开启通知 cy.switchToMetamaskWindow(); cy.get('[data-testid="settings-button"]').click(); cy.contains('Notifications').click(); cy.get('[data-testid="enable-notifications-toggle"]').click({ force: true }); // 切回测试页面 cy.switchToCypressWindow(); });
内容的提问来源于stack exchange,提问作者Invictus
相关产品推荐
相关产品推荐

