好的,我可以帮你整理一份 Selenium 实战指南,涵盖从入门到实战的完整流程,包括环境搭建、核心操作、进阶技巧以及常见问题解决方案。为了便于阅读,我会分模块讲解,并配合示例代码。以下内容基于 Python + Selenium,但核心概念对 Java、C# 等语言也适用。
Selenium 实战指南
1️⃣ Selenium 简介
Selenium 是一个开源的 Web 自动化测试工具,可以模拟用户操作浏览器,实现自动化测试、网页数据抓取(爬虫)等功能。
Selenium 核心组成:
| 组件 | 功能 |
|---|---|
| Selenium WebDriver | 通过代码驱动浏览器,实现操作页面元素、表单提交、点击等 |
| Selenium IDE | 浏览器插件,可录制操作生成测试脚本(适合初学者) |
| Selenium Grid | 分布式测试工具,支持多浏览器多平台并行测试 |
Selenium 支持多种浏览器:Chrome、Firefox、Edge、Safari 等。
2️⃣ 环境搭建
2.1 安装 Python 和 Selenium
# 安装 Selenium
pip install selenium
2.2 下载浏览器驱动
Selenium WebDriver 需要浏览器对应的驱动:
- Chrome: chromedriver
- Firefox: geckodriver
- Edge: msedgedriver
驱动版本需与浏览器版本匹配,并放到系统 PATH 或指定路径。
2.3 简单示例
from selenium import webdriver
driver = webdriver.Chrome() # 启动浏览器
driver.get("https://www.baidu.com") # 打开网页
print(driver.title) # 打印网页标题
driver.quit() # 关闭浏览器
3️⃣ 核心操作
3.1 查找元素
Selenium 提供多种方式定位元素:
from selenium.webdriver.common.by import By
# 根据 id
driver.find_element(By.ID, "kw")
# 根据 name
driver.find_element(By.NAME, "wd")
# 根据 class
driver.find_element(By.CLASS_NAME, "s_ipt")
# 根据 CSS selector
driver.find_element(By.CSS_SELECTOR, "#kw")
# 根据 XPath
driver.find_element(By.XPATH, "//input[@id='kw']")
⚠️ 实战技巧
- 优先用 ID 或 Name,速度快且稳定
- CSS Selector 和 XPath 灵活,但维护成本高
3.2 元素操作
# 输入文本
input_box = driver.find_element(By.ID, "kw")
input_box.send_keys("Selenium 教程")
# 点击按钮
search_btn = driver.find_element(By.ID, "su")
search_btn.click()
# 获取文本
result_text = driver.find_element(By.XPATH, "//div[@id='content_left']").text
print(result_text)
3.3 等待机制
网页加载是异步的,直接操作可能报错,需要等待元素加载完成。
from selenium.webdriver.common.by import By
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.ID, "kw"))
)
# 隐式等待
driver.implicitly_wait(5) # 每次查找元素最多等待 5 秒
3.4 窗口、Frame 与 Alert
# 切换窗口
driver.switch_to.window(driver.window_handles[1])
# 切换 iframe
driver.switch_to.frame("frame_name")
# 弹窗处理
alert = driver.switch_to.alert
alert.accept() # 确认
alert.dismiss() # 取消
4️⃣ 高级技巧
4.1 模拟鼠标键盘操作
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
# 鼠标悬停
element = driver.find_element(By.ID, "menu")
ActionChains(driver).move_to_element(element).perform()
# 键盘操作
input_box.send_keys(Keys.CONTROL + "a") # 全选
input_box.send_keys(Keys.DELETE) # 删除
4.2 截图
driver.save_screenshot("screenshot.png")
4.3 滚动页面
# JS 滚动
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
4.4 处理文件上传下载
# 文件上传
driver.find_element(By.ID, "file").send_keys("/path/to/file.txt")
下载文件可以通过修改浏览器设置实现自动保存。
5️⃣ Selenium + 爬虫实战示例
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
driver = webdriver.Chrome()
driver.get("https://quotes.toscrape.com/")
quotes = []
while True:
elements = driver.find_elements(By.CLASS_NAME, "quote")
for e in elements:
text = e.find_element(By.CLASS_NAME, "text").text
author = e.find_element(By.CLASS_NAME, "author").text
quotes.append({"text": text, "author": author})
try:
next_btn = driver.find_element(By.CSS_SELECTOR, ".next > a")
next_btn.click()
except:
break
driver.quit()
print(quotes)
✅ 该示例实现了翻页爬取网页名言数据。
6️⃣ 常见问题与解决
| 问题 | 解决方案 |
|---|---|
| ElementNotInteractableException | 元素未加载完成,增加等待时间或滚动页面 |
| selenium.common.exceptions.TimeoutException | 显式等待时间不够,适当延长等待 |
| 驱动版本不匹配 | 更新驱动或浏览器版本 |
| 弹窗阻塞操作 | 使用 driver.switch_to.alert 处理 |
7️⃣ 实战技巧总结
- 优先使用显式等待,稳定性高
- 选择合适的元素定位方式,ID > Name > CSS > XPath
- 分模块封装:页面操作、数据提取、异常处理
- 尽量模拟真实浏览器行为,避免被反爬机制阻挡
- 结合 Pandas、Excel 或数据库 保存抓取数据
发表回复