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
相关产品推荐
相关产品推荐

