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

Python Selenium如何点击无class/id/value的动态MLB按钮

问题定位

你写的定位逻辑本身没有大问题,点击失效核心是4个原因:

  • 高版本Selenium已经移除了find_element_by_xpath这类旧版定位语法,直接调用会抛方法不存在的错误
  • 登录后的MLB按钮属于体育导航模块,是JS异步懒加载的,你用的implicitly_wait只会判断DOM节点是否存在,不会判断节点是否可见、是否可点击,也不会处理页面加载时的全局遮罩
  • 硬编码的time.sleep时长固定,网络慢的时候元素还没加载完就执行定位,网络快的时候又会浪费等待时间,稳定性极差
  • 你注释掉的CSS选择器button[data-name="MLB"]是准确率最高的定位方式,只是没加可交互判断才会点击失败
最优实现代码

统一用显式等待替代硬sleep和隐式等待,等待元素满足可点击状态后再操作,加JS点击兜底解决元素遮挡、不在视口的问题,修正后完整逻辑如下:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 初始化driver的逻辑自行保留
driver.get("https://www.mybookie.ag/")
# 统一设置20秒显式等待超时
wait = WebDriverWait(driver, 20)

# 点击登录入口
wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "login-btn-box__login"))).click()

# 输入账号密码
wait.until(EC.presence_of_element_located((By.NAME, "username"))).send_keys(mybookieEmail)
driver.find_element(By.NAME, "password").send_keys(myBookiePassword)

# 提交登录
wait.until(EC.element_to_be_clickable((By.ID, "login_trk"))).click()

# 定位并点击MLB按钮:用data-name属性定位,比文本定位稳定性高
mlb_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-name="MLB"]')))
# 滚动到按钮可视区域,避免视口外元素点击报错
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", mlb_btn)
# 普通点击失败时用JS点击兜底
try:
    mlb_btn.click()
except Exception:
    driver.execute_script("arguments[0].click();", mlb_btn)

# 后续业务逻辑自行编写
driver.quit()
注意事项
  • 删掉代码里的driver.implicitly_wait(15),隐式等待和显式等待混用会导致等待时长计算混乱,出现随机超时问题
  • 不要用normalize-space()="MLB"这类文本匹配定位,站点多语言切换、文本前后带隐藏字符、标签嵌套时都会失效,前端自定义的data-name属性是业务绑定属性,不会随样式、文本改动,定位稳定性最高
  • 如果登录后弹出广告、优惠提示类弹窗,先加一步定位弹窗关闭按钮点击关闭,再执行MLB按钮点击即可
  • 如果排查时发现MLB按钮嵌套在iframe内,先执行driver.switch_to.frame()切入对应iframe,再执行定位逻辑

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

相关产品推荐
方舟 Agent Plan

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

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