
Selenium 的 find_element(By.CLASS_NAME, ...) 仅支持单个类名,无法处理含多个类的元素;当目标元素具有多个 class(如 css-v84xw-NakedButton eml2css7)时,必须改用 By.CSS_SELECTOR 并以点号连接类名。
.selenium 的 `find_element(by.class_name, ...)` 仅支持单个类名,无法处理含多个类的元素;当目标元素具有多个 class(如 `css-v84xw-nakedbutton eml2css7`)时,必须改用 `by.css_selector` 并以点号连接类名。
在自动化测试或网页抓取中,精准定位 HTML 元素是关键一步。你遇到的错误:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".css-v84xw-NakedButton eml2css7"}
表面看是“找不到元素”,但根本原因在于定位策略误用:你传入了空格分隔的两个类名 "css-v84xw-NakedButton eml2css7" 给 By.CLASS_NAME,而 By.CLASS_NAME 严格要求且仅接受一个纯类名字符串(如 "css-v84xw-NakedButton"),不支持空格、复合类或 CSS 选择器语法。
✅ 正确做法是:
当元素拥有多个 class(例如
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def rooms():
driver = webdriver.Chrome()
try:
driver.get("https://www.qantas.com/hotels/properties/18482?adults=2&checkIn=2024-04-16&checkOut=2024-04-17&children=0&infants=0#view-rooms")
# ✅ 推荐:显式等待 + CSS_SELECTOR 定位(更稳定可靠)
wait = WebDriverWait(driver, 10)
expand_btn = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".css-v84xw-NakedButton.eml2css7"))
)
expand_btn.click()
print("✅ 成功点击展开按钮")
finally:
driver.quit()
rooms()
⚠️ 注意事项:
- ❌ driver.find_element('class name', "a b") 是无效写法 —— 'class name' 不是标准定位方式(应始终使用 By.CLASS_NAME 枚举),且不支持多类;
- ✅ .class1.class2(无空格)表示“同时包含 class1 和 class2”的元素;而 .class1 .class2(有空格)表示后代关系,语义完全不同;
- ⏱️ 避免依赖 implicitly_wait() 处理动态加载内容,优先使用 WebDriverWait + expected_conditions 实现精准等待;
- ? 若页面存在多个匹配按钮,可进一步结合 data-testid 属性提升唯一性:
By.CSS_SELECTOR, "button[data-testid='expand-offer-summary']"。
总结:Selenium 中类名定位不是“按 class 属性值搜索”,而是按 CSS 选择器规则解析。掌握 By.CSS_SELECTOR 的基本语法(如 . 表类、# 表 ID、[attr] 表属性),能显著提升定位鲁棒性与可维护性。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











