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

