如何构建自动生成Java版Selenium WebDriver测试的AI智能体:测试自动化工程师实用指南
人工智能正在通过实现更快的测试创建、更智能的执行和更高效的质量保证流程,改变软件测试。借助 AI 智能体,我们可以用最少的人工投入生成测试用例和脚本、运行测试并生成详细报告。AI 智能体 是代表用户利用人工智能达成目标并执行任务的软件系统。它们能够思考问题、规划行动并记住信息,同时还能自主决策并随时间改进。在本教程中,我们将构建一个正好能做到这一点的 AI 驱动智能体。它接收一个包含用简明英语编写的简单用例的 .txt 文件,使用 OpenAI 或 Ollama 等 AI 模型处理它,并生成 Java 编写的 Selenium 测试自动化脚本。
我们将构建一个用于测试自动化的 AI 智能体,它将执行以下任务:
- 从 .txt 文件读取测试场景
- 根据配置文件中选定的提供商,将场景连同合适的提示词发送给 OpenAI/Ollama
- 生成 Selenium WebDriver Java 测试自动化脚本,并拆分为:
- 页面对象类
- 测试类
- testng.xml
- 包含说明和运行测试步骤的 README.md
前置条件
开始构建用于测试自动化的 AI 智能体需要以下前置条件:
- Python 3.14 及以上
- 代码编辑器(推荐 VS Code)
- 对 Python 和终端有基本了解
- 用简明英语文本编写的测试场景
LLM 设置
- OpenAI API 密钥
- 在本地机器上设置 Ollama
理解 Selenium AI 测试生成工作流
在深入构建 AI 智能体之前,我们先从高层了解这个 AI 智能体如何生成 Selenium Java 测试自动化脚本:
[LOADING...]
下面逐步解释该过程:
- 用户输入:用户在 .txt 文件中提供用简明英语编写的测试场景。
- 处理层:Python 主脚本读取测试场景文件,并根据配置将其转发给 LLM 模型(OpenAI 或 Ollama)。
- AI 引擎:在向 LLM 发送请求之前,AI 智能体会将测试场景从简明英语转换为结构化提示词,并添加明确指令,例如:
- 用 Java 生成 Selenium WebDriver 代码
- 使用 TestNG 框架
- 遵循页面对象模型
- 生成多个页面对象类(如需要)
- 生成代码的规则
- 文件输出格式
LLM 理解测试描述、步骤和预期行为,并将其转换为相应的文件。
- 文件生成:AI 智能体创建一个基于时间戳的新文件夹,并将生成的代码存储到不同文件中,分别拆分为页面对象类、测试类、testng.xml 和 README.md。
[LOADING...]
让我们按照以下分步指南开始构建 AI 智能体:
步骤 1:创建并激活 Python 虚拟环境
在终端中运行以下命令创建 Python 虚拟环境:
接下来,运行以下命令激活虚拟环境:
在 MacOS/Linux 上:
在 Windows 上:
步骤 2:安装依赖
我们来创建 requirements.txt,因为它就像一份蓝图,用于重建运行项目所需的精确环境,从而在不同环境中保持一致。
应从终端运行以下命令来安装依赖:
步骤 3:编写配置文件
配置文件保存与 OpenAI、Ollama、输入和输出文件相关的详细信息,以及使用所需 LLM 提供商生成测试自动化脚本的设置。
配置文件作为集中式配置系统,用于在 LLM 提供商之间切换并管理文件设置。下面我们分解一下以便进一步理解:
- 数据类:
@dataclass会自动生成__init__()方法,使创建和管理对象更容易,无需编写样板代码。 - 独立配置:为 OpenAI、Ollama 以及输入/输出文件处理分别定义了配置类,每个类都有默认值。输入文件名当前配置为 sample_test_case.txt。
- AppConfig:AppConfig 类作为中心包装器,可通过一个标志在提供商(OpenAI 或 Ollama)之间切换。
- field(default_factory=...):它确保每个配置都有自己的实例,避免共享状态问题。
步骤 4:实现用于读取和生成代码的工具函数
在这一步中,我们将创建一个名为 tools.py 的新 Python 文件,并在其中实现以下工具函数:
load_test_case_from_file()build_prompt()generate_with_openai()generate_with_ollama()generate_selenium_test_script()create_timestamped_output_dir()split_and_save_files()
应在 tools.py 文件中导入以下包:
我们逐个学习这些工具函数。
load_test_case_from_file() 函数:
load_test_case_from_file() 函数以测试用例文件路径为参数,读取其内容并以字符串形式返回。它安全地处理错误:如果文件未找到,会抛出清晰的消息;并将任何其他意外问题包装为 RuntimeError。
build_prompt() 函数:
build_prompt() 函数是应用程序的核心部分,因为它构造发送给 LLM 的提示词,以生成 Selenium Java 测试自动化代码。它以用例文本为输入,并将其嵌入详细的指令模板中,引导模型使用 POM 和 TestNG 等最佳实践生成基于 Java 的 Selenium 测试。该提示词还强制执行文件格式规则,如 (===FILE: filename===),以确保输出结构化、一致,并可直接用于生成文件而无需手动清理。它还强制按严格顺序生成 POM、测试类、testng.xml 和 README,以保持输出一致。
使用有效的提示词
有效的提示词对于使用 AI 生成干净、可靠的 Selenium 测试脚本至关重要。通过清晰定义需求,可以引导模型使用最佳编码实践、创建干净的测试脚本,并使用 页面对象模型(POM)生成结构良好的代码。
为更好的 Selenium Java 测试设计提示词
清晰、具体的提示词有助于 AI 生成更干净的 Selenium 测试脚本。提及使用 Java 编写 Selenium、使用最新版本的 Selenium 和 TestNG、遵循编码最佳实践等细节,以便 AI 更好地满足需求并生成设计良好的输出。
为页面对象模型(POM)自定义提示词
以下提示词可用于训练 AI 生成我们需要的页面对象文件:
- 使用最佳实践生成页面对象类。
- 生成多个页面对象类(如需要)。
- 不要在页面对象类中实例化 WebDriver。
- 不要创建重复的页面对象类。
- 此外,我们还可以提到使用最佳定位器策略,例如优先使用 ID 和 CSS 选择器而不是复杂的 XPath,使测试更稳定、可读且易于维护。
generate_with_openai() 函数:
generate_with_openai() 函数向 OpenAI API 发送提示词,以生成 Java 编写的 Selenium WebDriver 测试脚本。OpenAI 客户端使用环境变量中的 API 密钥初始化,使代码能够安全地连接和交互 OpenAI 服务。它使用配置中的模型、温度和令牌限制。它生成请求时包含一条定义 AI 角色的消息和用户提示词(这里将提供 build_prompt() 函数的结果)。API 返回多个选择,函数从第一个响应中提取生成内容。最后,它将生成的测试脚本作为字符串返回。
generate_with_ollama() 函数:
generate_with_ollama() 函数通过向配置的 Ollama API 端点发送 POST 请求来生成文本。它将预定义的基础提示词与用户提供的提示词组合起来,并连同模型名称和流式配置一起发送。收到响应后,raise_for_status() 检查 HTTP 错误,response.json() 将响应解析为 Python 字典。生成的文本从 response 字段中提取,如果该字段缺失则使用空字符串。最后,函数记录响应长度并返回生成的文本。
generate_selenium_test_script() 函数:
generate_selenium_test_script() 函数作为一个包装器,根据输入的测试用例生成 Selenium WebDriver 测试脚本。它首先使用 build_prompt(test_case_text) 函数构建提示词,为 LLM 准备输入。接下来,根据配置的提供商(即 OpenAI 或 Ollama),动态调用相应函数生成脚本。如果指定了不支持的提供商,它会抛出 ValueError,以防止意外行为。
create_timestamped_output_dir() 函数:
create_timestamped_output_dir() 函数创建一个以当前日期和时间命名的新文件夹,因此每次运行都会获得自己唯一的输出目录。它确保该文件夹存在(如需要则创建),并返回其路径以保存文件。
split_and_save_files() 函数:
split_and_save_files() 函数接收 AI 生成的响应,并基于标记 (===FILE:) 将其拆分为多个文件。它提取每个文件名及其内容,然后将它们保存到适当的文件夹中。页面对象文件放入 pageobjects 目录,而测试类、testng.xml 和 README.md 文件放入主 output/ 文件夹。如果缺少预期结构,它会抛出错误,以避免保存不正确的输出。
步骤 5:编写主脚本将所有内容串联起来
在这一步中,我们将创建一个 main.py 文件,用于编排使用 AI 生成 Selenium 测试脚本的完整工作流:
main.py 文件是程序启动并管理从开始到结束生成 Selenium 测试脚本整个过程的地方。它读取输入测试用例文件,将测试用例发送给 AI 以生成自动化脚本,并生成带时间戳的输出文件夹。脚本生成后,它会将脚本拆分为多个文件并保存到适当的目录中。如果发生任何异常,它会捕获错误并打印消息“生成输出文件时发生错误”以及异常详细信息。
生成第一批测试脚本
让我们创建一个新的文本文件 sample_test_case.txt,并将其放在 input/ 文件夹中,包含以下测试场景,以使用我们创建的 AI 智能体生成 Selenium 测试脚本:
配置和设置
使用 OpenAI
创建一个 .env 文件,并在其中添加你的 OpenAI API 密钥。此文件应始终保留在本地机器上,不应提交到远程仓库。
使用 Ollama
- 下载并安装 Ollama。
- 在终端中运行命令
ollama serve启动 Ollama。 - 通过运行命令 ---
ollama pull qwen3:8b拉取 Qwen3:8b 模型。
创建一个 .env 文件并在其中更新以下详细信息:
在运行模型之前,确保 Ollama 在后台运行。打开终端并运行命令 ollama serve
注意:不需要显式运行模型。
运行 AI 智能体
打开终端并运行以下命令以生成测试脚本:
AI 智能体成功运行后,控制台应打印以下日志:
[LOADING...]
测试脚本应生成在 output/ 文件夹内新创建的 时间戳(YYYY-MM-DD_hh-mm-ss) 文件夹中:
[LOADING...]
审查生成的 Java Selenium 代码
让我们检查 output/ 文件夹中生成的每个文件,并审查代码,以验证它是否符合我们定义的测试场景,并遵循预期结构和最佳实践。
生成了以下页面对象类:
LoginPage.java
页面对象文件已正确生成,使用了名称和 XPath 定位策略,并创建了适当的方法来与页面上的相应 WebElements 交互。但是,缺少 import 语句,应添加这些语句以避免错误。此外,应检查定位器,并可以在该类中添加显式等待,以在定位元素时减少测试执行过程中的不稳定性。生成了以下测试类:LoginTest.java
该测试类是根据所提供的提示生成的,并包含用于初始化和清理的 @BeforeMethod 和 @AfterMethod 注解。然而,它包含了 System.setProperty(),这可以移除,因为最新版本的 Selenium 不需要通过它来设置 ChromeDriver 路径。缺少 @AfterMethod 注解的导入语句,应该添加它。此外,myAccountPageTitle WebElement 可以移到一个单独的 MyAccount 页面对象类中,并且还应该验证其 XPath,以确保它指向页面上正确的元素。
Testng.xml
一旦代码移到项目中,就应该更新限定类名。
README.md
关于 ChromeDriver 可执行文件的步骤和运行 testng.xml 的命令可以移除,因为它们不准确。相反,可以在这里更新为通过右键单击 testng.xml 来运行它的步骤。
总体而言,AI 代理快速生成了测试代码,节省了人工工作,并提供了一个良好的起点。然而,在项目中使用之前,请审查、验证并完善代码。
使用 AI 代理时的最佳实践
在使用 AI 代理生成自动化代码时,应考虑以下最佳实践:
- 提高提示质量以获得可靠的测试:清晰且详细的提示有助于 AI 生成稳定的测试脚本。提及框架名称、命名约定和编码标准等要求,以改进结构并避免错误。
- 添加断言和验证:始终确保生成的测试包含适当的断言,以验证预期结果。这有助于确认应用程序行为正确,而不仅仅是执行操作。
- 在执行前审查并重构生成的代码:在运行 AI 生成的代码之前,始终先审查它。重构有助于消除冗余、提高可读性,并使代码与项目标准保持一致。
- 处理无效/空输入:在处理测试用例文件等输入之前,先验证它们。确保为空的或无效的数据添加适当的步骤和验证检查,以防止执行期间出现意外失败。
- 集成 OpenAI API 错误处理:对 API 调用进行适当的错误处理有助于管理超时、速率限制或响应失败等问题。使用 try-catch 块并记录错误消息可以提高错误可读性。异常处理有助于用简单的语言解释错误消息,并使调试更容易。
- 日志记录和调试技巧:在关键步骤添加日志有助于跟踪执行流程并快速识别问题。清晰的日志消息使调试更容易,尤其是在处理 AI 生成的输出和 API 调用时。
观看分步 YouTube 教程:如何构建一个 AI 代理来用 Java 生成 Selenium WebDriver 测试。
局限性与挑战
在使用 AI 代理生成测试脚本时,可能会遇到以下局限性和挑战:
- AI 生成的脚本可能会失败:AI 生成的测试脚本可以作为一个起点,但当输入提示不清晰或缺少重要细节时,它们可能会失败。它们也可能因为动态元素、错误的 UI 假设或特定环境问题而失败。
- 手动清理/选择器准确性:AI 生成定位器可能并不总是可靠或最优。始终审查并完善 AI 生成脚本中的定位器,优先使用 ID 或 CSS 选择器等稳定选项,而不是复杂的 XPath。
- 测试维护和不稳定性考虑:如果 AI 生成的测试没有正确处理等待、动态内容或同步,它们可能会不稳定。添加适当的等待并改进测试设计可以减少不稳定性。随着应用程序的演进,需要定期维护以保持测试稳定。
- 审查幻觉:AI 有时会生成不正确或不存在的方法、元素或逻辑。在执行之前仔细审查代码,以捕捉此类幻觉。根据实际应用程序行为进行验证,可确保测试准确且可用。
结论
要设计一个生成测试脚本的 AI 代理,需要创建一个包含清晰规则、结构化输出格式和严格指南的全面提示,以确保结果一致。同时,验证和完善生成的代码,并优雅地处理边缘情况和失败也很重要。这一切都取决于团队的决定;由于 AI 正在不断发展,设计一个生成测试自动化脚本的 AI 代理也可能是一种可行且灵活的方法,尤其是在定制和控制很重要的情况下。