使用Selenium自动化Metamask钱包导入时遇LavaMoat错误求助
解决Selenium自动化Metamask钱包导入时的LavaMoat错误
错误原因
这个报错是因为Metamask新版本启用了LavaMoat的scuttling安全模式,限制了全局对象的访问权限,而你使用的文本匹配XPATH定位方式触发了这个安全限制,导致Selenium的元素查找逻辑无法正常执行。
可行解决方案
方案1:使用官方Metamask扩展+稳定元素定位器
不要使用第三方网站下载的CRX文件,改用本地已安装的官方Metamask扩展,同时放弃文本匹配的XPATH,改用Metamask提供的data-testid属性或CSS选择器定位元素(这些属性更稳定且不会触发LavaMoat限制)。
代码示例:
import time from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium import webdriver def test_metamask_import(): # 替换为你本地官方Metamask扩展的实际路径(Ubuntu下一般在~/.config/google-chrome/Default/Extensions/下) EXTENSION_PATH = '~/.config/google-chrome/Default/Extensions/nkbihfbeogaeaoehlefnkodbefgpgknn/10.30.1_0/' SECRET_RECOVERY_PHRASE = "你的助记词" NEW_PASSWORD = "测试用密码" opt = webdriver.ChromeOptions() # 加载本地扩展目录而非CRX文件 opt.add_argument(f"--load-extension={EXTENSION_PATH}") # 测试环境下禁用web安全限制(仅用于测试) opt.add_argument("--disable-web-security") opt.add_argument("--allow-running-insecure-content") driver = webdriver.Chrome(options=opt) time.sleep(3) # 切换到Metamask启动窗口 if len(driver.window_handles) > 1: driver.switch_to.window(driver.window_handles[1]) time.sleep(3) wait = WebDriverWait(driver, 30) # 用data-testid定位导入钱包按钮 import_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[data-testid="onboarding-import-wallet"]'))) import_btn.click() # 逐个输入助记词(Metamask是分输入框的) words = SECRET_RECOVERY_PHRASE.split() for i, word in enumerate(words): input_field = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, f'[data-testid="import-srp__srp-word-{i}"]'))) input_field.send_keys(word) # 设置密码并同意条款 password_input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[data-testid="create-password-new"]'))) password_input.send_keys(NEW_PASSWORD) confirm_password = driver.find_element(By.CSS_SELECTOR, '[data-testid="create-password-confirm"]') confirm_password.send_keys(NEW_PASSWORD) terms_checkbox = driver.find_element(By.CSS_SELECTOR, '[data-testid="create-password-terms"]') terms_checkbox.click() # 完成导入 submit_btn = driver.find_element(By.CSS_SELECTOR, '[data-testid="create-password-import"]') submit_btn.click() # 切换回你的Next.js应用窗口 driver.switch_to.window(driver.window_handles[0])
方案2:使用预配置好的Chrome用户目录
在本地Chrome中手动完成Metamask的钱包导入、登录,然后让Selenium直接复用这个已配置的用户目录,跳过重复导入步骤。
代码示例:
from selenium import webdriver def test_with_preconfigured_profile(): opt = webdriver.ChromeOptions() # 指定Chrome用户数据目录(Ubuntu下默认路径) opt.add_argument("--user-data-dir=~/.config/google-chrome/") # 指定具体配置文件(如果有多个用户) opt.add_argument("--profile-directory=Default") driver = webdriver.Chrome(options=opt) # 直接打开你的Next.js应用,Metamask已处于登录状态 driver.get("你的应用URL") # 后续处理Metamask授权弹窗等逻辑
方案3:使用专门的Metamask自动化库
放弃手动编写Selenium逻辑,使用针对Metamask优化的自动化库(如auto-metamask),这些库已经处理了LavaMoat等兼容性问题,只需调用封装好的API即可完成导入、授权操作。
关键注意事项
- 仅在测试环境使用
--disable-web-security等参数,生产环境绝对禁止 - 始终使用官方Metamask扩展,避免第三方CRX的安全和兼容性问题
- Metamask的UI元素会随版本更新变化,需定期检查定位器是否有效
内容的提问来源于stack exchange,提问作者adriB
相关产品推荐
相关产品推荐

