# 1.导包
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 2.打开浏览器(创建浏览器驱动对象)
path = r"C:\Program Files\Python311\chromedriver.exe"//驱动程序路径
ser = Service(executable_path=path) # Chrome浏览器驱动服务对象
driver = webdriver.Chrome(service=ser) # 打开Chrome浏览器
# 3.输入网址
driver.get("url地址")
# 4.页面操作
# # 输入操作
# 元素对象.send_keys("内容")
# # 点击操作
# 元素对象.click()
# 5.等待2秒
time.sleep(2)
# 6.退出浏览器
driver.quit()
定位:driver.find_element(by=By.定位方式, value="属性值")
Selenium 页面元素定位方法速查表
| 定位方式 | 语法 (By) | 适用场景 | HTML 示例 | 劣势/注意 |
|---|---|---|---|---|
| ID 定位 | By.ID |
首选。元素拥有唯一的 id 属性时。 |
<input id="username" ...> |
若 ID 是动态生成的则无法使用。 |
| Name 定位 | By.NAME |
表单元素(input, select等)有 name 属性且无 ID 时。 |
<input name="password" ...> |
部分元素可能没有 name 属性;若有多个同名元素需配合下标。 |
| Class Name | By.CLASS_NAME |
元素 class 属性具有辨识度,且类名唯一时。 |
<button class="btn-submit"> |
若 class 包含多个值(如 class="a b"),只能传其中一个;若类名重复需结合其他方法。 |
| Tag Name | By.TAG_NAME |
批量定位同类型元素(如获取所有输入框、链接)。 | <input type="text"> |
精确性差,页面中同名标签很多,通常返回第一个或列表。 |
| Link Text | By.LINK_TEXT |
专门用于定位超链接 (<a>), 且知道完整文本。 |
<a href="...">立即注册</a> |
链接文本发生变化时代码需修改;必须完全匹配。 |
| Partial Link | By.PARTIAL_LINK_TEXT |
定位超链接,只知道部分文本时。 | <a href="...">忘记密码?</a> |
可能匹配到多个元素,需确保部分文本的唯一性。 |
| XPath | By.XPATH |
万能。复杂层级、动态属性、无 ID/Name 时。支持路径、属性、文本、逻辑组合。 | <div><input type="text"></div> |
语法相对复杂;绝对路径性能低且易受页面结构变化影响(建议用相对路径)。 |
| CSS Selector | By.CSS_SELECTOR |
基于 DOM 结构快速定位,语法比 XPath 简洁。 | <input class="form" id="email"> |
不支持通过文本内容定位;复杂层级表达略逊于 XPath。 |
ID > Name > CSS Selector > XPath > Class Name > Link Text > Tag Name
常见 XPath 与 CSS 表达式速记
| 需求 | XPath 表达式示例 | CSS 表达式示例 |
|---|---|---|
| ID 定位 | //*[@id='kw'] |
#kw |
| Class 定位 | //*[@class='btn'] |
.btn (若有多个类名取其中一个) |
| 属性定位 | //input[@name='q'] |
input[name='q'] |
| 层级定位 | //form[@id='login']/input |
form#login > input (子) 或 form#login input (后代) |
| 文本定位 | //*[text()='登录'] |
CSS 不支持直接文本定位 |
| 模糊匹配 | //*[contains(@class, 'btn')] |
input[class*='btn'] |
<div class="a b c">(CSS):
By.CSS_SELECTOR, ".a.b.c"或By.CSS_SELECTOR, ".a"(如果 a 唯一)(XPath):
By.XPATH, "//*[@class='a b c']"(需注意 class 顺序) 或 contains(@class, 'a')匹配动态ID(如id="btn-123")
driver.find_element(By.XPATH, "//button[starts-with(@id, 'btn-')]")
css选择器
元素1>元素2父子关系元素1 元素2 上下级关系
标签名[属性名*='局部属性值'] 局部属性值定位
# 1. By.ID
# HTML: 元素拥有唯一的 id 属性
<input type="text" id="user_id" class="form-control" placeholder="请输入ID">
user_input = driver.find_element(By.ID, "user_id")
# 2. By.NAME
# HTML: 表单元素拥有 name 属性
<input type="text" name="username" class="form-control" placeholder="用户名">
username_input = driver.find_element(By.NAME, "username")
# 3. By.CLASS_NAME
# HTML: 元素拥有独特的类名 (注意:若有多个类名,只能取其中一个)
<button class="btn-submit-primary">提交订单</button>
submit_btn = driver.find_element(By.CLASS_NAME, "btn-submit-primary")
# 4. By.TAG_NAME
# HTML: 页面中普通的标签 (通常用于批量获取,此处演示获取第一个)
<input type="checkbox" name="agree">
first_checkbox = driver.find_element(By.TAG_NAME, "input")
# 5. By.LINK_TEXT
# HTML: 超链接标签,文本完全匹配
<a href="/register" class="link">立即注册</a>
register_link = driver.find_element(By.LINK_TEXT, "立即注册")
# 6. By.PARTIAL_LINK_TEXT
# HTML: 超链接标签,文本部分匹配 (例如链接文本很长,只记得一部分)
<a href="/help center">忘记密码怎么办?</a>
help_link = driver.find_element(By.PARTIAL_LINK_TEXT, "忘记密码")
# 7. By.XPATH
# HTML: 复杂结构或无唯一属性时,通过路径或属性组合定位
<div class="login-box"><input type="password" placeholder="密码"></div>
password_input = driver.find_element(By.XPATH, "//input[@placeholder='密码']")
# 8. By.CSS_SELECTOR
# HTML: 通过选择器语法快速定位 (支持 ID(#), Class(.), 属性([]))
<input type="email" id="email_addr" class="form-input">
email_input = driver.find_element(By.CSS_SELECTOR, "input#email_addr")