Selenium Python 完整学习指南
Selenium 是一个用于自动化 Web 浏览器的强大工具,结合 Python,你可以用它来编写脚本,模拟用户在浏览器中的操作,例如点击、输入、提交表单、抓取数据等。

本指南将分为以下几个部分:
环境准备
在开始之前,你需要准备好你的开发环境。
a. 安装 Python
确保你的系统已经安装了 Python (推荐 3.6+ 版本),你可以在终端或命令行中输入 python --version 或 python3 --version 来检查。
b. 安装 Selenium 库
使用 pip (Python 的包管理器) 来安装 Selenium 包。

# 推荐使用 pip3 pip3 install selenium
c. 下载浏览器驱动
Selenium 本身不控制浏览器,它通过一个叫做 WebDriver 的中间件来与浏览器通信,你需要为你的浏览器下载对应的驱动程序。
主流浏览器驱动:
- Chrome: ChromeDriver
- Firefox: GeckoDriver
- Edge: EdgeDriver
如何下载和配置 (以 Chrome 为例):
- 查看 Chrome 版本: 打开 Chrome 浏览器 -> 点击右上角三个点 -> 帮助 -> Google Chrome,记下你的版本号 (
0.6312.86)。 - 下载对应驱动: 访问 ChromeDriver for Testing 页面,根据你的 Chrome 版本,下载对应的
chromedriver,下载zip压缩包即可。 - 配置驱动路径: 有两种主要方式:
- 方式一 (推荐): 将驱动程序添加到系统环境变量
PATH中。- 解压下载的
zip文件,将chromedriver(或chromedriver.exe) 文件复制到一个已存在于系统PATH的目录中,/usr/local/bin(macOS/Linux) 或C:\Windows\System32(Windows),这样 Selenium 就能自动找到它。
- 解压下载的
- 方式二: 在代码中指定驱动路径。
- 将
chromedriver文件放在你的项目文件夹下,然后在代码中提供其绝对或相对路径。
- 将
- 方式一 (推荐): 将驱动程序添加到系统环境变量
核心概念与入门
Selenium Python 的核心是 WebDriver 对象,它是你脚本的“驾驶员”,控制着浏览器。

a. 创建一个 WebDriver 实例
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager # 方法1: 使用 webdriver-manager (最简单,无需手动下载驱动) # 它会自动检测浏览器版本并下载/管理对应的驱动 driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) # 方法2: 如果驱动已在系统PATH中,可以直接这样写 # driver = webdriver.Chrome() # 方法3: 如果驱动不在PATH中,需要指定路径 # service = Service(executable_path='/path/to/your/chromedriver') # driver = webdriver.Chrome(service=service)
b. 打开网页
# 打开百度首页
driver.get("https://www.baidu.com")
c. 关闭浏览器
# 关闭当前标签页 driver.close() # 关闭整个浏览器并结束 WebDriver 会话 driver.quit()
最佳实践:
driver.quit()是更好的选择,因为它能彻底释放所有资源,通常建议将driver.quit()放在try...finally块中,以确保脚本无论是否出错都能正常关闭浏览器。
from selenium import webdriver
driver = None
try:
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print("页面标题:", driver.title)
finally:
if driver:
driver.quit()
定位 Web 元素
自动化测试的大部分时间都花在如何准确地找到你想要操作的元素上,Selenium 提供了 8 种定位策略,最常用的是前 5 种。
假设我们有如下 HTML 代码:
<input id="kw" class="s_ipt" name="wd" maxlength="255" autocomplete="off">
<a id="su" class="btn self-btn bg s_btn" href="#">百度一下</a>
<div class="s-top-left">
<a href="/more/" onmousedown="return false">更多产品</a>
</div>
定器列表 (优先推荐使用 id 和 name)
| 定位器 | 方法 | 描述 | 示例 |
|---|---|---|---|
| ID | find_element(By.ID, "value") |
最推荐,通过元素的 id 属性定位,通常是唯一的。 |
driver.find_element(By.ID, "kw") |
| Name | find_element(By.NAME, "value") |
通过元素的 name 属性定位。 |
driver.find_element(By.NAME, "wd") |
| XPath | find_element(By.XPATH, "value") |
非常强大,通过 XML 路径表达式定位元素,可以处理复杂情况。 | driver.find_element(By.XPATH, '//input[@id="kw"]') |
| CSS Selector | find_element(By.CSS_SELECTOR, "value") |
非常强大且高效,通过 CSS 选择器定位元素,语法比 XPath 简洁。 | driver.find_element(By.CSS_SELECTOR, '#kw') |
| Link Text | find_element(By.LINK_TEXT, "value") |
定位文本完全匹配的 <a> (超链接) 标签。 |
driver.find_element(By.LINK_TEXT, "更多产品") |
| Partial Link Text | find_element(By.PARTIAL_LINK_TEXT, "value") |
定位文本部分匹配的 <a>
| |
| Tag Name | find_element(By.TAG_NAME, "value") |
通过标签名定位,不常用,因为通常有多个同名标签。 | driver.find_element(By.TAG_NAME, "input") |
| Class Name | find_element(By.CLASS_NAME, "value") |
通过元素的 class 属性定位,注意,class 有多个空格分隔的值,只传一个可能无效。 |
driver.find_element(By.CLASS_NAME, "s_ipt") |
注意: find_element (单数) 只返回第一个匹配的元素,如果找不到会抛出 NoSuchElementException 异常,如果需要查找所有匹配的元素,应使用 find_elements (复数),它返回一个列表。
# 导入 By 枚举 from selenium.webdriver.common.by import By # 使用 ID 定位搜索框 search_box = driver.find_element(By.ID, "kw") # 使用 CSS Selector 定位搜索按钮 search_button = driver.find_element(By.CSS_SELECTOR, "#su") # 使用 XPath 定位“更多产品”链接 more_link = driver.find_element(By.XPATH, '//a[contains(text(), "更多产品")]')
常用 WebDriver API
找到元素后,你就可以对它们进行操作了。
a. 与元素交互
# 假设我们已经找到了 search_box 和 search_button
search_box = driver.find_element(By.ID, "kw")
search_button = driver.find_element(By.ID, "su")
# 1. 清空输入框 (如果之前有内容)
search_box.clear()
# 2. 在输入框中输入文字
search_box.send_keys("Selenium Python 教程")
# 3. 点击按钮
search_button.click()
b. 获取元素信息
# 获取元素的标签名
tag_name = search_box.tag_name # 返回 "input"
# 获取元素的属性值
id_value = search_box.get_attribute("id") # 返回 "kw"
class_value = search_box.get_attribute("class") # 返回 "s_ipt"
# 获取元素的文本内容 (适用于 <a>, <span>, <div> 等包含文本的标签)
link_text = more_link.text # 返回 "更多产品"
# 获取元素在页面上的位置和尺寸
location = search_box.location # 返回 {'x': 234, 'y': 168}
size = search_box.size # 返回 {'width': 500, 'height': 22}
c. 获取页面信息
# 获取页面标题= driver.title # "百度一下,你就知道" # 获取当前页面的 URL current_url = driver.current_url # 获取页面的源代码 page_source = driver.page_source
等待策略
这是 Selenium 自动化中最重要的概念之一,现代网页大量使用 JavaScript,元素不会立即加载完成,如果你不等待就直接操作,很可能会导致 ElementNotInteractableException 或 NoSuchElementException。
a. 隐式等待
在查找元素时,如果元素没有立即找到,WebDriver 会等待一段指定的时间,然后再尝试查找。
# 设置一个全局的隐式等待,单位是秒 # 这意味着所有 find_element 操作都会最多等待10秒 driver.implicitly_wait(10)
缺点: 隐式等待是全局性的,并且它只对
find_element和find_elements有效,它不知道具体要等哪个元素,可能导致不必要的长时间等待。
b. 显式等待 (推荐)
显式等待允许你等待某个特定条件满足后再继续执行脚本,这更精确、更可靠。
你需要导入 WebDriverWait 和 expected_conditions。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
try:
# 等待最多10秒,直到ID为"kw"的元素变为可点击状态
# 每隔0.5秒检查一次条件
search_box = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "kw"))
)
search_box.send_keys("显式等待")
# 等待最多10秒,直到ID为"su"的元素出现
search_button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "su"))
)
search_button.click()
except Exception as e:
print(f"等待元素超时: {e}")
finally:
driver.quit()
常用的 expected_conditions (EC):
EC.presence_of_element_located: 元素出现在 DOM 中,但不一定可见。EC.visibility_of_element_located: 元素可见 (即display和visibility属性不为隐藏)。EC.element_to_be_clickable: 元素可见且可被点击。EC.title_contains: 页面标题包含特定文本。EC.alert_is_present: 存在警告框。
高级操作
a. 处理多窗口/标签页
# 获取当前窗口句柄
main_window_handle = driver.current_window_handle
# 点击一个链接会打开新标签页
driver.find_element(By.LINK_TEXT, "登录").click()
# 获取所有窗口句柄
all_handles = driver.window_handles
# 切换到新窗口
for handle in all_handles:
if handle != main_window_handle:
driver.switch_to.window(handle)
break
# 现在在新窗口中操作...
print("当前窗口标题:", driver.title)
# 关闭当前标签页并切换回主窗口
driver.close()
driver.switch_to.window(main_window_handle)
b. 处理 iframe/框架
如果元素在一个 <iframe> 内,你必须先“切入”到该框架,才能操作其中的元素。
# 假设 iframe 的 id 是 "my_frame"
driver.switch_to.frame("my_frame")
# 现在可以操作 iframe 内的元素
iframe_element = driver.find_element(By.ID, "some_element_in_frame")
# 操作完成后,切回主页面
driver.switch_to.default_content()
c. 处下拉列表
使用 Select 类。
from selenium.webdriver.support.ui import Select
# 假设下拉列表的 id 是 "country-select"
select_element = driver.find_element(By.ID, "country-select")
select = Select(select_element)
# 通过可见文本选择
select.select_by_visible_text("China")
# 通过 value 值选择
select.select_by_value("cn")
# 通过索引选择 (从0开始)
select.select_by_index(0)
最佳实践与技巧
-
总是使用
driver.quit(): 确保浏览器会话被正确关闭,释放资源。 -
优先使用显式等待: 让你的脚本更稳定、更可预测。
-
使用有意义的变量名:
search_button而不是btn。 -
将定位器与操作分离: 先找到元素并存储在一个变量中,再进行操作,这样代码更清晰,也方便调试。
-
使用 Page Object Model (POM): 对于复杂的测试项目,使用 POM 设计模式可以极大地提高代码的可维护性,就是为每个网页创建一个类,该类封装了该页面的元素定位和操作方法。
-
处理弹窗/警告:
from selenium.webdriver.common.alert import Alert # 触发一个 JavaScript 弹窗 driver.execute_script("alert('这是一个警告框!');") # 切换到警告框 alert = driver.switch_to.alert # 获取警告框文本 print(alert.text) # 接受警告 (点击"确定") alert.accept() # 或者取消警告 (点击"取消") # alert.dismiss()
官方资源与参考
- Selenium Python 官方文档: https://selenium-python.readthedocs.io/
这是最权威、最全面的资料,所有函数、类、方法都有详细说明和示例。
- Selenium 官方网站: https://www.selenium.dev/
可以获取最新的新闻、下载链接和完整的文档(包含 Java, C#, Ruby 等版本)。
- Selenium IDE: 一个浏览器插件,可以录制和回放用户操作,并自动生成代码(支持多种语言,包括 Python),非常适合初学者快速学习定位器和操作流程。
希望这份指南能帮助你快速上手 Selenium Python!祝你学习愉快!
