Selenium定位元素失败:访问ESPNcricinfo球员页面报NoSuchElementException
解决Selenium获取ESPNcricinfo球员名字的NoSuchElementException问题
问题根源
- 绝对
XPATH完全依赖页面固定层级结构,一旦网站微调布局就会失效 - 固定时长的
time.sleep无法精准匹配元素加载节奏,容易出现元素未就绪就执行查找的情况 - 弹窗处理后未等待目标元素加载完成就直接执行查找操作
修复后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器实例 driver = webdriver.Firefox() driver.get('https://www.espncricinfo.com/player/aamer-jamal-793441') driver.maximize_window() try: # 显式等待弹窗并关闭(兼容弹窗延迟加载的情况) cancel_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, 'wzrk-cancel')) ) cancel_btn.click() # 用相对定位+显式等待获取球员全名,避免依赖固定页面结构 fullname_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, '//div[@data-testid="player-header"]//h5')) ) print(fullname_element.text) finally: # 确保浏览器正常关闭,避免资源占用 driver.quit()
核心优化说明
- 替换绝对XPATH为语义化定位:通过
data-testid属性定位父容器,再查找内部的名字元素,这种方式不受页面层级变化影响 - 用显式等待替代固定休眠:
WebDriverWait会等待元素满足可见/可点击条件后再执行操作,比time.sleep更高效且稳定 - 增加资源回收逻辑:
try-finally确保无论是否报错,浏览器都会正常关闭
备选定位方案
如果上述定位仍有问题,可尝试以下更精准的方式:
- 通过文本内容定位:
(By.XPATH, '//h5[contains(text(), "Aamer Jamal")]') - 通过唯一class定位:
(By.CSS_SELECTOR, 'h5.ds-text-title-l.ds-font-bold')
内容的提问来源于stack exchange,提问作者Sameer uddin
相关产品推荐
相关产品推荐

