利用AI提升Selenium測試穩(wěn)定性:告別脆弱的定位器
维护测试定位器就像是在打地鼠游戏——你刚觉得它稳定了,有人就修改了DOM,一切都开始出问题了。
但是如果人工智能能够理解你的应用程序结构并动态生成定位器信息会怎么样?
我们都曾面临过的定位难题让我们来谈谈我是如何使用 OpenAI的GPT-4 来 重新思考 定位器的维护的。
在传统的Selenium测试中,定位元素通常是硬编码的。
// 登录按钮通过ID定位
By loginButton = By.id("login-button");
// 通过CSS选择器定位邮箱输入框
By emailField = By.cssSelector("input[name='email']");
它有效,直到某天不再有效。
你的测试在以下情况会失败:
- ID变化
- 类名被另一个团队改了
- DOM稍微调整
-
你换了环境或主题
突然,你发现自己在找HTML漏洞,试图修复本应很简单的东西。
想象一下,如果你可以询问一个AI,让它查看你的页面并返回智能且描述性强的选择器,而不是手动编写定位器。这正是我所打造的。
核心思想如下:
- 获取页面的HTML源代码
- 让GPT-4使用提示提取可用的定位器
- 接收一个干净的JSON数组,包含 {name, selector, type}
- 缓存结果,避免重复调用API
不再会有脆弱的定位器。只有坚韧智能的元素选择。
工作原理(内部运作)1. 和 OpenAI 的整合
我们将整个页面的源代码连同精心设计的提示一起发送给GPT-4模型:
public static String GetLocatorsForPageAsJson(String pageSource) {
String normalizedSource = normalizePageSource(pageSource);
String cached = LocatorCache.getCachedLocators(normalizedSource);
if (cached != null) return cached;
var client = OpenAIOkHttpClient.builder().apiKey(openAIKey).build();
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.addUserMessage(
"仅从页面源代码中返回一个包含定位器的 JSON 数组。" +
"每个定位器应该是一个包含以下属性的对象:{\"locatorName\":\"描述性名称\"," +
"\"locator\":\"选择器值\",\"locatorType\":\"xpath、css、id...\"}")
.model(ChatModel.GPT_4_1)
.build();
String response = client.chat().completions().create(params)
.choices().get(0).message()._content().toString();
LocatorCache.cacheLocators(normalizedSource, response);
return response;
}
2. 如何阅读和使用定位器
等 JSON 回来后,我们就将其转换为 Selenium 定位器:
public static void 从JSON加载定位器(String jsonFilePath) {
ObjectMapper objectMapper = new ObjectMapper();
List<Locators> locators = objectMapper.readValue(jsonFilePath,
new TypeReference<List<Locators>>() {});
locatorsMap 清空();
对于每个定位器 locator 在 locators 中 {
String key = locator.getLocator();
String type = locator.getLocatorType();
By by = switch (type.toLowerCase()) {
case "xpath": 返回 By.xpath(key);
case "css": 返回 By.cssSelector(key);
case "id": 返回 By.id(key);
默认: 抛出新 IllegalArgumentException("不支持的类型: " + type + ",类型不正确");
};
locatorsMap.put(locator.getLocatorName(), by);
}
}
🚀 在测试中使用AI生成的定位点
加载完成后,您的测试可以使用描述性名称运行。
String pageSource = driver.getPageSource(); // 获取网页源代码
String json = OpenAIHelper.GetLocatorsForPageAsJson(pageSource); // 获取页面元素定位器的JSON表示
LocatorReader.loadLocatorsFromJson(json); // 从JSON加载页面元素定位器
By loginButton = LocatorReader.findLocatorByPartialName("Login button"); // 获取登录按钮的定位器
By emailField = LocatorReader.findLocatorByPartialName("email"); // 获取邮箱输入框的定位器
By passwordField = LocatorReader.findLocatorByPartialName("password"); // 获取密码输入框的定位器
driver.findElement(emailField).sendKeys("user@example.com"); // 在邮箱输入框中输入用户名
driver.findElement(passwordField).sendKeys("password123"); // 在密码输入框中输入密码
driver.findElement(loginButton).click(); // 点击登录按钮
无需脆弱的选择器,无维护困扰,只需适应性自动化。
🎁 你能得到的- 自愈测试 — 测试会随着您的UI演进而适应
- 无需猜测定位器 — GPT会提供干净、可用的选择器
- 更少的代码更新 — 无需每次DOM变化时都重新编译代码
- 自然语言映射 — 通过意图而非语法查找元素
- 更智能的缓存 — 不要浪费API调用 — 只需重复使用有效内容
在你跳进去之前,考虑一下
- API费用 — GPT-4并不免费。批量调用并聪明地使用缓存。
- 速率限制 — 在CI/CD流程中避免频繁调用OpenAI。
- 不一致的页面 — 复杂且动态的页面可能会让模型出错。
- 安全 — 绝不要将敏感数据发送给外部API。
这不仅仅是巧妙的创意,更是一次思维模式的转变。
我们不再围绕DOM进行编码。告诉智能系统我们需要什么,让它搞定方法。就像从汇编语言升级到高级语言一样——这就是下一个飞跃。
如果你对脆弱的定位器感到厌烦,并希望你的测试能够真正跟上应用的步伐,可能是时候让AI加入你的自动化流程了。
让我们不要再写那些会失败的测试。让我们开始写能不断学习的测试。 🧠✨
谢谢你看完了这篇!
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章