Selenium中find_elements()返回空列表问题求助
问题分析与解决办法
针对你用Selenium无法获取H5P题目元素的问题,可从以下几个方向排查解决:
检查元素是否在iframe中
不少H5P内容会嵌入在iframe里,Selenium默认只会在主页面DOM中查找元素,需先切换到对应iframe再操作:# 定位iframe(可根据实际情况调整定位方式,比如class、id) iframe = driver.find_element(By.TAG_NAME, 'iframe') # 切换到iframe driver.switch_to.frame(iframe) # 此时再执行元素查找操作 questions = driver.find_elements(By.CSS_SELECTOR, '[id^="h5p-tfq"], [id^="h5p-mcq"]') # 操作完成后切回主文档 driver.switch_to.default_content()改用显式等待替代强制等待
页面动态加载时,固定时长的sleep不一定能保证元素渲染完成,用显式等待能确保元素出现后再查找:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) # 最多等待10秒 # 等待任意目标元素出现 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[id^="h5p-tfq"]'))) # 再批量获取题目元素 questions = driver.find_elements(By.CSS_SELECTOR, '[id^="h5p-tfq"], [id^="h5p-mcq"]') for q in questions: print(q.text)尝试通用选择器匹配动态ID
若题目ID的前缀固定(如h5p-tfq、h5p-mcq),用CSS选择器匹配前缀比遍历固定ID更灵活:# 匹配所有id以h5p-tfq或h5p-mcq开头的元素 questions = driver.find_elements(By.CSS_SELECTOR, '[id^="h5p-tfq"], [id^="h5p-mcq"]') for question in questions: print(question.text)排查ChromeDriver与浏览器版本兼容性
确保ChromeDriver版本和你的Chrome浏览器版本完全匹配,版本不兼容会导致元素查找等功能异常,可在Chrome设置里查看浏览器版本,再下载对应版本的ChromeDriver替换。检查元素是否在Shadow DOM中
部分H5P组件会使用Shadow DOM隔离元素,此时需通过JavaScript获取:# 需根据实际页面结构调整选择器,找到包含Shadow DOM的容器 script = """ const container = document.querySelector('#h5p-content'); // 替换为实际容器选择器 return container.shadowRoot.querySelectorAll('[id^="h5p-tfq"], [id^="h5p-mcq"]'); """ questions = driver.execute_script(script) for q in questions: print(q.text)
内容的提问来源于stack exchange,提问作者52616e646f6d
相关产品推荐
相关产品推荐

