Selenium 使用方法一览表(基于 Selenium 4.x)
Selenium 是自动化测试/网页爬虫常用工具,核心用于模拟浏览器交互。以下按「环境搭建→核心操作→常用场景→进阶技巧→注意事项」分类整理,方便快速查阅。
一、环境搭建
1. 依赖安装
| 操作 | 命令/步骤 |
|---|---|
| 安装 Selenium | pip install selenium(推荐 4.x 版本,兼容更多浏览器特性) |
| 安装浏览器驱动 | 需与浏览器版本匹配,推荐用 webdriver-manager 自动管理:pip install webdriver-manager |
| 支持浏览器 | Chrome(首选)、Firefox、Edge、Safari |
2. 驱动自动配置(无需手动下载)
| 浏览器 | 代码示例(Python) |
|---|---|
| Chrome | from selenium import webdriver; from selenium.webdriver.chrome.service import Service; from webdriver_manager.chrome import ChromeDriverManager; driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) |
| Firefox | from webdriver_manager.firefox import GeckoDriverManager; driver = webdriver.Firefox(service=Service(GeckoDriverManager().install())) |
| Edge | from webdriver_manager.microsoft import EdgeChromiumDriverManager; driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install())) |
二、核心基础操作
1. 浏览器控制
| 功能 | 代码示例 |
|---|---|
| 打开网页 | driver.get("https://www.baidu.com") |
| 刷新页面 | driver.refresh() |
| 后退 | driver.back() |
| 前进 | driver.forward() |
| 设置窗口大小 | driver.set_window_size(1920, 1080)(宽/高)或 driver.maximize_window()(最大化) |
| 获取当前URL | driver.current_url |
| 获取页面标题 | driver.title |
| 截图保存 | driver.save_screenshot("截图路径.png") |
| 关闭当前标签页 | driver.close() |
| 关闭浏览器(所有标签) | driver.quit() |
2. 元素定位(核心)
需先导入 from selenium.webdriver.common.by import By,支持 8 种定位方式:
| 定位方式 | 语法格式 | 适用场景 | 示例 |
|---|---|---|---|
| ID | driver.find_element(By.ID, "id值") |
元素有唯一ID(首选) | driver.find_element(By.ID, "kw")(百度搜索框) |
| Name | driver.find_element(By.NAME, "name值") |
元素有name属性 | driver.find_element(By.NAME, "wd") |
| Class Name | driver.find_element(By.CLASS_NAME, "类名") |
元素有class属性(注意:类名含空格需拆分) | driver.find_element(By.CLASS_NAME, "s_ipt") |
| Tag Name | driver.find_element(By.TAG_NAME, "标签名") |
页面唯一标签(如 <title>) |
driver.find_element(By.TAG_NAME, "input") |
| Link Text | driver.find_element(By.LINK_TEXT, "链接文本") |
超链接完整文本匹配 | driver.find_element(By.LINK_TEXT, "新闻") |
| Partial Link Text | driver.find_element(By.PARTIAL_LINK_TEXT, "部分文本") |
超链接部分文本匹配 | driver.find_element(By.PARTIAL_LINK_TEXT, "新") |
| XPath | driver.find_element(By.XPATH, "xpath表达式") |
通用定位(复杂场景首选) | 绝对路径:/html/body/div[1]/input;相对路径://input[@id="kw"] |
| CSS Selector | driver.find_element(By.CSS_SELECTOR, "css表达式") |
定位效率高于XPath | driver.find_element(By.CSS_SELECTOR, "#kw")(ID选择器)、.s_ipt(类选择器) |
说明:
find_element()返回单个元素,find_elements()返回元素列表(无匹配时返回空列表,不报错)。
3. 元素交互操作
| 操作 | 代码示例 | 适用元素 |
|---|---|---|
| 输入文本 | element.send_keys("输入内容") |
输入框(input、textarea) |
| 清空输入框 | element.clear() |
输入框 |
| 点击元素 | element.click() |
按钮、链接、复选框等可点击元素 |
| 提交表单 | element.submit() |
表单内元素(等价于点击提交按钮) |
| 获取元素文本 | element.text |
非输入框元素(如div、span、链接) |
| 获取元素属性 | element.get_attribute("属性名")(如 src、href、value) |
所有元素 |
| 获取输入框当前值 | element.get_attribute("value") |
输入框(input) |
| 判断元素是否可见 | element.is_displayed()(返回布尔值) |
所有元素 |
| 判断元素是否可用 | element.is_enabled() |
输入框、按钮等 |
| 判断复选框是否选中 | element.is_selected() |
复选框、单选框 |
三、常用场景操作
1. 等待机制(解决元素加载延迟)
| 等待类型 | 语法格式 | 特点 | 示例 |
|---|---|---|---|
| 隐式等待 | driver.implicitly_wait(10)(单位:秒) |
全局等待,所有元素定位最多等待N秒 | 初始化后调用:driver.implicitly_wait(10) |
| 显式等待 | WebDriverWait(driver, 超时时间).until(条件) |
针对单个元素的精准等待(推荐) | from selenium.webdriver.support.ui import WebDriverWait; from selenium.webdriver.support import expected_conditions as EC; WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw"))) |
| 强制等待 | time.sleep(3)(单位:秒) |
固定等待N秒(不推荐,效率低) | import time; time.sleep(3) |
显式等待常用条件:
EC.presence_of_element_located(元素存在)、EC.visibility_of_element_located(元素可见)、EC.element_to_be_clickable(元素可点击)。
2. 窗口/标签页切换
| 功能 | 代码示例 |
|---|---|
| 获取所有窗口句柄 | handles = driver.window_handles(返回列表,按打开顺序排列) |
| 切换到最新打开的窗口 | driver.switch_to.window(handles[-1]) |
| 切换到指定窗口 | driver.switch_to.window("窗口句柄") |
| 切换到iframe框架 | driver.switch_to.frame("iframe的ID/name/元素")(无ID时先定位iframe元素) |
| 退出iframe框架 | driver.switch_to.default_content() |
3. 下拉框操作(需导入 Select 类)
| 功能 | 代码示例 |
|---|---|
| 初始化下拉框 | from selenium.webdriver.support.ui import Select; select = Select(element) |
| 按索引选择(0开始) | select.select_by_index(0) |
| 按value属性选择 | select.select_by_value("value值") |
| 按可见文本选择 | select.select_by_visible_text("选项文本") |
| 取消所有选择(仅多选) | select.deselect_all() |
| 获取所有选项 | select.options(返回选项元素列表) |
4. 文件上传/下载
| 操作 | 代码示例 |
|---|---|
| 文件上传(input类型) | 定位上传按钮后直接传入文件路径:element.send_keys("本地文件绝对路径") |
| 文件下载(Chrome) | 配置下载路径:options = webdriver.ChromeOptions(); prefs = {"download.default_directory": "下载路径"}; options.add_experimental_option("prefs", prefs); driver = webdriver.Chrome(options=options) |
5. 弹窗处理(Alert/Confirm/Prompt)
| 弹窗类型 | 操作代码 |
|---|---|
| 切换到弹窗 | alert = driver.switch_to.alert |
| 点击确定 | alert.accept() |
| 点击取消 | alert.dismiss()(仅Confirm/Prompt) |
| 输入文本 | alert.send_keys("输入内容")(仅Prompt) |
| 获取弹窗文本 | alert.text |
四、进阶技巧
1. 浏览器配置(Options)
| 功能 | 代码示例(Chrome) |
|---|---|
| 无头模式(无界面运行) | options.add_argument("--headless=new")(Selenium 4.x 推荐,旧版用 --headless) |
| 禁用图片加载 | prefs = {"profile.managed_default_content_settings.images": 2}; options.add_experimental_option("prefs", prefs) |
| 设置User-Agent | options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0") |
| 忽略SSL错误 | options.add_argument("--ignore-certificate-errors") |
| 最大化启动 | options.add_argument("--start-maximized") |
2. 执行JavaScript代码
| 功能 | 代码示例 |
|---|---|
| 执行JS语句 | driver.execute_script("JS代码") |
| 滚动到页面底部 | driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") |
| 滚动到元素可见 | driver.execute_script("arguments[0].scrollIntoView();", element) |
| 修改元素属性 | driver.execute_script("arguments[0].setAttribute('属性名', '新值')", element) |
3. Page Object 设计模式(PO模式)
核心思想:将页面封装为类,提高代码复用性和可维护性。
python
class BaiduPage:
def __init__(self, driver):
self.driver = driver
self.url = "https://www.baidu.com"
self.search_input = (By.ID, "kw") # 元素定位表达式封装
self.search_btn = (By.ID, "su")
def open(self):
self.driver.get(self.url)
def search(self, keyword):
# 显式等待元素可见并输入
WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.search_input)).send_keys(keyword)
# 点击搜索按钮
self.driver.find_element(*self.search_btn).click()
# 使用示例
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
baidu_page = BaiduPage(driver)
baidu_page.open()
baidu_page.search("Selenium")
driver.quit()
五、注意事项
- 版本兼容 :Selenium 4.x 废弃了旧版
find_element_by_*方法(如find_element_by_id),统一使用find_element(By.XXX, value)。 - 等待优先级:显式等待 > 隐式等待 > 强制等待,避免混用隐式和显式等待(可能导致等待时间叠加)。
- 元素定位原则:优先用 ID/Name(高效),复杂场景用 XPath/CSS Selector(灵活),避免使用绝对 XPath(易维护性差)。
- 反爬规避 :合理设置等待时间、使用真实 User-Agent、避免高频次操作,必要时配置代理(
options.add_argument("--proxy-server=http://代理IP:端口"))。 - 异常处理 :建议用
try-except捕获元素未找到、超时等异常(如NoSuchElementException、TimeoutException)。 - 资源释放 :测试/爬虫结束后必须调用
driver.quit(),避免浏览器进程残留。
六、常用异常(需导入)
python
from selenium.common.exceptions import (
NoSuchElementException, # 元素未找到
TimeoutException, # 超时
ElementNotVisibleException, # 元素不可见
ElementNotInteractableException # 元素不可交互
)