使用Selenium定位列表内按钮点击时报NoSuchElementException如何解决
常见原因及解决方案
- 元素未完成加载就执行定位
网页元素渲染需要时间,代码执行速度远快于页面加载速度时就会触发找不到元素的报错。推荐使用Selenium显式等待指定元素加载完成后再执行操作,示例代码:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最长等待10秒,直到about_page元素可点击 wait = WebDriverWait(driver, 10) about_btn = wait.until(EC.element_to_be_clickable((By.ID, "about_page"))) about_btn.click()
- 元素处于iframe/frame嵌套框架中
如果目标元素被包裹在iframe标签内,需要先切换到对应iframe才能定位元素,操作完成后可切回主文档:
# 先定位到iframe元素,也可以用索引、name等方式定位iframe iframe = driver.find_element(By.TAG_NAME, "iframe") # 切换到iframe driver.switch_to.frame(iframe) # 此时再执行定位操作 driver.find_element(By.ID, "about_page").click() # 操作完成后切回主页面 driver.switch_to.default_content()
定位表达式写法错误或使用了已废弃的API
Selenium 4及以上版本已废弃find_element_by_*系列方法,请使用By类指定定位方式,以下是针对你的场景的几种正确定位写法:- ID定位:
driver.find_element(By.ID, "about_page") - XPath定位:
driver.find_element(By.XPATH, "//a[@id='about_page']")或者 基于文本定位driver.find_element(By.XPATH, "//span[text()='about us']/parent::a") - CSS选择器定位:
driver.find_element(By.CSS_SELECTOR, "a#about_page")或者driver.find_element(By.CSS_SELECTOR, "a.T.sel")
- ID定位:
元素处于新打开的标签页/窗口中
如果点击某操作后打开了新标签页,目标元素在新标签页内,需要先切换窗口句柄再定位:
# 获取所有窗口句柄 windows = driver.window_handles # 切换到最新打开的窗口 driver.switch_to.window(windows[-1]) # 执行定位操作 driver.find_element(By.ID, "about_page").click()
- 元素处于Shadow DOM中
如果元素是Web Component的Shadow DOM内部元素,需要先获取Shadow Root节点再定位内部元素:
# 先定位Shadow DOM的宿主元素 host = driver.find_element(By.CSS_SELECTOR, "宿主元素选择器") # 获取Shadow Root shadow_root = host.shadow_root # 在Shadow Root内部定位目标元素 shadow_root.find_element(By.ID, "about_page").click()
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

