系统学习 By.CSS_SELECTOR 的核心语法、实操示例与最佳实践
By.CSS_SELECTOR 是 Selenium 中功能最强大、语法最灵活的元素定位方式,利用浏览器原生 CSS 选择器引擎进行匹配(与写 <style> 里的选择器完全一样)。它能覆盖 ID、CLASS、TAG、属性、层级、伪类等任意组合:#username(id)、.btn.primary(多 class 组合,这是 By.CLASS_NAME 做不到的)、input[name='password'](属性)、ul.menu > li:first-child(层级+伪类)、a[href^='/api'](属性前缀匹配)。与 XPath 相比,CSS 选择器写法更简洁、性能更好,但有一个硬伤:无法向上查找父元素、不支持文本函数(如 text()、contains())— 遇到这两种场景请换 By.XPATH。
driver.find_element(By.CSS_SELECTOR, "html body div.container div.product-list div.product-card") (① 绝对路径
driver.find_element(By.CSS_SELECTOR, "div.product-list > div.product-card") (② 相对路径
driver.find_element(By.CSS_SELECTOR, "#userName") (③ id 选择器
id 属性值,全局唯一:driver.find_elements(By.CSS_SELECTOR, ".product-card") (④ class 选择器
class 属性值:find_elementsfind_element——返回第一个,页面多个时可能找错driver.find_element(By.CSS_SELECTOR, "input[name='email']") (⑤ 属性选择器
id 和 class 属性。它们本身就是属性,同样能用这种写法匹配:class="product-card active"(两个 class),这条会匹配失败;要兼容多值应写 [class~='product-card'](~= 单词匹配),或直接用简写 .product-carddriver.find_element(By.CSS_SELECTOR, "input[name]") (⑥ 属性名称选择器
driver.find_element(By.CSS_SELECTOR, "a[href*='selenium']") (⑦ 部分属性值选择器
driver.find_element(By.CSS_SELECTOR, "a") (⑧ 标签名选择器
find_elements 批量获取input[type='checkbox'] 就是标签名 + 属性限定的好例子driver.find_element(By.CSS_SELECTOR, ".product-card:nth-child(3)") (⑨ 伪类选择器
driver.find_element(By.CSS_SELECTOR, "div.card + div.action") (⑩ 兄弟选择器
driver.find_elements(By.CSS_SELECTOR, "html body div.container div.product-list div.product-card") (① 绝对路径)driver.find_elements(By.CSS_SELECTOR, "div.product-list > div.product-card") (② 相对路径)driver.find_elements(By.CSS_SELECTOR, "#userName") (③ id 选择器)driver.find_elements(By.CSS_SELECTOR, ".product-card") (④ class 选择器)driver.find_elements(By.CSS_SELECTOR, "input[name='email']") (⑤ 属性选择器)driver.find_elements(By.CSS_SELECTOR, "input[name]") (⑥ 属性名称选择器)driver.find_elements(By.CSS_SELECTOR, "a[href*='selenium']") (⑦ 部分属性值选择器)driver.find_elements(By.CSS_SELECTOR, "a") (⑧ 标签名选择器)driver.find_elements(By.CSS_SELECTOR, ".product-card:nth-child(3)") (⑨ 伪类选择器)driver.find_elements(By.CSS_SELECTOR, "div.card + div.action") (⑩ 兄弟选择器)#idValue,Selenium 首选定位方式;CSS 中 #id 等价于 By.ID,比 XPath 更简洁高效。.product-card.featured 需同时包含两个 class;注意 .a.b(多类同时存在)≠ .a .b(后代选择器)。[attr='val'] 完全等于,[attr*='val'] 包含子串,[attr^='pre'] 开头匹配,[attr$='end'] 结尾匹配,[attr~='w'] 空格分隔的词中包含。> 表示直接子元素,+ 表示相邻兄弟,~ 表示后续所有兄弟;搭配 :first-child / :last-child / :nth-child(n) 可精确定位到特定位置。