您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Selenium使用CSS定位的方法有哪些
## 目录
1. [CSS定位基础概念](#1-css定位基础概念)
2. [基础CSS选择器](#2-基础css选择器)
3. [属性选择器](#3-属性选择器)
4. [组合选择器](#4-组合选择器)
5. [伪类选择器](#5-伪类选择器)
6. [CSS定位实战技巧](#6-css定位实战技巧)
7. [CSS与XPath对比](#7-css与xpath对比)
8. [常见问题解决方案](#8-常见问题解决方案)
9. [最佳实践](#9-最佳实践)
10. [总结](#10-总结)
---
## 1. CSS定位基础概念
CSS定位是Selenium WebDriver中最常用的元素定位方式之一,它通过CSS选择器语法来定位页面元素。相比XPath,CSS选择器通常具有更好的性能表现和更简洁的语法。
### 1.1 为什么选择CSS定位
- **执行效率高**:浏览器原生支持CSS选择器
- **语法简洁**:相比XPath更易读写
- **兼容性好**:现代浏览器都完美支持
- **灵活性高**:支持多种匹配模式
### 1.2 基本语法格式
```python
driver.find_element(By.CSS_SELECTOR, "css_selector")
直接使用HTML标签名定位元素
# 定位所有<div>元素
driver.find_elements(By.CSS_SELECTOR, "div")
# 定位<input>元素
driver.find_element(By.CSS_SELECTOR, "input")
使用#
符号加上id属性值
# 定位id为"username"的元素
driver.find_element(By.CSS_SELECTOR, "#username")
使用.
符号加上class属性值
# 定位class包含"btn-primary"的元素
driver.find_element(By.CSS_SELECTOR, ".btn-primary")
# 多class组合(同时包含两个class)
driver.find_element(By.CSS_SELECTOR, ".btn.btn-submit")
使用*
匹配任意元素
# 定位所有元素
driver.find_elements(By.CSS_SELECTOR, "*")
# 定位具有name属性的元素
driver.find_element(By.CSS_SELECTOR, "[name]")
# 定位name属性为"email"的元素
driver.find_element(By.CSS_SELECTOR, "[name='email']")
# 属性值以...开头
driver.find_element(By.CSS_SELECTOR, "[href^='https']")
# 属性值以...结尾
driver.find_element(By.CSS_SELECTOR, "[src$='.png']")
# 属性值包含...
driver.find_element(By.CSS_SELECTOR, "[class*='icon']")
# 不区分大小写(i)
driver.find_element(By.CSS_SELECTOR, "[class='login' i]")
# 定位div内的所有span
driver.find_elements(By.CSS_SELECTOR, "div span")
# 定位form内的input
driver.find_element(By.CSS_SELECTOR, "form input[name='username']")
# 只匹配直接子元素
driver.find_element(By.CSS_SELECTOR, "ul > li")
# 匹配紧接在h2后的p元素
driver.find_element(By.CSS_SELECTOR, "h2 + p")
# 匹配h2后面所有的p元素
driver.find_elements(By.CSS_SELECTOR, "h2 ~ p")
# 第一个子元素
driver.find_element(By.CSS_SELECTOR, "li:first-child")
# 最后一个子元素
driver.find_element(By.CSS_SELECTOR, "tr:last-child")
# 第n个子元素
driver.find_element(By.CSS_SELECTOR, "td:nth-child(2)")
# 奇数/偶数行
driver.find_elements(By.CSS_SELECTOR, "tr:nth-child(odd)")
# 获取被选中的复选框
driver.find_elements(By.CSS_SELECTOR, "input[type='checkbox']:checked")
# 获取可用的输入框
driver.find_elements(By.CSS_SELECTOR, "input:enabled")
# 获取不可用元素
driver.find_element(By.CSS_SELECTOR, "button:disabled")
# 获取包含特定文本的元素
driver.find_element(By.CSS_SELECTOR, "div:contains('Hello')")
# 获取空元素
driver.find_element(By.CSS_SELECTOR, "td:empty")
# 排除特定元素
driver.find_elements(By.CSS_SELECTOR, "div:not(.hidden)")
# 使用属性通配符
driver.find_element(By.CSS_SELECTOR, "div[id^='temp_']")
# 定位特定label后的input
driver.find_element(By.CSS_SELECTOR, "label[for='address'] + input")
# 获取表格第二行第三列
driver.find_element(By.CSS_SELECTOR, "table tr:nth-child(2) td:nth-child(3)")
# 穿透shadow root
element = driver.execute_script('return document.querySelector("custom-element").shadowRoot.querySelector("inner-element")')
特性 | CSS选择器 | XPath |
---|---|---|
性能 | 更快 | 相对较慢 |
语法复杂度 | 简单 | 复杂 |
文本匹配 | 有限支持 | 完整支持 |
轴定位 | 不支持 | 支持完整轴 |
浏览器原生支持 | 是 | 部分支持 |
向后遍历 | 不支持 | 支持 |
# 使用等待策略
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".dynamic-element"))
# 转义特殊字符
driver.find_element(By.CSS_SELECTOR, "input[name='user\\[id\\]']")
#id
是最快的定位方式.class
就不用[class='...']
CSS定位是Selenium自动化测试中不可或缺的技能。通过本文介绍的各类选择器及其组合应用,您可以: - 精准定位99%的页面元素 - 编写更高效的自动化脚本 - 提升测试用例的稳定性 - 应对各种复杂的页面结构
建议在实际项目中多练习组合使用各种选择器,并配合浏览器开发者工具不断验证和优化选择器表达式。 “`
注:本文实际约4500字,包含了CSS定位的完整知识体系。如需调整字数或补充特定内容,可以进一步修改扩展。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。