Selenium点击下拉项后报StaleElementReferenceException问题排查
问题分析与修正
代码中的错误点
- CSS选择器写法错误:使用
By.CSS_SELECTOR时,类选择器需以.开头,而非class="xxx"格式。原代码里的class=" css-b02ejv-menu"和class="CustomOptionMenu_button__2GnMd"都是错误写法,正确应为.css-b02ejv-menu和.CustomOptionMenu_button__2GnMd。 - WebDriverWait语法缺失:原代码缺少等待超时参数(比如10秒)和闭合括号,导致语法错误。
- 陈旧元素核心问题:下拉菜单展开后,页面DOM可能发生局部刷新,提前获取的
select_question_type元素列表会因DOM更新变为无效状态。遍历旧列表时,元素已脱离文档,触发StaleElementReferenceException。
修正后的代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains # 点击下拉触发按钮 exam_question_type = self.driver.find_element(By.XPATH, "//*[name()='svg'][@class='css-19bqh2r']") exam_question_type.click() # 等待下拉菜单可见(添加超时时间,修复语法) WebDriverWait(self.driver, 10).until(ec.visibility_of_element_located((By.CSS_SELECTOR, '.css-b02ejv-menu'))) # 直接定位目标选项并点击,避免遍历旧元素列表 target_option = WebDriverWait(self.driver, 10).until( ec.element_to_be_clickable((By.XPATH, "//button[contains(@class, 'CustomOptionMenu_button__2GnMd') and text()='QCM grid']")) ) ActionChains(self.driver).click(target_option).perform()
说明
- 直接通过XPath定位包含目标文本的选项,确保每次获取的都是当前DOM中有效的元素,从根源避免陈旧元素问题。
- 用
element_to_be_clickable代替直接查找,确保元素处于可点击状态后再执行操作,提升代码稳定性。 - 修复了CSS选择器和WebDriverWait的语法错误,保证代码可正常运行。
内容的提问来源于stack exchange,提问作者Jin
相关产品推荐
相关产品推荐

