Python WebDriver 完整教程:从入门到自动化测试
WebDriver 是 Selenium 的核心组件,它允许你通过代码控制一个真实的浏览器(如 Chrome、Firefox)来模拟用户操作,从而实现网页自动化,本教程将带你一步步掌握使用 Python + WebDriver 进行网页自动化。

目录
-
第一部分:基础入门
- 1 什么是 WebDriver?
- 2 为什么选择 Python + WebDriver?
- 3 环境准备
- 安装 Python
- 安装 Selenium 库
- 安装浏览器与对应 WebDriver
- 4 你的第一个自动化脚本:Hello, World!
-
第二部分:核心操作详解
- 1 初始化 WebDriver
- 2 页面导航
- 3 定位网页元素
- 单个元素定位
- 多个元素定位
- 定位策略详解
- 4 与元素交互
- 点击
- 输入文本
- 清空输入框
- 获取元素属性和文本
- 5 处理等待
- 强制等待 (
time.sleep) - 隐式等待 (
implicitly_wait) - 显式等待 (
WebDriverWait) - 强烈推荐
- 强制等待 (
-
第三部分:高级实战技巧
- 1 处理多窗口和标签页
- 2 处弹窗**
- 3 处理下拉菜单 (
<select>) - 4 执行 JavaScript
- 5 元件拖拽 (
ActionChains) - 6 截图
- 7 切换 iframe
-
第四部分:最佳实践与项目实战
(图片来源网络,侵删)- 1 页面对象模型 - 提升代码可维护性
- 2 一个完整的自动化测试案例
- 3 WebDriver 的未来发展:W3C 标准与 Selenium 4
-
第五部分:总结与资源
第一部分:基础入门
1 什么是 WebDriver?
想象一下,WebDriver 就像一个“机器人”,它坐在你的电脑前,手握鼠标和键盘,你可以通过 Python 代码向这个机器人下达指令,
- “打开 Chrome 浏览器”
- “访问百度首页”
- “在搜索框里输入‘Selenium’”
- “点击‘百度一下’按钮”
这个机器人会严格按照你的指令去执行,并且能告诉你页面上发生了什么(比如某个元素是否存在,页面的标题是什么),它模拟的是真实用户的操作,JavaScript 也能正常执行。
2 为什么选择 Python + WebDriver?
- 语法简洁:Python 语法清晰易懂,上手快,让你能更专注于自动化逻辑本身,而不是复杂的编程语法。
- 库生态丰富:Python 拥有海量的第三方库,除了 Selenium,还有
pytest(测试框架),allure(测试报告),requests(API 测试) 等,可以轻松构建强大的自动化测试体系。 - 社区活跃:遇到任何问题,你几乎都能在 Stack Overflow、GitHub 或国内社区找到答案。
3 环境准备
安装 Python 如果你还没有安装 Python,请访问 Python 官网 下载并安装,安装时请务必勾选 "Add Python to PATH" 选项。
安装 Selenium 库 打开你的终端或命令提示符,运行以下命令:
pip install selenium
安装浏览器与对应 WebDriver 这是最关键也最容易出错的一步,浏览器和 WebDriver 必须版本对应。
- 以 Chrome 为例:
- 查看 Chrome 版本:打开 Chrome,进入
设置->Chrome,记下版本号(0.6478.127)。 - 下载 WebDriver:访问 Chrome for Testing availability,找到与你 Chrome 版本最接近的
chromedriver下载链接。 - 配置 WebDriver:
- 方法一(推荐):将下载好的
chromedriver.exe(Windows) 或chromedriver(Mac/Linux) 文件放到 Python 的Scripts目录下,这个路径通常是C:\Users\你的用户名\AppData\Local\Programs\Python\PythonXX\Scripts,这样你就不需要在代码中指定路径了。 - 方法二:将
chromedriver放在你的项目文件夹中,并在代码中指定其绝对路径。
- 方法一(推荐):将下载好的
- 查看 Chrome 版本:打开 Chrome,进入
4 你的第一个自动化脚本:Hello, World!
创建一个名为 first_script.py 的文件,然后输入以下代码:
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
import time
# 1. 初始化 WebDriver
# 如果你 chromedriver 在 PATH 中,可以直接这样写
driver = webdriver.Chrome()
# 如果你的 chromedriver 不在 PATH 中,需要指定路径
# s = Service(executable_path="C:/path/to/your/chromedriver.exe")
# driver = webdriver.Chrome(service=s)
# 2. 打开网页
driver.get("https://www.baidu.com")
# 3. 定位元素并进行交互
# 通过 id 定位搜索框
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium")
search_box.send_keys(Keys.ENTER) # 模拟回车键
# 4. 等待几秒钟,观察结果
time.sleep(3) # 强制等待3秒
# 5. 获取页面标题并打印
print("当前页面标题是:", driver.title)
# 6. 关闭浏览器
driver.quit()
运行这个脚本 (python first_script.py),你会看到一个 Chrome 浏览器自动打开,访问百度,搜索 "Selenium",然后自动关闭,恭喜,你已经迈出了第一步!
第二部分:核心操作详解
1 初始化 WebDriver
from selenium import webdriver from selenium.webdriver.chrome.service import Service # 方式一:让 Selenium Manager 自动下载和管理 WebDriver (Selenium 4+ 推荐) driver = webdriver.Chrome() # 方式二:手动指定 WebDriver 路径 (兼容性更好) # s = Service(executable_path="C:/path/to/chromedriver.exe") # driver = webdriver.Chrome(service=s)
2 页面导航
driver.get("https://www.example.com") # 打开 URL
driver.back() # 后退
driver.forward() # 前进
driver.refresh() # 刷新页面
3 定位网页元素
这是自动化测试的核心,Selenium 提供了多种定位策略:
| 定位方式 | 方法 | 描述 | 示例 (HTML: <input id="user" name="username">) |
|---|---|---|---|
| ID | find_element(By.ID, "value") |
最高效,通过元素的 id 属性定位 |
find_element(By.ID, "user") |
| Name | find_element(By.NAME, "value") |
通过 name 属性定位 |
find_element(By.NAME, "username") |
| XPath | find_element(By.XPATH, "value") |
非常强大,通过路径表达式定位 | find_element(By.XPATH, "//input[@id='user']") |
| CSS Selector | find_element(By.CSS_SELECTOR, "value") |
非常强大且高效,通过 CSS 选择器定位 | find_element(By.CSS_SELECTOR, "#user") |
| Link Text | find_element(By.LINK_TEXT, "value") |
通过链接的完整文本定位 | <a href="...">点击这里</a> -> find_element(By.LINK_TEXT, "点击这里") |
| Partial Link Text | find_element(By.PARTIAL_LINK_TEXT, "value") |
通过链接的部分文本定位 | find_element(By.PARTIAL_LINK_TEXT, "这里") |
| Tag Name | find_element(By.TAG_NAME, "value") |
通过标签名定位 | find_element(By.TAG_NAME, "input") |
| Class Name | find_element(By.CLASS_NAME, "value") |
通过 class 属性定位 |
<div class="main content"> -> find_element(By.CLASS_NAME, "main") |
注意:find_element 是找第一个匹配的元素,如果找不到会抛出 NoSuchElementException 异常。
find_elements (加 s) 是找所有匹配的元素,返回一个列表,如果找不到返回空列表。
4 与元素交互
# 假设已经定位到了元素
element = driver.find_element(By.ID, "some_id")
# 1. 点击
element.click()
# 2. 输入文本
element.send_keys("Hello WebDriver")
# 3. 清空输入框
element.clear()
# 4. 获取元素属性
# 获取 id 属性
id_value = element.get_attribute("id")
# 获取文本内容 (对于 <span>, <div>, <a> 等标签)
text_content = element.text
# 5. 判断元素是否可见/可用
is_displayed = element.is_displayed()
is_enabled = element.is_enabled()
is_selected = element.is_selected() # 用于 radio 或 checkbox
5 处理等待
现代网页大量使用 AJAX,元素不会立即加载,直接操作不存在的元素是导致脚本失败的主要原因。
强制等待 (time.sleep)
import time time.sleep(10) # 暂停脚本执行 10 秒
- 缺点:不智能,无论元素是否加载都要等待,效率低下。
隐式等待 (implicitly_wait)
driver.implicitly_wait(10) # 设置一个全局等待时间
- 作用:在查找任何元素时,如果元素没有立即找到,WebDriver 会等待最多 10 秒,如果在 10 秒内元素出现,则继续执行;10 秒后还没出现,则抛出异常。
- 缺点:只对
find_element和find_elements有效,对于元素出现后的操作(如点击)无效,并且它会等待整个设定的时间,而不是元素一出现就立即执行。
显式等待 (WebDriverWait) - 强烈推荐***
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"))
)
# 等待最多 10 秒,直到可以点击某个元素
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".submit-button"))
)
- 优点:智能、精确,它会每隔一段时间(默认 0.5 秒)检查一次条件,一旦条件满足,就立即继续执行脚本,不会傻等整个设定的时间,这是处理动态页面的最佳方式。
第三部分:高级实战技巧
1 处理多窗口和标签页
# 获取当前窗口句柄
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)
2 处理弹窗**
# 假设点击按钮会弹出一个 Alert driver.find_element(By.ID, "alert-button").click() # 切换到 Alert alert = driver.switch_to.alert # 获取 Alert 文本 print(alert.text) # 接受 Alert (点击 "确定") alert.accept() # 或者取消 Alert (点击 "取消") # alert.dismiss()
3 处理下拉菜单 (<select>)
from selenium.webdriver.support.ui import Select
# 定位到 select 元素
select_element = driver.find_element(By.ID, "country-select")
# 创建 Select 对象
select = Select(select_element)
# 方法1:通过索引选择 (从0开始)
select.select_by_index(1)
# 方法2:通过 value 属性选择
select.select_by_value("us")
# 方法3:通过可见文本选择
select.select_by_visible_text("United States")
4 执行 JavaScript
有时候直接操作元素很困难,或者你想执行一些特定的 JS 代码,这时 execute_script 就派上用场了。
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滚动到页面顶部
driver.execute_script("window.scrollTo(0, 0);")
# 获取一个元素的属性 (比 get_attribute 更底层)
element = driver.find_element(By.ID, "my-id")
value = driver.execute_script("return arguments[0].getAttribute('value');", element)
# 高亮一个元素 (调试时很有用)
driver.execute_script("arguments[0].style.border='3px solid red'", element)
5 元件拖拽 (ActionChains)
ActionChains 用于模拟更复杂的用户交互,如鼠标悬停、拖拽、右键点击等。
from selenium.webdriver import ActionChains # 假设有一个可拖拽的元素 source_element = driver.find_element(By.ID, "draggable") target_element = driver.find_element(By.ID, "droppable") # 创建 ActionChains 对象 actions = ActionChains(driver) # 执行拖拽操作: 点击源元素 -> 按住 -> 移动到目标元素 -> 释放 actions.drag_and_drop(source_element, target_element).perform() # 鼠标悬停示例 actions.move_to_element(element).perform()
6 截图
try:
# ... 你的自动化测试代码 ...
driver.save_screenshot("test_passed_screenshot.png")
except Exception as e:
# 发生异常时截图
driver.save_screenshot("test_failed_screenshot.png")
raise e
7 切换 iframe
<iframe> 是一个嵌套的 HTML 页面,如果你想在 <iframe> 内部操作元素,必须先切换到它。
# 1. 通过 ID 或 name 切换 (iframe 有 id 或 name)
driver.switch_to.frame("iframe_name")
# 2. 通过 WebElement 切换 (iframe 没有唯一标识)
iframe_element = driver.find_element(By.XPATH, "//iframe[@class='content']")
driver.switch_to.frame(iframe_element)
# ... 在 iframe 内部操作元素 ...
# 3. 操作完成后,切回主页面
driver.switch_to.default_content()
第四部分:最佳实践与项目实战
1 页面对象模型 - 提升代码可维护性
POM 是一种设计模式,它将页面的定位逻辑和业务逻辑分离。
- Page (页面类):负责定位页面上的元素。
- Test (测试类):负责调用 Page 类中的方法来执行测试步骤。
示例:
baidu_page.py
from selenium.webdriver.common.by import By
class BaiduHomePage:
def __init__(self, driver):
self.driver = driver
def search(self, keyword):
self.driver.find_element(By.ID, "kw").send_keys(keyword)
self.driver.find_element(By.ID, "su").click()
def get_title(self):
return self.driver.title
test_baidu.py
from selenium import webdriver
from baidu_page import BaiduHomePage
def test_baidu_search():
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 创建页面对象
baidu_page = BaiduHomePage(driver)
# 调用页面对象的方法进行测试
baidu_page.search("Selenium")
# 断言
assert "Selenium" in baidu_page.get_title()
driver.quit()
优点:
- 可读性强:测试代码清晰,只关心业务流程。
- 可维护性高:如果页面元素变了,只需修改
Page类,而不需要动测试用例。 - 可复用性高:一个
Page类可以被多个测试用例调用。
2 一个完整的自动化测试案例
结合 pytest 和 POM 模式。
conftest.py (配置文件)
import pytest
from selenium import webdriver
@pytest.fixture
def driver():
# setup
web_driver = webdriver.Chrome()
web_driver.implicitly_wait(10)
yield web_driver
# teardown
web_driver.quit()
test_baidu_search.py
from selenium.webdriver.common.by import By
from baidu_page import BaiduHomePage # 假设 POM 文件已创建
def test_baidu_search(driver):
driver.get("https://www.baidu.com")
baidu_page = BaiduHomePage(driver)
baidu_page.search("Python")
assert "Python" in baidu_page.get_title()
运行测试:pytest
3 WebDriver 的未来发展:W3C 标准与 Selenium 4
Selenium 4 是一个重大的更新,它最大的变化是完全支持 W3C (World Wide Web Consortium) 标准,这意味着:
- 不再需要
executable_path:Selenium 4+ 可以自动下载和管理与浏览器版本匹配的 WebDriver,大大简化了配置。 - 新的定位策略:
find_element(By.NAME, ...)代替了find_element_by_name(...),旧的find_element_by_*方法已被废弃。 - 相对定位:引入了
with语法,可以更方便地定位相对于某个已知元素的其他元素。
第五部分:总结与资源
这份教程涵盖了从零开始使用 Python WebDriver 进行网页自动化的所有核心知识点,记住以下几点:
- 定位是基础:熟练掌握 XPath 和 CSS Selector 是成为自动化高手的关键。
- 等待是灵魂:永远优先使用显式等待 (
WebDriverWait),它能让你的脚本更稳定、更高效。 - POM 是利器:在项目开发中,尽早引入 POM 设计模式,能为你节省大量的维护时间。
- 持续学习:Web 技术日新月异,WebDriver 也在不断进化,保持学习才能跟上步伐。
推荐资源
- 官方文档:
- Selenium with Python - 最权威、最准确的资料。
- W3C WebDriver Specification
- 学习网站:
- Selenium Tutorial for Beginners - 官方教程。
- W3Schools Selenium Tutorial - 简单易懂的入门教程。
- 社区与问答:
- Stack Overflow - 搜索
selenium- Selenium Discord/Slack - 官方社区,可以实时提问。
- Stack Overflow - 搜索
- 浏览器开发者工具:这是你最好的朋友!学会使用 F12 (或
Ctrl+Shift+I/Cmd+Opt+I) 来检查元素、分析网络请求,是定位问题的第一步。
