You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium的find_element(By.CLASS_NAME)触发InvalidSelectorException问题

问题描述

需要定位一个页面刷新后类名会变化的元素,用BeautifulSoup成功查到了该元素的类名,但Selenium抛出InvalidSelectorException异常。该类名确实存在于页面源码中,类名前后有空格但BeautifulSoup未显示,即使手动添加空格后问题依旧。

相关代码如下:

#opening vehicle menu
vehicle_menu_parent = soup.find('div', string='ЛЕГКОВЫЕ АВТОМОБИЛИ').parent
vehicle_menu_class = '" ' + str(vehicle_menu_parent)[11:50] + '   "'
print(vehicle_menu_class) # " x-grid-cell x-grid-cell-gridcolumn-1331   "
with open('test.html', 'w', encoding='utf8') as file:
    file.write(driver.page_source)
vehicle_menu = driver.find_element(By.CLASS_NAME, vehicle_menu_class)
action.move_to_element(vehicle_menu).double_click().perform()
time.sleep(10)

页面源码截图:
页面源码截图

解决方案

问题出在这几个核心点:

  1. By.CLASS_NAME的使用限制:你传给By.CLASS_NAME的字符串包含引号、前后空格,还同时传入了多个类名(x-grid-cell和x-grid-cell-gridcolumn-1331),但Selenium的By.CLASS_NAME仅支持单个类名匹配,且不能包含引号、空格这类无关符号。
  2. 错误的类名提取逻辑:通过截取字符串的方式获取类名极易出错,应该直接从BeautifulSoup元素中提取原生的class属性。

修改后的正确代码示例:

# 从BeautifulSoup元素中直接获取class列表
vehicle_menu_parent = soup.find('div', string='ЛЕГКОВЫЕ АВТОМОБИЛИ').parent
class_list = vehicle_menu_parent.get('class')
# 拼接为CSS选择器格式(多类名用点连接)
css_selector = '.'.join(class_list)

# 用CSS_SELECTOR定位元素(支持多类名匹配)
vehicle_menu = driver.find_element(By.CSS_SELECTOR, css_selector)
action.move_to_element(vehicle_menu).double_click().perform()
time.sleep(10)

如果其中存在固定不变的类(比如x-grid-cell是稳定的,仅后缀类名随机变化),也可以直接结合文本定位,更简洁可靠:

# 用XPATH结合固定类和文本定位
vehicle_menu = driver.find_element(By.XPATH, '//div[contains(@class, "x-grid-cell") and text()="ЛЕГКОВЫЕ АВТОМОБИЛИ"]')
action.move_to_element(vehicle_menu).double_click().perform()

内容的提问来源于stack exchange,提问作者zubodub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:35:19