好的,我可以帮你整理一份 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 需要浏览器对应的驱动:

驱动版本需与浏览器版本匹配,并放到系统 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️⃣ 实战技巧总结

  1. 优先使用显式等待,稳定性高
  2. 选择合适的元素定位方式,ID > Name > CSS > XPath
  3. 分模块封装:页面操作、数据提取、异常处理
  4. 尽量模拟真实浏览器行为,避免被反爬机制阻挡
  5. 结合 Pandas、Excel 或数据库 保存抓取数据