Selenium 教程
下面是一份完整、实用的 Selenium 教程(以 Python 为例),从零基础到进阶,适合初学者和有经验的开发者快速上手。教程基于 Selenium 4.x(最新稳定版)。
一、Selenium 是什么?
Selenium 是一个用于自动化 Web 浏览器的开源工具,支持:
- 网页自动化测试
- 网页抓取(爬虫)
- 模拟用户操作(如登录、点击、填表)
支持语言:Python、Java、C#、Ruby、JavaScript 等
支持浏览器:Chrome、Firefox、Edge、Safari 等
二、环境准备
1. 安装 Python(3.8+)
python --version
2. 安装 Selenium
pip install selenium
3. 下载浏览器驱动(WebDriver)
| 浏览器 | 下载地址 | 说明 |
|---|---|---|
| Chrome | https://chromedriver.chromium.org/ | 版本要和 Chrome 浏览器一致 |
| Firefox | https://github.com/mozilla/geckodriver/releases | |
| Edge | https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ |
推荐:使用
webdriver-manager自动管理驱动!
pip install webdriver-manager
三、第一个 Selenium 脚本
# hello_selenium.py
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 自动下载并使用匹配的 ChromeDriver
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
try:
driver.get("https://www.baidu.com")
print("页面标题:", driver.title)
finally:
driver.quit()
运行:
python.py hello_selenium.py
四、核心操作大全
1. 打开网页
driver.get("https://httpbin.org")
2. 查找元素(8 种定位方式)
| 方法 | 示例 | 说明 |
|---|---|---|
| ID | driver.find_element("id", "kw") | 最快 |
| Name | find_element("name", "wd") | |
| Class Name | find_element("class name", "s_ipt") | |
| Tag Name | find_element("tag name", "input") | |
| Link Text | find_element("link text", "新闻") | 完整链接文本 |
| Partial Link Text | find_element("partial link text", "新") | 部分匹配 |
| XPath | find_element("xpath", "//input[@id='kw']") | 最强大 |
| CSS Selector | find_element("css selector", "#kw") | 推荐 |
推荐使用 CSS 或 XPath
from selenium.webdriver.common.by import By
element = driver.find_element(By.ID, "kw")
element = driver.find_element(By.XPATH, "//input[@name='wd']")
element = driver.find_element(By.CSS_SELECTOR, "input.s_ipt")
3. 输入文本 & 点击
from selenium.webdriver.common.by import By
# 百度搜索示例
driver.get("https://www.baidu.com")
# 输入搜索词
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium 教程")
# 点击搜索按钮
search_btn = driver.find_element(By.ID, "su")
search_btn.click()
# 等待结果(后面讲)
import time
time.sleep(3)
4. 获取文本 / 属性
title = driver.title
url = driver.current_url
text = element.text
value = element.get_attribute("value")
五、等待机制(重点!避免元素未加载)
1. 固定等待(不推荐)
time.sleep(2)
2. 隐式等待(全局)
driver.implicitly_wait(10) # 最多等10秒
3. 显式等待(推荐!精准)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(
EC.presence_of_element_located((By.ID, "result"))
)
# 或等待可点击
btn = wait.until(EC.element_to_be_clickable((By.ID, "su")))
常用条件:
presence_of_element_located:元素存在 DOMvisibility_of_element_located:元素可见element_to_be_clickable:可点击title_contains("xxx")
六、处理弹窗、iframe、下拉框
1. Alert 弹窗
alert = driver.switch_to.alert
print(alert.text)
alert.accept() # 确定
# alert.dismiss() # 取消
2. iframe 切换
driver.switch_to.frame("iframe_id")
# 操作完后切回主文档
driver.switch_to.default_content()
3. Select 下拉框
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, "dropdown"))
select.select_by_visible_text("Option 1")
select.select_by_value("1")
select.select_by_index(0)
七、鼠标 & 键盘操作
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
actions = ActionChains(driver)
# 鼠标悬停
actions.move_to_element(element).perform()
# 双击
actions.double_click(element).perform()
# 右键
actions.context_click(element).perform()
# 拖拽
actions.drag_and_drop(source, target).perform()
# 键盘:回车、Ctrl+A
element.send_keys(Keys.ENTER)
element.send_keys(Keys.CONTROL, "a")
八、截图 & 保存页面
driver.save_screenshot("baidu.png")
# 获取页面源码
html = driver.page_source
九、无头模式(Headless)—— 服务器运行
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless") # 无头
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
十、完整实战案例:登录网站
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wait = WebDriverWait(driver, 10)
try:
driver.get("https://httpbin.org/forms/post")
# 填写表单
wait.until(EC.presence_of_element_located((By.NAME, "custname"))).send_keys("张三")
driver.find_element(By.NAME, "custtel").send_keys("13800000000")
driver.find_element(By.NAME, "custemail").send_keys("zhangsan@example.com")
driver.find_element(By.NAME, "size").click() # 小号
driver.find_element(By.NAME, "topping", value="cheese").click()
# 提交
driver.find_element(By.CSS_SELECTOR, "input[type='submit']").click()
print("提交成功!")
finally:
driver.quit()
十一、高级技巧
1. 执行 JavaScript
driver.execute_script("alert('Hello Selenium!');")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
2. 多窗口切换
handles = driver.window_handles
driver.switch_to.window(handles[1]) # 切换到新窗口
3. 处理文件上传
file_input = driver.find_element(By.ID, "upload")
file_input.send_keys("/path/to/file.txt") # 绝对路径
十二、常见问题 & 解决方案
| 问题 | 解决方案 |
|---|---|
session not created | 驱动版本不匹配 → 用 webdriver-manager |
| 元素找不到 | 使用显式等待 + 正确定位 |
| 验证码 | 使用 Cookie 登录 / OCR / 手动跳过 |
| 被反爬 | 加随机延迟、Headless、代理、伪装 User-Agent |
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
十三、推荐资源
- 官方文档:https://www.selenium.dev/documentation/
- GitHub:https://github.com/SeleniumHQ/selenium
- 教程视频:B站搜索 “Selenium Python 教程”
- 工具:
webdriver-manager,selenium-stealth(防检测)
十四、总结:Selenium 学习路线
- 掌握基本操作(打开、查找、点击、输入)
- 学会等待机制(显式等待)
- 处理复杂元素(iframe、alert、select)
- 学会调试(打印 title、截图、日志)
- 进阶:Page Object 模式、unittest/pytest 集成
- 实战:爬取动态网站、自动化测试
现在就动手写第一个脚本吧!
print("你已经学会 Selenium 了!🚀")
需要我生成一个 可运行的完整项目模板(含登录、搜索、翻页、保存数据)吗?回复 yes 我立刻给你!