1. 项目概述:当DeepSeek遇上Web自动化测试

最近在技术圈里,DeepSeek这个名字出现的频率越来越高。从各种IDE插件到API调用,再到本地部署,几乎每天都能看到新的讨论。作为一个常年和Web自动化测试打交道的人,我自然也在关注:这个被热议的AI模型,到底能不能在实际的测试工作中帮上忙?特别是那些重复性高、维护成本大的UI自动化脚本,如果能用AI来辅助生成和维护,那效率提升可不是一点半点。

我花了大概两周时间,把DeepSeek的API、各种集成方式都摸了一遍,然后聚焦在一个最实际的问题上: 如何用DeepSeek来辅助完成一个完整的Web自动化测试任务? 这不是简单的“让AI写几行Selenium代码”,而是从需求理解、测试用例设计、代码生成、到脚本调试和维护的全流程探索。我发现,虽然DeepSeek不是万能的,但在特定场景下,它确实能成为一个强大的“副驾驶”,尤其适合那些对自动化测试有基本概念,但又被具体实现细节卡住的中级工程师。

这篇文章,我会把我探索的过程、踩过的坑、以及最终验证可行的方案,毫无保留地分享出来。无论你是想用DeepSeek来提升测试脚本的编写效率,还是单纯好奇AI在软件测试领域的应用边界,相信都能从中获得一些实用的参考。

2. 核心思路:让AI成为测试脚本的“构思者”而非“执行者”

在开始动手之前,我们必须先明确一个原则: 现阶段,完全依赖AI来自动生成完美可用的Web自动化测试脚本是不现实的。 我见过不少人尝试直接把需求描述扔给DeepSeek,然后指望它吐出一个能直接跑通的、健壮的测试套件,结果往往是失望的。元素定位不准、缺乏等待逻辑、异常处理薄弱……这些问题AI目前还很难一次性处理好。

因此,我的核心思路发生了转变。我不再追求“全自动”,而是追求“高效辅助”。我把DeepSeek定位为测试脚本的“高级构思者”和“代码片段的智能生成器”,而“执行者”和“最终决策者”仍然是我自己。具体来说,我希望DeepSeek能在以下几个环节发挥作用:

  1. 从自然语言到测试用例结构 :我能用中文描述一个测试场景(比如“用户登录成功”),让DeepSeek帮我列出这个场景下需要验证的关键检查点、操作步骤和预期结果,形成一个结构化的测试用例草案。
  2. 生成基础脚本框架 :基于结构化的测试用例,让DeepSeek生成对应编程语言(如Python+Pytest+Selenium)的基础脚本框架,包括Page Object的雏形、测试函数骨架等。
  3. 辅助定位元素和编写操作链 :对于复杂的页面操作,我可以描述“点击那个商品列表里的第一个‘加入购物车’按钮”,让DeepSeek尝试给出多种可能的选择器(CSS Selector, XPath等),并生成相应的操作代码片段。
  4. 解释错误与提供修复建议 :当脚本运行失败时,将错误日志和上下文代码提供给DeepSeek,让它分析可能的原因并提供修复方向。

这个思路的关键在于“人机协作”。AI负责快速产生大量草稿和选项,而我负责审核、选择、调整和最终集成。这能极大减少我在重复性编码和基础信息查找上的时间消耗。

注意:这个思路的成功,高度依赖于你给AI的“提示”(Prompt)质量。模糊的指令得到模糊的结果,清晰的指令才能得到有价值的输出。后续我们会详细探讨如何构建有效的提示。

3. 环境与工具准备:搭建你的AI增强型测试工作站

工欲善其事,必先利其器。要让DeepSeek流畅地融入你的Web自动化测试工作流,选择合适的接入方式至关重要。网上热词里提到了很多,比如VSCode插件、Cursor、API直接调用等。我逐一进行了尝试和对比。

3.1 DeepSeek接入方式选型

目前主流的有三种方式,各有优劣:

  1. 官方网页版/桌面端 :最简单,打开即用。适合进行零散的、探索性的问答,比如“用Pytest怎么写一个Selenium的Fixture?”。

    • 优点 :零配置,响应快,适合快速验证想法。
    • 缺点 :无法与你的代码编辑器深度集成,需要来回切换窗口复制粘贴,效率较低;对话上下文有限,对于复杂的、多轮次的脚本协作不友好。
  2. IDE插件集成(如VSCode的Claude Code, Cursor, Codeium等支持配置自定义模型) :这是我认为 效率最高 的方式。你可以在写代码的同一个界面里直接与AI对话,它能看到你整个项目的上下文,并能直接对文件进行编辑。

    • 以Cursor为例 :在Cursor的设置中,你可以找到配置AI模型的选项。你需要获取DeepSeek的API Key,然后将API Endpoint(通常是 https://api.deepseek.com/v1 )和模型名称(如 deepseek-chat )配置进去。配置成功后,你就可以在Cursor里使用 Cmd+K 来唤起AI,让它基于你当前打开的文件和项目结构来生成或修改代码。
    • 优点 :上下文感知能力强,无需切换工具,支持代码块直接插入,体验流畅。
    • 缺点 :需要一定的配置步骤,且依赖IDE插件的兼容性和稳定性。
  3. 直接调用API :最灵活,但需要一定的编程基础。你可以写一个Python脚本,调用 requests 库向DeepSeek API发送请求,处理返回结果。

    • 优点 :可以构建自动化流程,例如批量生成测试用例、自动分析测试报告等,可定制性极强。
    • 缺点 :开发成本最高,不适合快速启动。

我的选择与建议 :对于日常的Web自动化测试脚本开发,我强烈推荐 第二种方式——使用集成了DeepSeek的智能IDE 。我本人主要使用Cursor,因为它对AI的原生支持做得非常好。VSCode配合诸如Claude Code等插件也是不错的选择。这能保证你在思考、编码和AI辅助之间无缝切换。

3.2 基础测试环境搭建

无论用哪种AI,基础的Web自动化测试环境是根基。这里以最经典的Python + Selenium + Pytest组合为例,快速过一遍。

# 1. 创建项目目录并初始化虚拟环境(强烈推荐,避免包冲突)
mkdir deepseek-web-autotest && cd deepseek-web-autotest
python -m venv venv
# Windows: venv\Scripts\activate
# Mac/Linux: source venv/bin/activate

# 2. 安装核心依赖
pip install selenium pytest pytest-html allure-pytest

# 3. 安装浏览器驱动(以Chrome为例)
# 确保你已安装Chrome浏览器,然后下载对应版本的ChromeDriver:
# https://chromedriver.chromium.org/
# 将下载的chromedriver.exe(Windows)或chromedriver(Mac/Linux)放在项目根目录,或将其路径添加到系统PATH。

为了让AI更好地理解我们的项目,建议创建一个清晰的项目结构。AI在拥有良好结构的项目中,能给出更精准的建议。

deepseek-web-autotest/
├── pages/          # 页面对象模型(Page Object)目录
│   ├── __init__.py
│   ├── base_page.py # 基础页面类,封装通用方法
│   └── login_page.py # 示例:登录页面对象
├── tests/          # 测试用例目录
│   ├── __init__.py
│   └── test_login.py # 示例:登录测试
├── conftest.py     # Pytest全局配置,如浏览器Fixture定义
├── requirements.txt # 项目依赖列表
└── README.md

conftest.py 中,我们可以定义一个基础的浏览器Fixture,这样AI在生成测试用例时,就能知道我们如何使用Selenium。

# conftest.py
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

@pytest.fixture(scope="function")
def browser():
    """提供一个Chrome浏览器实例的Fixture"""
    options = Options()
    options.add_argument("--headless")  # 无头模式,不打开GUI,适合CI环境
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    driver = webdriver.Chrome(options=options)
    driver.implicitly_wait(10)  # 隐式等待
    yield driver
    driver.quit()

完成这些,你的“AI增强型测试工作站”就初步搭建好了。接下来,我们进入实战环节。

4. 实战演练:从零协作生成一个登录测试用例

让我们用一个最经典的场景——“网站登录功能测试”来演示整个协作流程。假设我们要测试一个虚构的电商网站 https://demo-shop.example.com 的登录功能。

4.1 阶段一:用AI进行测试用例分析与设计

首先,我不直接让AI写代码,而是让它帮我梳理测试思路。我在Cursor里新建一个对话,输入以下提示(Prompt):

Prompt: “我需要对一个电商网站的登录功能进行Web自动化测试。登录页面通常有用户名输入框、密码输入框、登录按钮,以及可能存在的‘记住我’复选框和‘忘记密码’链接。请帮我设计一个完整的测试用例集合,覆盖正例(成功登录)、反例(各种失败情况)以及相关UI元素验证。请用Markdown表格的形式列出用例ID、标题、前置条件、测试步骤、预期结果和优先级。”

AI输出(DeepSeek生成内容示例):

用例ID 标题 前置条件 测试步骤 预期结果 优先级
TC-LOGIN-001 使用有效凭据成功登录 1. 用户已注册
2. 位于登录页面
1. 在‘用户名’输入框输入有效用户名
2. 在‘密码’输入框输入对应密码
3. 点击‘登录’按钮
1. 登录成功,页面跳转至用户主页或仪表盘
2. 页面显示用户昵称或‘欢迎回来’提示
P0(高)
TC-LOGIN-002 用户名为空登录 位于登录页面 1. 保持‘用户名’为空
2. 输入任意密码
3. 点击‘登录’按钮
1. 登录失败,停留在登录页面
2. ‘用户名’输入框下方或附近出现错误提示(如:‘用户名不能为空’)
P1(中)
TC-LOGIN-003 密码为空登录 位于登录页面 1. 输入有效用户名
2. 保持‘密码’为空
3. 点击‘登录’按钮
1. 登录失败,停留在登录页面
2. ‘密码’输入框下方或附近出现错误提示
P1
TC-LOGIN-004 使用无效密码登录 位于登录页面 1. 输入有效用户名
2. 输入错误的密码
3. 点击‘登录’按钮
1. 登录失败,停留在登录页面
2. 页面顶部或登录按钮附近出现通用错误提示(如:‘用户名或密码错误’)
P1
TC-LOGIN-005 使用未注册用户名登录 位于登录页面 1. 输入一个未注册的用户名
2. 输入任意密码
3. 点击‘登录’按钮
1. 登录失败,停留在登录页面
2. 出现类似‘用户不存在’或‘用户名或密码错误’的提示
P1
TC-LOGIN-006 验证‘记住我’功能 位于登录页面 1. 输入有效凭据
2. 勾选‘记住我’复选框
3. 点击登录
4. 关闭浏览器后重新打开登录页
1. 登录成功
2. 重新访问登录页时,用户名字段可能被自动填充
P2(低)
TC-LOGIN-007 点击‘忘记密码’链接 位于登录页面 1. 点击‘忘记密码?’链接 页面跳转至密码重置页面 P2
TC-LOGIN-008 页面元素可见性验证 位于登录页面 1. 观察页面 1. 用户名/密码输入框、登录按钮清晰可见且可交互
2. 页面标题正确
P2

这个输出非常棒!它帮我系统性地思考了登录功能的测试点,避免了我自己可能遗漏的反例(如“记住我”)。现在,我有了清晰的测试大纲。接下来,我可以让AI基于其中某一个用例来生成代码框架。

4.2 阶段二:基于用例生成Page Object和测试脚本框架

我选择优先级最高的 TC-LOGIN-001 (成功登录)作为首个实现目标。首先,我需要创建页面对象。在 pages 目录下,我让AI帮我生成 login_page.py 的初稿。

Prompt(在Cursor中,已打开 pages/login_page.py 文件): “请基于刚才的测试用例分析,为登录页面创建一个Page Object类。类名为 LoginPage 。假设页面元素如下:

  • 用户名输入框: id=‘username’
  • 密码输入框: name=‘password’
  • 登录按钮: css selector=‘button[type=“submit”]’
  • 错误提示区域: class=‘error-message’ 请包含元素的定位、基本的操作方(如 input_username , input_password , click_login ),以及一个 login 方法,接收用户名和密码,执行完整的登录操作。请使用Python和Selenium。”

AI生成的代码示例:

# pages/login_page.py
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class LoginPage:
    """登录页面对象模型"""

    # 元素定位器
    USERNAME_INPUT = (By.ID, 'username')
    PASSWORD_INPUT = (By.NAME, 'password')
    LOGIN_BUTTON = (By.CSS_SELECTOR, 'button[type="submit"]')
    ERROR_MESSAGE = (By.CLASS_NAME, 'error-message')

    def __init__(self, driver):
        self.driver = driver
        self.wait = WebDriverWait(driver, 10)

    def _find_element(self, locator):
        """内部方法:查找元素,加入显式等待"""
        return self.wait.until(EC.presence_of_element_located(locator))

    def _find_clickable_element(self, locator):
        """内部方法:查找可点击元素"""
        return self.wait.until(EC.element_to_be_clickable(locator))

    def input_username(self, username):
        """输入用户名"""
        username_elem = self._find_element(self.USERNAME_INPUT)
        username_elem.clear()
        username_elem.send_keys(username)
        return self  # 支持链式调用

    def input_password(self, password):
        """输入密码"""
        password_elem = self._find_element(self.PASSWORD_INPUT)
        password_elem.clear()
        password_elem.send_keys(password)
        return self

    def click_login(self):
        """点击登录按钮"""
        login_elem = self._find_clickable_element(self.LOGIN_BUTTON)
        login_elem.click()

    def login(self, username, password):
        """执行登录流程"""
        self.input_username(username)
        self.input_password(password)
        self.click_login()

    def get_error_message(self):
        """获取错误提示文本,如果不存在则返回空字符串"""
        try:
            # 错误信息可能不会立即出现,稍作等待
            error_elem = WebDriverWait(self.driver, 3).until(
                EC.presence_of_element_located(self.ERROR_MESSAGE)
            )
            return error_elem.text
        except:
            return ""

这份初稿质量相当不错!它遵循了Page Object模式,封装了元素定位和操作,甚至加入了显式等待和链式调用支持,还考虑了错误信息的获取。但这只是理想情况,实际页面元素可能不同。接下来,我需要基于真实被测页面进行调整。

4.3 阶段三:适配真实页面与编写测试用例

现在,我需要打开真实的被测网站(假设我们有一个演示站点),用浏览器开发者工具查看实际的元素定位方式。我发现:

  • 用户名输入框的ID是 email
  • 登录按钮的CSS选择器是 .btn-login

我需要修改AI生成的 LoginPage 类。这时,我可以直接手动修改,也可以让AI辅助。例如,我选中 USERNAME_INPUT = (By.ID, 'username') 这行,在Cursor里用 Cmd+K 调出AI,输入:“把这个定位器改成 (By.ID, ‘email’) ”,AI就会帮我完成修改。

修改完毕后,开始编写测试用例。在 tests/test_login.py 中,我让AI生成测试函数骨架。

Prompt(在 tests/test_login.py 文件中): “请编写一个Pytest测试类 TestLogin ,包含对 TC-LOGIN-001 (成功登录)的测试。使用我们刚才定义的 LoginPage 类。需要用到 browser Fixture。假设成功登录后会跳转到 ‘https://demo-shop.example.com/dashboard’ ,并且页面标题包含‘仪表盘’。请写出完整的测试函数。”

AI生成的测试代码示例:

# tests/test_login.py
import pytest
from pages.login_page import LoginPage

class TestLogin:

    def test_login_success(self, browser):
        """测试用例 TC-LOGIN-001: 使用有效凭据成功登录"""
        # 1. 导航到登录页面
        browser.get("https://demo-shop.example.com/login")

        # 2. 初始化页面对象
        login_page = LoginPage(browser)

        # 3. 执行登录操作
        login_page.login("valid_user@example.com", "SecurePass123!")

        # 4. 验证登录成功
        # 4.1 验证URL跳转
        WebDriverWait(browser, 10).until(
            EC.url_to_be("https://demo-shop.example.com/dashboard")
        )
        assert browser.current_url == "https://demo-shop.example.com/dashboard"

        # 4.2 验证页面标题
        assert "仪表盘" in browser.title

        # 4.3 (可选)验证页面存在欢迎语等用户特定元素
        # welcome_element = browser.find_element(By.ID, "welcome-msg")
        # assert "valid_user" in welcome_element.text

这个测试函数结构清晰,包含了导航、操作和多重断言,是一个很好的起点。但是,它使用了硬编码的测试数据( “valid_user@example.com” )。在实际项目中,我们通常不会这样做。

4.4 阶段四:优化与增强:数据驱动与Fixture

现在,我需要优化这个测试。我可以向AI提问:“如何用Pytest的 @pytest.mark.parametrize 实现数据驱动,来测试 TC-LOGIN-002 TC-LOGIN-005 这些失败用例?”

AI给出的建议和代码片段:

import pytest
from pages.login_page import LoginPage

# 定义测试数据:用户名,密码,期望的错误信息关键词
login_fail_data = [
    ("", "anypassword", "用户名不能为空"),  # TC-LOGIN-002
    ("valid@email.com", "", "密码不能为空"),  # TC-LOGIN-003
    ("valid@email.com", "wrongpass", "用户名或密码错误"),  # TC-LOGIN-004
    ("not_exist@email.com", "anypass", "用户不存在"),  # TC-LOGIN-005
]

class TestLogin:

    @pytest.mark.parametrize("username, password, expected_error", login_fail_data)
    def test_login_failure(self, browser, username, password, expected_error):
        """参数化测试各种登录失败场景"""
        browser.get("https://demo-shop.example.com/login")
        login_page = LoginPage(browser)

        login_page.login(username, password)

        # 验证:应该停留在登录页面,并且出现包含预期关键词的错误提示
        assert "login" in browser.current_url  # 假设登录页URL包含‘login’
        actual_error = login_page.get_error_message()
        assert expected_error in actual_error, f"期望错误信息包含‘{expected_error}’,实际得到‘{actual_error}’"

同时,AI还提醒我,应该把基础URL和有效的登录凭证放到配置或Fixture里,而不是硬编码。我可以创建一个 conftest.py 来存放这些共享的Fixture。

# 在 conftest.py 中追加
import pytest

@pytest.fixture
def base_url():
    return "https://demo-shop.example.com"

@pytest.fixture
def valid_credentials():
    # 在实际项目中,这些信息应从安全的环境变量或配置文件中读取
    return {"username": "test_user", "password": "test_pass123"}

然后修改测试用例,使用这些Fixture。通过这样多轮的、聚焦的交互,我逐步将一个简单的测试想法,完善成了一个结构清晰、可维护性较高的自动化测试脚本雏形。

5. 避坑指南与经验心得

在实际使用DeepSeek辅助编写Web自动化测试脚本的过程中,我积累了一些非常重要的经验,这些是单纯看文档或教程学不到的。

5.1 提示工程:如何与AI高效沟通

AI的输出质量,八成取决于你的输入质量。以下是一些针对测试脚本编写的Prompt技巧:

  • 提供上下文 :在提问前,告诉AI你使用的技术栈(Python 3.9, Selenium 4, Pytest)、项目结构、以及你已经写了哪些代码(可以通过在IDE中打开相关文件让AI看到)。
  • 任务分解 :不要一次性要求“给我写一个完整的购物车测试套件”。应该拆解:“首先,请为商品详情页创建一个Page Object类,包含‘加入购物车’按钮的定位和点击方法。”
  • 指定格式和细节 :明确要求输出格式,如“请用Pytest格式编写”、“请使用显式等待而非 time.sleep ”、“元素定位请优先使用CSS Selector”。
  • 举例说明 :如果你有特定的编码风格,可以先给AI看一个你写好的例子,然后说“请按照类似的风格,为登录页面编写Page Object”。
  • 迭代优化 :AI第一次生成的代码很少是完美的。把它当作初稿,然后提出具体的修改要求,比如“这个XPath太脆弱了,请改用更稳定的CSS选择器”、“请在这个方法里增加错误处理日志”。

5.2 AI的局限性:它不擅长什么?

了解AI的弱点,才能更好地驾驭它。

  • 动态元素与复杂交互 :对于需要复杂条件判断、动态加载、Canvas或复杂JS交互的页面,AI生成的定位器和操作链往往不可靠。它无法“看到”页面实时状态。
  • 测试逻辑与业务断言 :AI可以生成“点击A,输入B”的代码,但对于“点击后如何断言业务状态是否正确”,它可能理解不深。你需要明确告诉它断言的条件。
  • 环境与配置 :AI不知道你本地Chrome的版本、不知道你的测试数据库连接字符串。所有与环境相关的配置,都需要你手动提供或调整。
  • 代码风格与架构 :虽然可以指定,但AI对大型项目的架构(如如何组织测试数据、如何设计分层Fixture)理解有限,需要你主导设计。

5.3 必须人工复核的关键点

绝对不要 将AI生成的代码不经审查就直接投入运行。以下环节必须人工把关:

  1. 元素定位器 :这是Web自动化的生命线。AI生成的XPath可能又长又脆弱(如 //div[3]/div[2]/span[5] )。你必须亲自用浏览器开发者工具验证定位器的唯一性和稳定性,并尽可能优化为更简洁的ID、Class或属性选择器。
  2. 等待策略 :AI可能会滥用 time.sleep ,或者使用不恰当的等待条件。你需要将其替换为合理的隐式/显式等待,确保脚本的稳定性和执行效率。
  3. 断言 :仔细检查每一个断言。它是否真正验证了业务需求?断言的条件是否充分且必要?错误的断言会导致测试通过但功能实际有bug。
  4. 测试数据 :确保测试数据是有效的、隔离的,并且不会对生产环境造成影响。AI不知道你的测试账号是什么。
  5. 异常处理与清理 :检查脚本在失败时是否能妥善清理资源(如关闭浏览器、删除测试数据)。AI生成的代码可能缺乏健壮的错误处理。

5.4 一个高效的协作工作流

基于以上经验,我总结出一个高效的人机协作工作流:

  1. 需求分析阶段 :用AI(如DeepSeek网页版)进行头脑风暴,生成测试点矩阵和用例草案。
  2. 框架搭建阶段 :在IDE中,用AI辅助创建基础的Page Object类、测试Fixture和项目结构。
  3. 脚本编写阶段 :针对单个具体操作或断言,向AI描述需求,生成代码片段。然后 立即人工复核 定位器、等待和断言,并集成到项目中。
  4. 调试与优化阶段 :当脚本运行失败时,将错误日志和上下文代码喂给AI,让它分析可能原因,提供修复建议。你根据建议进行尝试和验证。
  5. 重构与维护阶段 :当需要统一修改代码风格、提取公共方法或增加日志时,可以让AI辅助进行批量修改。

这个流程的核心是“AI生成,人类决策”。AI负责提供选项和草稿,极大地扩展了你的思维边界和编码速度;而你负责把控方向、审核质量和确保最终交付物的可靠性。经过这样的磨合,DeepSeek确实成为了我进行Web自动化测试时一个非常得力的助手,让我能把更多精力花在测试设计和业务逻辑验证上,而不是纠结于繁琐的代码语法和简单的重复劳动。

更多推荐