如何使用Playwright(Python)与MetaMask交互并实现自动化操作?
Playwright + Python 自动化MetaMask全流程操作指南
一、正确加载MetaMask扩展
Playwright加载Chrome扩展必须使用persistent_context(持久化上下文),临时上下文无法保留扩展状态,操作步骤如下:
- 提前准备MetaMask扩展包(可从Chrome应用商店获取CRX文件,或使用本地已安装的扩展文件夹路径)
- 启动浏览器时配置扩展参数,示例代码:
from playwright.sync_api import sync_playwright import os with sync_playwright() as p: # MetaMask默认扩展ID(可根据实际安装情况调整) metamask_ext_id = "nkbihfbeogaeaoehlefnkodbefgpgknn" # 扩展文件夹路径 ext_path = os.path.abspath("./metamask_extension") # 启动带扩展的持久化上下文 context = p.chromium.launch_persistent_context( user_data_dir="./chrome_profile", # 保存浏览器状态,避免重复配置 headless=False, # 扩展在无头模式下兼容性差,建议先禁用 args=[ f"--disable-extensions-except={ext_path}", f"--load-extension={ext_path}" ] ) # 打开MetaMask扩展页面 metamask_page = context.new_page() metamask_page.goto(f"chrome-extension://{metamask_ext_id}/home.html")
二、处理MetaMask首次配置
若MetaMask未完成初始化,可自动化完成创建/导入钱包流程:
# 跳过欢迎页 metamask_page.click('text="Get Started"') # 选择导入钱包(或点击"Create a Wallet"创建新钱包) metamask_page.click('text="Import Wallet"') # 跳过隐私提示 metamask_page.click('text="I Agree"') # 填入助记词 metamask_page.fill('input[placeholder="Paste your secret recovery phrase here"]', "your-mnemonic-phrase-here") # 设置密码 metamask_page.fill('input[placeholder="New password"]', "your-secure-password") metamask_page.fill('input[placeholder="Confirm password"]', "your-secure-password") # 勾选协议并提交 metamask_page.click('input[type="checkbox"]') metamask_page.click('text="Import"') # 完成初始化收尾 metamask_page.click('text="Got it"') metamask_page.click('text="Next"') metamask_page.click('text="Done"')
三、网络配置自动化
切换或添加自定义网络的操作逻辑:
# 打开网络选择器 metamask_page.click('button[data-testid="network-display"]') # 选择Goerli测试网(或点击"Add Network"添加自定义网络) metamask_page.click('text="Goerli Test Network"') # 等待网络切换完成 metamask_page.wait_for_selector('text="Goerli"') # 若添加自定义网络,示例代码: # metamask_page.click('text="Add Network"') # metamask_page.fill('input[placeholder="Network Name"]', "Custom Network") # metamask_page.fill('input[placeholder="New RPC URL"]', "https://your-rpc-url") # metamask_page.fill('input[placeholder="Chain ID"]', "123") # metamask_page.fill('input[placeholder="Currency Symbol"]', "CS") # metamask_page.click('text="Save"')
四、识别正确的MetaMask页面
避免重复打开页面,可通过URL匹配定位目标页面:
def get_metamask_target_page(context, ext_id): for page in context.pages: if ext_id in page.url and ("home" in page.url or "confirm-transaction" in page.url): return page return None # 使用示例 target_page = get_metamask_target_page(context, metamask_ext_id)
也可监听页面创建事件,自动捕获MetaMask页面:
metamask_active_page = None def capture_metamask_page(page): global metamask_active_page if metamask_ext_id in page.url: metamask_active_page = page context.on("page", capture_metamask_page)
五、交易批准/拒绝自动化
当DApp发起交易后,MetaMask会弹出确认页面,处理逻辑如下:
# 等待交易确认页面加载 tx_confirm_page = context.wait_for_page( lambda page: metamask_ext_id in page.url and "confirm-transaction" in page.url ) # 批准交易 tx_confirm_page.click('button[data-testid="confirm-button"]') # 若拒绝交易,替换为: # tx_confirm_page.click('button[data-testid="reject-button"]')
资源推荐
- Playwright官方文档:重点查看「Chrome Extensions」章节,掌握扩展加载与上下文管理的核心规则。
- MetaMask开发者文档:熟悉MetaMask的UI结构、事件触发逻辑,帮助精准定位元素选择器。
- 开源社区示例:搜索Playwright + MetaMask + Python的开源仓库,参考成熟的自动化脚本实现思路。
- 专业书籍:《Playwright for Python: A Practical Guide》涵盖浏览器扩展自动化的实战内容,适合系统学习。
内容的提问来源于stack exchange,提问作者Plinio Mabesi
相关产品推荐
相关产品推荐

