Selenium 是一个用于 Web 应用程序测试的工具,它可以直接在浏览器中运行,就像真实用户一样,Selenium 可以模拟用户的各种操作,比如点击按钮、填写表单、导航到不同的页面等,通过 Python 的 Selenium 绑定,我们可以用 Python 脚本来控制浏览器,实现自动化测试、数据爬取等任务。

Selenium 的核心概念
在学习使用之前,先理解几个核心组件:
- WebDriver: 这是 Selenium 的核心,它是一个浏览器自动化框架,可以让你用代码控制浏览器,你可以把它想象成一个“机器人手臂”,它接管了你的浏览器,并根据你的指令执行操作。
- 浏览器驱动 (Browser Drivers): 不同的浏览器(如 Chrome, Firefox, Edge)需要不同的驱动程序,驱动程序是 WebDriver 和浏览器之间的“翻译官”,它将你的 Python 代码转换成浏览器能够理解的指令。
- Chrome ->
chromedriver - Firefox ->
geckodriver - Edge ->
msedgedriver
- Chrome ->
- 元素定位: 要与页面上的元素(如按钮、输入框、链接)交互,首先需要找到它们,Selenium 提供了多种定位方式,最常用的有:
find_element(By.ID, "value"): 通过元素的 ID 定位(最推荐,因为 ID 通常是唯一的)。find_element(By.CLASS_NAME, "value"): 通过元素的 class 名称定位。find_element(By.TAG_NAME, "value"): 通过 HTML 标签名定位(如div,a,input)。find_element(By.NAME, "value"): 通过元素的 name 属性定位。find_element(By.XPATH, "value"): 通过 XPath 路径定位(非常强大和灵活)。find_element(By.CSS_SELECTOR, "value"): 通过 CSS 选择器定位(同样非常强大)。find_elements(...): 用于查找所有匹配的元素,返回一个列表。
安装与环境配置
1 安装 Selenium 库
使用 pip 安装:
pip install selenium
2 下载浏览器驱动
这是最关键的一步,你需要下载与你浏览器版本相匹配的驱动程序。
以 Chrome 为例:

- 查看 Chrome 版本:打开 Chrome 浏览器,进入
设置->Chrome,记下版本号(0.6312.86)。 - 下载驱动:
- 访问 Chrome for Testing availability (https://googlechromelabs.github.io/chrome-for-testing/)。
- 找到与你 Chrome 版本最匹配的
chromedriver。 - 下载对应你操作系统(Windows, macOS, Linux)和系统架构(64-bit)的
zip压缩包。 - 解压压缩包,你会得到一个
chromedriver.exe(Windows) 或chromedriver(macOS/Linux) 文件。
- 配置驱动路径:
- 方法一(推荐): 将
chromedriver.exe文件放到你的 Python 脚本所在的同一个目录下,这样 Selenium 会自动找到它。 - 将
chromedriver.exe所在的目录添加到系统的环境变量PATH中,这样你就可以从任何位置调用它。 - 方法三(代码中指定): 在代码中明确指定驱动文件的完整路径。
- 方法一(推荐): 将
基本使用示例
下面是一个完整的、从打开浏览器到关闭浏览器的流程示例。
示例:访问百度,搜索 "Selenium",然后关闭浏览器
# 1. 导入必要的模块
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
from selenium.common.exceptions import NoSuchElementException
import time
# 2. 设置 Chrome 选项(可选)
# 无头模式(不显示浏览器界面)
# options = Options()
# options.add_argument("--headless")
# options.add_argument("--disable-gpu")
# 3. 指定 ChromeDriver 的路径
# 如果你已经将 chromedriver 放在了脚本同目录下,可以直接使用 'chromedriver'
# 否则,请提供完整路径, Service(executable_path="C:/path/to/chromedriver.exe")
service = Service(executable_path='./chromedriver') # 假设驱动在脚本同目录
# 4. 初始化 WebDriver
driver = webdriver.Chrome(service=service, options=options)
try:
# 5. 打开目标网页
print("正在打开百度首页...")
driver.get("https://www.baidu.com")
# 6. 等待页面加载,并最大化窗口
time.sleep(2) # 简单等待,实际项目中最好用显式等待
driver.maximize_window()
# 7. 定位搜索框元素并进行操作
# 通过 ID 定位搜索框
search_box = driver.find_element(By.ID, "kw")
# 在搜索框中输入 "Selenium"
print("正在输入搜索关键词...")
search_box.send_keys("Selenium")
# 模拟按下回车键
search_box.send_keys(Keys.ENTER)
# 8. 等待搜索结果加载
print("正在等待搜索结果...")
time.sleep(3) # 同样,这里用简单等待作为演示
# 9. 获取页面标题并打印
print(f"当前页面标题是: {driver.title}")
# 10. 验证搜索结果中是否包含 "Selenium 官方网站"
try:
# 通过 XPath 定位一个特定的链接
official_link = driver.find_element(By.XPATH, "//a[contains(text(), 'Selenium 官方网站')]")
print("成功找到 'Selenium 官方网站' 链接!")
except NoSuchElementException:
print("未找到 'Selenium 官方网站' 链接。")
finally:
# 11. 无论成功与否,最后都关闭浏览器
print("正在关闭浏览器...")
driver.quit()
高级功能
1 显式等待 vs. 隐式等待
-
隐式等待 (
implicitly_wait):- 在
find_element被调用时,如果元素没有立即找到,Selenium 会在指定的时间内轮询查找。 - 全局设置,只需调用一次。
- 缺点:如果页面加载缓慢,它可能会等待整个超时时间,即使目标元素已经加载出来了,也可能等待一个不存在的元素,浪费大量时间。
driver.implicitly_wait(10) # 等待最多10秒
- 在
-
显式等待 (
WebDriverWait):- 强烈推荐,它会等待某个特定条件成立后,再继续执行代码,如果超时,则抛出
TimeoutException。 - 更加精确和高效。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
等待最多10秒,直到ID为 "myDynamicElement" 的元素可见
element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "myDynamicElement")) )
(图片来源网络,侵删) - 强烈推荐,它会等待某个特定条件成立后,再继续执行代码,如果超时,则抛出
2 处理弹窗
-
警告框:
alert = driver.switch_to.alert alert.accept() # 点击“确定” # alert.dismiss() # 点击“取消” # alert.send_keys("some text") # 在警告框中输入文本 -
文件上传: 通常不是通过处理弹窗,而是直接定位到
<input type="file">元素,然后使用send_keys方法将文件路径发送给它。file_input = driver.find_element(By.ID, "file-upload") file_input.send_keys("C:/path/to/your/file.txt")
3 页面截图
在调试自动化脚本时,截图非常有用。
# 截取整个屏幕并保存
driver.save_screenshot('screenshot.png')
4 切换窗口/标签页
当点击链接打开一个新窗口或标签页时,需要切换上下文。
# 获取所有窗口句柄 handles = driver.window_handles # 切换到第二个窗口(索引为1的窗口) driver.switch_to.window(handles[1]) # 操作完成后,可以切回原来的窗口 driver.switch_to.window(handles[0])
最佳实践
- 使用显式等待:避免使用
time.sleep(),除非在调试。WebDriverWait是更健壮的解决方案。 - 使用可靠的定位策略:优先使用
ID或CSS_SELECTOR,避免使用脆弱的XPath或CLASS_NAME(除非 class 是唯一的)。 - 使用
try...except处理异常:网络问题、元素未找到等情况是常见的,优雅地处理它们能让脚本更健壮。 - 使用
with语句或try...finally:确保浏览器在任何情况下都能被正确关闭,避免资源泄漏。 - 将选择器与业务逻辑分离:可以将页面的元素选择器存放在一个单独的文件或类中(即 Page Object Model 设计模式),这样当页面结构变化时,只需修改一个地方。
- 不要滥用无头模式:无头模式在服务器上运行很棒,但在调试时,看到浏览器可以让你更好地理解脚本执行过程。
Selenium 是一个功能极其强大的工具,是 Web 自动化测试和爬虫领域的利器,掌握它需要耐心和实践,从最简单的打开、定位、操作、关闭开始,逐步学习等待、切换、处理复杂元素等高级功能,你就能用它解决各种复杂的 Web 自动化问题。
