Selenium设置隐式等待后仍报NoSuchElementException错误原因排查
问题原因分析
- 核心报错NoSuchElementException的首要原因是
find_element_by_class_name方法使用错误:该方法仅支持传入单个class名称,你传入的是空格分隔的多组class值,Selenium会把整串字符串当成单个class名匹配,自然找不到对应元素。多class匹配需要改用CSS选择器实现。 - 你调用的是
find_element(单数方法),返回结果是单个WebElement对象,无法直接用for循环遍历,需要改为调用find_elements(复数方法)获取元素列表。 - 代码中存在两处弃用警告,是Selenium 4+版本的语法调整导致:
executable_path参数已弃用,需要先实例化Service对象传入chromedriver路径find_element_by_*系列方法已弃用,统一改为find_element(By.定位方式, 定位值)的写法
- 你当前写的公司名称XPath是固定id的绝对路径,循环遍历每个条目时都会匹配到第一个符合条件的元素,无法拿到每个条目对应的公司名,需要改为相对路径写法。
- 日志中出现的蓝牙、USB相关报错是Chrome浏览器的系统级日志输出,不影响代码运行,可直接忽略。
修正后可运行代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By url = 'https://www.checkatrade.com/search?page=1&categoryId=1164&location=London' # 替换为你的chromedriver路径 s = Service(r'D:\Web_Scraping\chromedriver_win32\chromedriver.exe') driver = webdriver.Chrome(service=s) driver.get(url) driver.implicitly_wait(20) # 多class匹配改用CSS选择器,使用find_elements获取元素列表 items = driver.find_elements(By.CSS_SELECTOR, '.sc-8keyp7-0.kbPUFb.sc-1a2v1qv-0.gwBNSh.sc-3jeiz1-1.bfuahU') for item in items: # 相对路径开头加.,匹配当前item下的h2元素,避免每次都匹配全局第一个元素 company = item.find_element(By.XPATH, './/h2').text print(company) driver.quit()
内容的提问来源于stack exchange,提问作者user17087759
相关产品推荐
相关产品推荐

