WebDriver 是一个强大的工具,它允许你通过代码控制一个真实的浏览器(如 Chrome、Firefox、Edge 等),就像一个人类用户一样与网页进行交互,结合 Python,你可以编写脚本来完成各种重复性的网页任务。

核心概念
理解几个核心概念:
- Selenium: 是一个用于 Web 应用测试的自动化框架,它提供了多种语言的 API(Python, Java, C# 等),是 WebDriver 的“大脑”。
- WebDriver: 是 Selenium 的核心组件,它是一个协议,用于程序和浏览器进行通信,你的 Python 脚本通过 WebDriver API 发送指令,WebDriver 再将这些指令翻译成浏览器可以理解的操作。
- 浏览器驱动: 每个主流浏览器(Chrome, Firefox, Edge)都有自己的驱动程序,这个驱动程序是连接你的 Python 脚本和浏览器的桥梁,Chrome 浏览器需要
ChromeDriver。
工作流程:
你的 Python 脚本 -> Selenium API -> WebDriver -> 浏览器驱动 -> 浏览器 -> 执行操作 -> 返回结果 -> WebDriver -> Selenium API -> 你的 Python 脚本
环境搭建
在开始编写代码之前,你需要完成以下准备工作:
步骤 1: 安装 Selenium 库
打开你的终端或命令提示符,使用 pip 进行安装:

pip install selenium
步骤 2: 安装浏览器及其对应驱动
这是最关键的一步,你需要确保你的浏览器版本和驱动版本大致匹配。
以 Chrome 浏览器为例:
-
检查 Chrome 版本: 打开 Chrome,进入
设置->Chrome,查看你的浏览器版本号(0.6422.112)。 -
下载 ChromeDriver:
(图片来源网络,侵删)- 访问 ChromeDriver 官方下载页面:https://googlechromelabs.github.io/chrome-for-testing/
- 找到与你 Chrome 版本最接近的
chromedriver。 - 下载对应你操作系统(Windows, Mac, Linux)和架构(64位)的
zip压缩包。
-
配置 ChromeDriver:
- 方法一(推荐):将驱动添加到系统环境变量 PATH 中
- 解压下载的
zip文件,你会得到一个chromedriver.exe(Windows) 或chromedriver(Mac/Linux) 文件。 - 将这个文件移动到一个固定的目录,
C:\WebDriver\(Windows) 或/usr/local/bin/(Mac/Linux)。 - 将这个目录添加到你系统的
PATH环境变量中,这样 Python 就能自动找到它。
- 解压下载的
- 在代码中指定驱动路径
- 将解压后的
chromedriver.exe文件放在你的 Python 项目文件夹下。 - 在代码中通过
executable_path参数明确指定它的路径。
- 将解压后的
- 方法一(推荐):将驱动添加到系统环境变量 PATH 中
第一个 WebDriver 脚本:打开网页
让我们从一个最简单的例子开始:打开 Google 搜索页面,并在搜索框中输入 "Selenium"。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
# --- 1. 设置 ChromeDriver 路径 ---
# 如果你已经将 chromedriver 添加到 PATH,可以省略这一步
# service = Service(executable_path='C:/path/to/your/chromedriver.exe')
# --- 2. 配置浏览器选项 ---
# 设置无头模式(不显示浏览器窗口)
# options = Options()
# options.add_argument("--headless")
# options.add_argument("--disable-gpu") # 无头模式通常需要禁用GPU
# --- 3. 初始化 WebDriver ---
# 使用 Service 对象来启动驱动
# driver = webdriver.Chrome(service=service, options=options)
# 如果驱动在 PATH 中,可以直接这样写:
driver = webdriver.Chrome()
try:
# --- 4. 访问网页 ---
print("正在打开 Google...")
driver.get("https://www.google.com")
# --- 5. 查找元素 ---
# 方法1:通过 name 属性查找 (最常用)
search_box = driver.find_element(By.NAME, "q")
# 方法2:通过 CSS 选择器查找
# search_box = driver.find_element(By.CSS_SELECTOR, "input[name='q']")
# 方法3:通过 XPath 查找 (非常强大)
# search_box = driver.find_element(By.XPATH, "//input[@name='q']")
# --- 6. 与元素交互 ---
print("正在输入搜索词...")
search_box.send_keys("Selenium")
search_box.send_keys(Keys.ENTER) # 模拟按下回车键
# --- 7. 等待与获取信息 ---
# 等待3秒,让页面加载
time.sleep(3)
# 获取页面标题
page_title = driver.title
print(f"当前页面标题是: {page_title}")
# 获取URL
current_url = driver.current_url
print(f"当前页面URL是: {current_url}")
# --- 8. 关闭浏览器 ---
# driver.quit() # 关闭整个浏览器,释放所有资源
# driver.close() # 只关闭当前标签页
finally:
# 使用 finally 确保浏览器一定会被关闭
print("正在关闭浏览器...")
driver.quit()
代码解释:
from selenium import webdriver: 导入 Selenium 的 WebDriver 模块。driver = webdriver.Chrome(): 创建一个 Chrome 浏览器实例,这会启动你的 Chrome 浏览器。driver.get("url"): 导航到指定的网页。driver.find_element(): 查找页面上的单个元素。By.NAME: 通过元素的name属性查找。By.CSS_SELECTOR: 通过 CSS 选择器查找。By.XPATH: 通过 XPath 路径查找。By.ID,By.CLASS_NAME,By.TAG_NAME等也是常用的定位方式。
element.send_keys(): 在输入框中输入文本。element.send_keys(Keys.ENTER): 模拟键盘按键,如回车、Tab 等。driver.title: 获取当前页面的<title>标签内容。driver.current_url: 获取当前页面的 URL。driver.quit(): 非常重要! 关闭浏览器并完全结束 WebDriver 进程,这能释放内存和端口资源。driver.close(): 只关闭当前活动的标签页或窗口。
更高级的用法
显式等待 vs. 隐式等待
在上面的例子中,我们使用了 time.sleep(3),这是一种“硬等待”,它会强制脚本暂停3秒,无论页面是否已经加载完成,这通常效率低下且不稳定。
更好的方法是使用显式等待,它会等待某个条件(如元素可见、可点击)满足后再继续执行,最多等待指定的时间。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ...
try:
driver.get("https://www.google.com")
# 显式等待:最多等待10秒,直到找到一个 name 为 "q" 的元素并且可见
print("等待搜索框出现...")
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.NAME, "q"))
)
# 或者等待元素可见
# search_box = WebDriverWait(driver, 10).until(
# EC.visibility_of_element_located((By.NAME, "q"))
# )
search_box.send_keys("Selenium")
search_box.send_keys(Keys.ENTER)
# 再次显式等待,直到标题包含 "Selenium"
print("等待搜索结果页面加载...")
WebDriverWait(driver, 10).until(
EC.title_contains("Selenium")
)
print(f"页面标题已更新为: {driver.title}")
finally:
driver.quit()
处理弹窗
# 假设页面上有一个 alert 弹窗 driver.find_element(By.ID, "show-alert-button").click() # 切换到 alert alert = driver.switch_to.alert # 获取弹窗文本 print(alert.text) # 接受弹窗 (点击"确定") alert.accept() # 或者取消弹窗 (点击"取消") # alert.dismiss()
处理 iframe
如果页面元素在一个 iframe 内,你需要先切换到该 iframe,才能操作里面的元素。
# 假设 iframe 的 id 是 "my-iframe"
driver.switch_to.frame("my-iframe")
# 现在可以操作 iframe 内部的元素了
iframe_element = driver.find_element(By.ID, "element-inside-iframe")
iframe_element.click()
# 操作完成后,切回主页面
driver.switch_to.default_content()
截图
driver.get("https://www.google.com")
driver.save_screenshot("google_homepage.png")
print("截图已保存为 google_homepage.png")
最佳实践
- 使用显式等待:避免使用
time.sleep(),优先使用WebDriverWait。 - 定位元素要稳定:尽量使用
ID、name、CSS Selector或XPath。ID通常是最好、最稳定的定位方式,避免使用可能动态变化的class名称。 - 使用
try...finally或with语句:确保无论脚本执行成功还是失败,浏览器都会被正确关闭,释放资源。 - 管理好浏览器驱动:将驱动文件放在一个固定的目录并添加到
PATH,或者使用像webdriver-manager这样的库来自动管理驱动版本。 - 处理异常:使用
try...except块来捕获可能出现的异常,如NoSuchElementException(元素未找到)、TimeoutException(等待超时)等,让你的脚本更健壮。
自动管理浏览器驱动 (推荐手动管理驱动后)
为了避免手动下载和管理驱动版本的麻烦,可以使用 webdriver-manager 库。
-
安装:
pip install webdriver-manager
-
使用:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 它会自动下载并管理驱动 service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service) # ... 你的代码 ... driver.quit()
这个库会根据你安装的 Chrome 浏览器版本,自动下载匹配的
chromedriver,非常方便。
Python + WebDriver 是一个功能极其强大的组合,广泛应用于:
- 自动化测试:模拟用户操作,测试 Web 应用的功能。
- 数据爬取:当页面内容由 JavaScript 动态加载时,Selenium 可以渲染页面后再抓取数据。
- 重复性任务自动化:每天自动登录网站、填写表单、下载报告等。
希望这份详细的指南能帮助你顺利入门 Python WebDriver!
