Selenium 从环境搭建到 Web 自动化实战

Selenium 是目前最流行的 Web 自动化测试工具,支持 Chrome、Firefox 等主流浏览器,能模拟人工操作(点击、输入、跳转)实现网页自动化,广泛应用于接口测试、数据爬取、自动化部署等场景。本文从零基础入门,手把手教你掌握 Selenium 核心用法,所有代码可直接复制运行,附实战案例和避坑指南。

一、Selenium 核心优势与适用场景

1.1 核心优势

  • 跨浏览器兼容:支持 Chrome、Firefox、Edge、Safari,无需修改代码即可适配多浏览器;

  • 多语言支持:Python、Java、C# 等均可调用,Python 语法简洁,入门门槛最低;

  • 功能全面:支持元素定位、表单操作、窗口切换、文件上传、Cookie 处理等所有 Web 交互场景;

  • 开源免费:无版权限制,社区活跃,问题解决方案丰富。

1.2 典型适用场景

应用场景 实际需求 举例说明
自动化测试 重复执行测试用例,减少人工成本 电商网站登录、下单流程自动化测试
数据爬取 批量获取网页动态加载数据 爬取招聘网站岗位信息、股票行情
自动化办公 模拟人工操作网页完成重复任务 自动填写报表、批量提交表单
接口自动化 配合 Requests 库,实现前后端联动测试 模拟用户操作触发接口请求,验证响应

二、前置准备:环境搭建(Python 版)

Selenium 运行依赖 “Python 环境 + 浏览器驱动 + Selenium 库”,以下是 Windows/macOS 通用搭建步骤:

2.1 安装 Python 环境

  • 下载 Python 3.8~3.11 版本(兼容性最佳):https://www.python.org/downloads/

  • 安装时勾选 “Add Python to PATH”,避免手动配置环境变量;

  • 验证:打开 CMD(Windows)/ 终端(macOS),输入python --version,显示版本号即安装成功。

2.2 安装 Selenium 库

打开 CMD / 终端,执行 pip 命令安装:

pip install selenium==4.21.0  # 4.21.0为稳定版,避免使用最新版可能存在的bug

验证:Python 交互环境中输入import selenium,无报错即安装成功。

2.3 配置浏览器驱动(关键步骤)

Selenium 需通过驱动程序控制浏览器,必须保证 “驱动版本与浏览器版本匹配”:

2.3.1 以 Chrome 浏览器为例(最常用)

  1. 查看 Chrome 版本:打开 Chrome → 右上角三个点 → 帮助 → 关于 Google Chrome(如版本 125.0.6422.141);

  2. 下载对应 ChromeDriver:

  1. 配置驱动:
  • Windows:将下载的 chromedriver.exe 文件放到 Python 安装目录(如 C:\Python39),或添加到系统 PATH;

  • macOS:将 chromedriver 放到 /usr/local/bin 目录,终端执行sudo chmod +x /usr/local/bin/chromedriver赋予执行权限。

2.3.2 验证驱动配置

CMD / 终端输入chromedriver --version,显示驱动版本号即配置成功。

三、核心用法:Selenium 基础操作(Python 代码)

以下以 “自动化访问百度,搜索 Selenium 教程” 为例,演示核心操作流程:

3.1 第一个 Selenium 程序

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.common.keys import Keys

import time

\# 1. 启动Chrome浏览器(无头模式可加options参数,见下文)

driver = webdriver.Chrome()

\# 2. 访问百度首页

driver.get("https://www.baidu.com")

driver.maximize\_window()  # 最大化窗口

time.sleep(2)  # 等待2秒,让页面加载完成(避免元素未渲染导致定位失败)

\# 3. 定位搜索框并输入内容

\# 方式1:通过ID定位(最稳定,优先使用)

search\_box = driver.find\_element(By.ID, "kw")

search\_box.send\_keys("Selenium教程")  # 输入内容

time.sleep(1)

\# 4. 模拟回车搜索(或点击搜索按钮)

search\_box.send\_keys(Keys.ENTER)

\# 点击搜索按钮写法:driver.find\_element(By.ID, "su").click()

\# 5. 等待搜索结果加载,获取页面标题

time.sleep(3)

print("当前页面标题:", driver.title)

\# 6. 关闭浏览器(quit()关闭整个浏览器,close()仅关闭当前标签页)

driver.quit()

3.2 核心操作详解

3.2.1 元素定位(自动化的核心)

Selenium 提供 8 种元素定位方式,优先选择 “稳定不易变” 的定位器:

定位方式 By 类写法 适用场景 示例(百度搜索框)
ID 定位 By.ID 元素有唯一 ID(最优先) driver.find_element(By.ID, "kw")
名称定位 By.NAME 元素有唯一 name 属性 driver.find_element(By.NAME, "wd")
类名定位 By.CLASS_NAME 元素类名唯一 driver.find_element(By.CLASS_NAME, "s_ipt")
XPath 定位 By.XPATH 无 ID/name 时使用(万能定位) driver.find_element(By.XPATH, "//input[@id='kw']")
CSS 选择器定位 By.CSS_SELECTOR 定位速度快,语法简洁 driver.find_element(By.CSS_SELECTOR, "#kw")
链接文本定位 By.LINK_TEXT 超链接文本唯一 driver.find_element (By.LINK_TEXT, "新闻")
部分链接文本定位 By.PARTIAL_LINK_TEXT 超链接文本过长时使用 driver.find_element (By.PARTIAL_LINK_TEXT, "新")
标签名定位 By.TAG_NAME 页面中该标签唯一时使用 极少用(如 driver.find_element (By.TAG_NAME, "input"))

实战技巧:Chrome 浏览器中可通过 “开发者工具” 快速获取元素定位器:

  1. F12 打开开发者工具 → 选中元素 → 右键 → Copy → Copy XPath/Copy selector。

3.2.2 常用交互操作

操作类型 代码示例 说明
输入文本 element.send_keys ("内容") 向输入框输入文本
清空文本 element.clear() 清空输入框内容
点击元素 element.click() 点击按钮、链接等
模拟键盘操作 element.send_keys(Keys.ENTER) 回车、Ctrl+C 等(需导入 Keys 类)
获取元素文本 element.text 获取标签内的文本(如按钮文字)
获取元素属性 element.get_attribute("src") 获取图片 src、输入框 value 等属性
页面跳转 driver.get("URL") 访问指定 URL
刷新页面 driver.refresh() 刷新当前页面
后退 / 前进 driver.back() / driver.forward() 浏览器历史记录操作

3.2.3 等待机制(避免元素未加载导致报错)

直接用 time.sleep () 是固定等待,不灵活,推荐使用显式等待(更高效):

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected\_conditions as EC

\# 显式等待:最多等待10秒,直到ID为kw的元素可点击

wait = WebDriverWait(driver, 10)

search\_box = wait.until(EC.element\_to\_be\_clickable((By.ID, "kw")))

search\_box.send\_keys("Selenium教程")

常用等待条件(expected_conditions):

  • element_to_be_clickable:元素可点击;

  • presence_of_element_located:元素存在于 DOM 树;

  • visibility_of_element_located:元素可见;

  • text_to_be_present_in_element:元素包含指定文本。

四、实战案例:自动化登录 GitHub(完整流程)

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected\_conditions as EC

import time

\# 1. 启动浏览器

driver = webdriver.Chrome()

driver.get("https://github.com/login")

driver.maximize\_window()

\# 2. 显式等待并输入用户名密码

wait = WebDriverWait(driver, 15)

\# 用户名输入框

username = wait.until(EC.element\_to\_be\_clickable((By.ID, "login\_field")))

username.send\_keys("你的GitHub账号")

\# 密码输入框

password = driver.find\_element(By.ID, "password")

password.send\_keys("你的GitHub密码")

\# 3. 点击登录按钮

login\_btn = driver.find\_element(By.NAME, "commit")

login\_btn.click()

\# 4. 验证登录成功(通过页面标题判断)

time.sleep(3)

if "GitHub" in driver.title and "Dashboard" in driver.page\_source:

    print("登录成功!")

else:

    print("登录失败!")

\# 5. 保存Cookie(可选,用于后续免登录)

cookies = driver.get\_cookies()

print("当前Cookie:", cookies)

\# 6. 关闭浏览器

driver.quit()

五、进阶技巧:解决实际场景问题

5.1 无头模式运行(无界面,提高效率)

适用于服务器环境或不需要可视化的场景:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

\# 配置无头模式

chrome\_options = Options()

chrome\_options.add\_argument("--headless=new")  # Selenium4+推荐写法

chrome\_options.add\_argument("--window-size=1920,1080")  # 设置窗口大小

\# 启动浏览器

driver = webdriver.Chrome(options=chrome\_options)

driver.get("https://www.baidu.com")

print(driver.title)

driver.quit()

5.2 处理弹窗(Alert/Confirm/Prompt)

\# 触发弹窗后,切换到弹窗

alert = driver.switch\_to.alert

print("弹窗内容:", alert.text)

alert.accept()  # 确认弹窗

\# alert.dismiss()  # 取消弹窗

\# alert.send\_keys("输入内容")  # Prompt弹窗输入文本

5.3 文件上传

\# 定位文件上传按钮(input标签type="file")

upload\_btn = driver.find\_element(By.ID, "file-upload")

\# 直接输入文件路径(无需点击按钮)

upload\_btn.send\_keys("C:/test.txt")  # Windows路径

\# upload\_btn.send\_keys("/Users/test.txt")  # macOS路径

5.4 切换 iframe(处理嵌套页面)

\# 方式1:通过ID切换

driver.switch\_to.frame("iframe-id")

\# 方式2:通过索引切换(第1个iframe)

driver.switch\_to.frame(0)

\# 方式3:通过元素定位切换

iframe = driver.find\_element(By.XPATH, "//iframe\[@name='iframe-name']")

driver.switch\_to.frame(iframe)

\# 切回主页面

driver.switch\_to.default\_content()

六、常见坑与避坑技巧

6.1 元素定位失败

  • 原因 1:元素未加载完成 → 用显式等待替代 time.sleep ();

  • 原因 2:元素在 iframe 中 → 先切换到 iframe 再定位;

  • 原因 3:定位器错误(如 ID 变化) → 改用更稳定的 XPath/CSS 选择器;

  • 原因 4:浏览器驱动版本不匹配 → 重新下载对应版本驱动。

6.2 浏览器启动失败

  • Windows:chromedriver.exe 未添加到 PATH → 放到 Python 安装目录;

  • macOS:未赋予执行权限 → 执行sudo chmod +x /usr/local/bin/chromedriver

  • 防火墙拦截 → 暂时关闭防火墙或添加驱动到信任列表。

6.3 页面加载过慢

  • 禁用图片加载,提高速度:
chrome\_options.add\_argument("--disable-images")
  • 设置页面加载超时:
driver.set\_page\_load\_timeout(10)  # 10秒超时

6.4 反爬机制拦截

  • 模拟真实浏览器请求,添加请求头:
chrome\_options.add\_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36")
  • 避免频繁操作,适当添加等待时间。

七、进阶方向:Selenium 与测试框架整合

7.1 结合 pytest 实现自动化测试

pytest 是 Python 主流测试框架,可实现用例管理、断言、报告生成:

\# test\_baidu.py

import pytest

from selenium import webdriver

from selenium.webdriver.common.by import By

@pytest.fixture(scope="module")

def driver():

    # 前置条件:启动浏览器

    driver = webdriver.Chrome()

    yield driver

    # 后置条件:关闭浏览器

    driver.quit()

def test\_baidu\_search(driver):

    driver.get("https://www.baidu.com")

    driver.find\_element(By.ID, "kw").send\_keys("Selenium")

    driver.find\_element(By.ID, "su").click()

    # 断言:搜索结果包含"Selenium"

    assert "Selenium" in driver.title

运行测试用例:

pytest test\_baidu.py -v  # -v显示详细结果

7.2 生成测试报告

使用 allure-pytest 生成可视化测试报告:

\# 安装依赖

pip install allure-pytest

\# 运行用例并生成报告数据

pytest test\_baidu.py --alluredir=./allure-results

\# 启动报告服务

allure serve ./allure-results
posted @ 2026-01-18 21:54  布衣开发者  阅读(0)  评论(0)    收藏  举报