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

Selenium Python操作PvU站点点击MetaMask登录按钮无响应求助

修复方案

以下是核心问题和调整方法:

  • 你当前使用的presence_of_element_located仅检测元素是否存在于DOM树中,不保证元素处于可见、可交互状态,点击自然不会触发事件,需要替换为element_to_be_clickable等待按钮可被点击后再操作
  • 钱包登录类按钮通常绑定了前端自定义事件,Selenium原生的模拟点击容易被拦截,改用JS注入点击的兼容性更高
  • 无需提前打开MetaMask弹窗页,点击登录按钮后钱包会自动弹出授权窗口,提前打开反而容易导致窗口句柄识别错误

调整后的完整代码

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import sys
from selenium.webdriver.common.keys import Keys
from time import sleep
import asyncio
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
import time

def run_chrome():
    # 创建选定配置的Chrome实例
    options = Options()
    options.add_argument("start-maximized")
    options.add_argument("user-data-dir=C:\\Python")
    # 允许弹窗,避免MetaMask授权窗口被拦截
    options.add_argument("--disable-popup-blocking")
    driver = webdriver.Chrome(options=options)
    ac = ActionChains(driver)
    
    # 打开Metamask并登录
    driver.get('chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/home.html')
    delay = 5 # 延长等待时间避免网络波动影响
    try:
        WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, '//*[@id="password"]')))
        print ("Metamask页面加载完成!")
    except TimeoutException:
        print ("Metamask页面加载超时!")
    s_pass = "PASSWORD"
    driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(s_pass)
    driver.find_element(By.XPATH, '//*[@id="app-content"]/div/div[4]/div/div/button/span').click()
    # 等待Metamask登录完成
    time.sleep(2)

    # 打开PvU站点
    driver.get('https://marketplace.plantvsundead.com/#/login')
    
    # 等待MetaMask登录按钮可点击
    try:
        metamask_btn = WebDriverWait(driver, delay).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "div.metamask.tw-flex.tw-items-center.tw-p-3.tw-cursor-pointer"))
        )
        print ("PvU登录页加载完成,按钮可点击")
    except TimeoutException:
        print ("PvU登录页加载超时,未找到MetaMask登录按钮")
        driver.quit()
        return
    
    # 用JS执行点击,绕过前端事件拦截
    driver.execute_script("arguments[0].click();", metamask_btn)
    print("已触发MetaMask登录请求")
    
    # 等待MetaMask授权弹窗弹出,切换到弹窗
    time.sleep(3)
    # 遍历句柄找到MetaMask弹窗
    for handle in driver.window_handles:
        driver.switch_to.window(handle)
        if "MetaMask" in driver.title:
            print("已切换到MetaMask授权窗口")
            break
    
    # 后续可继续编写授权确认逻辑
    
run_chrome()

额外注意事项

  • 确保你使用的Chrome用户配置(C:\\Python路径下)中,MetaMask没有限制PvU站点的连接权限
  • 如果仍然点击无响应,可以在开发者工具中检查登录按钮的父元素是否有z-index、pointer-events等CSS属性屏蔽了点击,调整选择器定位到实际接收点击事件的元素即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:18:02