杰瑞科技汇

Python WebDriver教程该怎么学?

Python WebDriver 完整教程:从入门到自动化测试

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

Python WebDriver教程该怎么学?-图1
(图片来源网络,侵删)

目录

  1. 第一部分:基础入门

    • 1 什么是 WebDriver?
    • 2 为什么选择 Python + WebDriver?
    • 3 环境准备
      • 安装 Python
      • 安装 Selenium 库
      • 安装浏览器与对应 WebDriver
    • 4 你的第一个自动化脚本:Hello, World!
  2. 第二部分:核心操作详解

    • 1 初始化 WebDriver
    • 2 页面导航
    • 3 定位网页元素
      • 单个元素定位
      • 多个元素定位
      • 定位策略详解
    • 4 与元素交互
      • 点击
      • 输入文本
      • 清空输入框
      • 获取元素属性和文本
    • 5 处理等待
      • 强制等待 (time.sleep)
      • 隐式等待 (implicitly_wait)
      • 显式等待 (WebDriverWait) - 强烈推荐
  3. 第三部分:高级实战技巧

    • 1 处理多窗口和标签页
    • 2 处弹窗**
    • 3 处理下拉菜单 (<select>)
    • 4 执行 JavaScript
    • 5 元件拖拽 (ActionChains)
    • 6 截图
    • 7 切换 iframe
  4. 第四部分:最佳实践与项目实战

    Python WebDriver教程该怎么学?-图2
    (图片来源网络,侵删)
    • 1 页面对象模型 - 提升代码可维护性
    • 2 一个完整的自动化测试案例
    • 3 WebDriver 的未来发展:W3C 标准与 Selenium 4
  5. 第五部分:总结与资源


第一部分:基础入门

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 为例:
    1. 查看 Chrome 版本:打开 Chrome,进入 设置 -> Chrome,记下版本号(0.6478.127)。
    2. 下载 WebDriver:访问 Chrome for Testing availability,找到与你 Chrome 版本最接近的 chromedriver 下载链接。
    3. 配置 WebDriver
      • 方法一(推荐):将下载好的 chromedriver.exe (Windows) 或 chromedriver (Mac/Linux) 文件放到 Python 的 Scripts 目录下,这个路径通常是 C:\Users\你的用户名\AppData\Local\Programs\Python\PythonXX\Scripts,这样你就不需要在代码中指定路径了。
      • 方法二:将 chromedriver 放在你的项目文件夹中,并在代码中指定其绝对路径。

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_elementfind_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 一个完整的自动化测试案例

结合 pytestPOM 模式。

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 进行网页自动化的所有核心知识点,记住以下几点:

  1. 定位是基础:熟练掌握 XPath 和 CSS Selector 是成为自动化高手的关键。
  2. 等待是灵魂永远优先使用显式等待 (WebDriverWait),它能让你的脚本更稳定、更高效。
  3. POM 是利器:在项目开发中,尽早引入 POM 设计模式,能为你节省大量的维护时间。
  4. 持续学习:Web 技术日新月异,WebDriver 也在不断进化,保持学习才能跟上步伐。

推荐资源

分享:
扫描分享到社交APP
上一篇
下一篇