Python Selenium按钮点击失效:为何无法选中NBA球队按钮?
问题:无法通过动态球队名称点击NBA赛事按钮
我编写了两个函数,分别用于点击指定网页中的芝加哥公牛队或迈阿密热火队按钮,但当前代码无法实现点击操作。需要通过team变量适配动态变化的球队名称,相关代码如下:
主代码
driver = startup_login('https://prolineplus.olg.ca/en-ca/event/?e177405-Basketball-NBA-USA-Miami-Heat-Chicago-Bulls') team = "Chicago" proline_go_to_match2(driver,team)
函数代码
def proline_go_to_match2(driver, team): #print(team) try: match = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.XPATH, "//ul[@class='fdjgs-markets']/li[@class='fdjgs-market']//ul[@class='fdjgs-outcomes']//descendant::li[1]//span[@class='fdjgs-outcome-wrapper' and contains(@aria-label, '"+ team +"')]/span[starts-with(., '"+ team +"')]")) ) match.click() except: driver.quit() def proline_go_to_match3(driver, team): #print(team) try: match = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.XPATH, "//ul[@class='fdjgs-markets']/li[@class='fdjgs-market']//ul[@class='fdjgs-outcomes']//descendant::li[2]//span[@class='fdjgs-outcome-wrapper' and contains(@aria-label, '"+ team +"')]/span[starts-with(., '"+ team +"')]")) ) match.click() except: driver.quit()
问题分析与修复方案
- 硬编码列表索引问题:原代码硬编码了
li[1]和li[2],但球队在列表中的位置可能动态变化,直接绑定索引会导致定位失败。 - 等待条件不合适:
EC.presence_of_element_located仅确保元素存在,但元素可能还未处于可点击状态,应改用EC.element_to_be_clickable等待元素可交互。 - XPath拼接风险:直接拼接字符串容易出现语法错误,建议用f-string格式化XPath,提升可读性和稳定性。
- 异常处理过于粗暴:直接执行
driver.quit()会导致浏览器强制关闭,不利于排查问题,应捕获具体异常并输出错误信息。
修改后的代码
将两个函数合并为一个,通过team参数直接定位目标球队,无需依赖固定列表索引:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By def proline_go_to_match(driver, team): try: # 定位包含目标球队名称的可点击元素 match = WebDriverWait(driver, 15).until( EC.element_to_be_clickable( (By.XPATH, f"//span[@class='fdjgs-outcome-wrapper' and contains(@aria-label, '{team}')]/span[starts-with(., '{team}')]") ) ) match.click() except Exception as e: print(f"点击球队{team}失败: {str(e)}") # 可根据需求选择是否关闭浏览器,此处暂不直接退出 # driver.quit()
使用方式
driver = startup_login('https://prolineplus.olg.ca/en-ca/event/?e177405-Basketball-NBA-USA-Miami-Heat-Chicago-Bulls') # 点击芝加哥公牛队 team = "Chicago" proline_go_to_match(driver, team) # 点击迈阿密热火队 team = "Miami" proline_go_to_match(driver, team)
内容的提问来源于stack exchange,提问作者jwalman
相关产品推荐
相关产品推荐

