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

使用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即可完成导入、授权操作。


关键注意事项

  1. 仅在测试环境使用--disable-web-security等参数,生产环境绝对禁止
  2. 始终使用官方Metamask扩展,避免第三方CRX的安全和兼容性问题
  3. Metamask的UI元素会随版本更新变化,需定期检查定位器是否有效

内容的提问来源于stack exchange,提问作者adriB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:37:45