以下是 Python + Selenium 超详细新手教程(2026 年最新版):从零开始掌握浏览器自动化。
这份教程基于 Selenium 4.40+(2026 年 1 月最新稳定版)和 Python 3.12/3.13,重点解决新手最痛的几个问题:
- 驱动安装不再手动下载(Selenium Manager 自动搞定)
- headless / 无头模式 / 绕过检测
- 常见元素定位、等待、交互、异常处理
- 真实项目场景示例(登录、爬取、表单填写、截图等)
0. 为什么 2026 年还在学 Selenium?
- 动态 JS 页面、复杂交互、文件上传、验证码绕过等场景,Playwright / Puppeteer 虽快,但 Selenium 生态最成熟、职位最多、云测试平台支持最好。
- Selenium Manager(4.6+ 内置)让安装难度大幅降低,新手友好度暴涨。
1. 环境准备(5 分钟搞定)
步骤 1:安装 Selenium(包含 Selenium Manager)
pip install --upgrade selenium
# 推荐额外安装(方便调试、等待、日志)
pip install webdriver-manager # 可选,Selenium Manager 已够用,但有时更稳定
步骤 2:验证安装
from selenium import webdriver
print(webdriver.__version__) # 应该 ≥ 4.40.0
2026 年关键变化:
- Selenium 4.6+ 内置 Selenium Manager(Rust 实现),自动下载匹配你浏览器版本的 chromedriver/geckodriver/msedgedriver 等。
- 不再需要手动去 chromedriver.chromium.org 下载驱动,也不用放 PATH。
2. 第一个程序:打开浏览器 + 访问页面
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# ------------------- 方式一:最简单(推荐新手) -------------------
driver = webdriver.Chrome() # 自动使用 Selenium Manager 下载驱动
driver.get("https://www.python.org")
print(driver.title) # Python.org 标题
driver.quit() # 必须关闭,否则进程残留
方式二:无头模式(headless)——后台运行,不弹出窗口
options = Options()
options.add_argument("--headless=new") # 现代无头模式(Chrome 109+ 推荐)
options.add_argument("--disable-gpu") # 部分系统需要
options.add_argument("--no-sandbox") # Linux / Docker 常见
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get("https://www.google.com")
print(driver.page_source[:200]) # 输出部分 HTML
driver.quit()
方式三:加一些防检测参数(爬虫/防反爬常用)
options = Options()
options.add_argument("--headless=new")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options)
3. 核心概念:元素定位(8 大主流方式)
| 定位方式 | 语法示例 | 适用场景 | 优先级建议 |
|---|---|---|---|
| id | find_element(By.ID, “kw”) | 最高优先,唯一性强 | ★★★★★ |
| name | find_element(By.NAME, “wd”) | 表单 input name | ★★★★☆ |
| class name | find_element(By.CLASS_NAME, “s_ipt”) | 单个 class | ★★★☆☆ |
| tag name | find_elements(By.TAG_NAME, “a”) | 找所有链接/按钮 | ★★☆☆☆ |
| link text | find_element(By.LINK_TEXT, “新闻”) | 精确匹配超链接文字 | ★★★☆☆ |
| partial link text | find_element(By.PARTIAL_LINK_TEXT, “新”) | 模糊匹配链接文字 | ★★☆☆☆ |
| css selector | find_element(By.CSS_SELECTOR, “#kw”) .s_ipt input[type=’text’] | 最强大、最快、推荐掌握 | ★★★★★ |
| xpath | find_element(By.XPATH, “//*[@id=’kw’]”) //input[@name=’wd’] | 最灵活,但慢、易碎 | ★★★★☆ |
推荐顺序(2026 年最佳实践):
ID > name > css > xpath(最后用) > class > link text
代码示例(百度搜索)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 定位搜索框(多种写法等价)
search_box = driver.find_element(By.ID, "kw")
# search_box = driver.find_element(By.NAME, "wd")
# search_box = driver.find_element(By.CSS_SELECTOR, "#kw")
# search_box = driver.find_element(By.XPATH, "//input[@id='kw']")
search_box.clear() # 清空
search_box.send_keys("Python Selenium 教程")
search_box.send_keys(Keys.ENTER) # 回车搜索
time.sleep(3) # 粗暴等待(后面学智能等待)
print(driver.title)
driver.quit()
4. 必须掌握:显式等待(WebDriverWait)——避免 sleep 地狱
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, timeout=10, poll_frequency=0.5) # 每0.5秒检查一次,最多等10秒
# 等待元素可见
wait.until(EC.visibility_of_element_located((By.ID, "result_logo")))
# 等待元素可点击
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn.btn-primary")))
# 等待标题包含某文字
wait.until(EC.title_contains("Python"))
常用 EC(expected_conditions):
- visibility_of_element_located
- presence_of_element_located(在 DOM 中即可,不必可见)
- element_to_be_clickable
- text_to_be_present_in_element
- title_is / title_contains
- staleness_of(元素消失)
5. 常见交互操作汇总
element = driver.find_element(By.ID, "su")
element.click() # 点击
element.send_keys("输入内容") # 输入
element.clear() # 清空输入框
element.get_attribute("value") # 获取 value 属性
element.text # 获取显示文本
element.is_displayed() # 是否可见
element.is_enabled() # 是否可用
element.is_selected() # radio/checkbox 是否选中
# 浏览器操作
driver.back()
driver.forward()
driver.refresh()
driver.maximize_window()
driver.set_window_size(1200, 800)
driver.save_screenshot("baidu.png") # 截图
6. 窗口/iframe/警报处理
# 切换窗口(多标签)
handles = driver.window_handles
driver.switch_to.window(handles[1]) # 切换到第二个标签
# 切换 iframe
driver.switch_to.frame("iframe_id_or_name_or_element")
driver.switch_to.default_content() # 切回主文档
# 处理 alert/confirm/prompt
alert = driver.switch_to.alert
alert.accept() # 确认
alert.dismiss() # 取消
alert.text # 获取弹窗文字
alert.send_keys("输入") # prompt 输入
7. 真实项目小实战:自动登录某网站(伪代码)
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 15)
driver.get("https://example.com/login")
wait.until(EC.presence_of_element_located((By.NAME, "username"))).send_keys("your_account")
driver.find_element(By.NAME, "password").send_keys("your_pass")
driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
# 等待登录成功(例如个人中心元素出现)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "user-avatar")))
print("登录成功!")
driver.save_screenshot("login_success.png")
8. 常见报错 & 解决方案(2026 年高频)
| 错误 | 原因 & 解决办法 |
|---|---|
| NoSuchDriverException | 浏览器版本与驱动不匹配 → 升级 selenium 或用 webdriver-manager 强制更新 |
| ElementNotInteractableException | 元素被遮挡/不可见 → 加等待 + scrollIntoView 或 ActionChains 移动鼠标 |
| StaleElementReferenceException | 页面刷新后元素失效 → 重新定位元素,不要缓存 element |
| TimeoutException | 等待超时 → 延长 timeout 或检查 locator 是否正确 |
| SessionNotCreatedException | 驱动版本错 → Selenium Manager 自动处理,若失败:options.add_argument(“–headless=new”) |
| undetected-chromedriver 检测 | 网站强反爬 → 用 undetected-chromedriver 库(pip install undetected-chromedriver) |
9. 进阶方向建议(学完基础后)
- Page Object Model(POM)设计模式
- pytest + selenium 集成(推荐测试框架)
- 处理验证码(OCR / 人工打码平台)
- 多线程/分布式(selenium-grid)
- 结合 Playwright 迁移(未来趋势)
- headless + proxy + user-agent 随机 → 爬虫防封
一句话总结:
2026 年 Selenium 安装几乎零成本(Selenium Manager 功不可没),学会 显式等待 + CSS 定位 + POM,你就基本能应对 90% 的浏览器自动化需求。
有哪部分还想再细讲?
例如:
- 如何处理滑块验证码
- POM 完整项目模板
- headless + 绕过 Cloudflare / Akamai
- pytest + allure 报告
随时告诉我,我继续展开~