实测对比:ChatGPT写UI自动化脚本,到底靠不靠谱?

简介: 本文记录了作者用ChatGPT编写Selenium UI自动化脚本的真实实测:从登录、新增用户到多轮优化,对比AI生成代码与手写代码的差异。结果表明——AI能快速搭架子,但需人工引导、审查与加固;它不替代 tester,而是高效助手。

上个月我们组里搞了个“AI+测试”的小型分享会,结果差点吵起来。

起因是老张甩出一句话:“我试过让ChatGPT写Selenium脚本,根本没法用,定位全是错的。” 旁边的小陈立刻反驳:“那是你不会问,我让它写的登录脚本,改改就能跑。”

两边各执一词,谁也说服不了谁。我坐在旁边听,心想:争啥呢,拉出来遛遛不就知道了。

正好手头有个活——给一个后台管理系统的“新增用户”模块写UI自动化脚本。页面不复杂,但该有的都有:登录、表单、下拉框、单选按钮、提交验证。我决定用这个当试验田,让ChatGPT写一份,我自己手写一份,看看差距到底有多大。

下面就是这两天的实测记录,有代码,有翻车,也有真香的时刻。

一、先交代一下被测对象
被测页面是一个典型的管理后台:

需要先登录(URL:http://test.admin.com/login)
登录后进入用户管理,点击“新增用户”按钮弹出表单
表单字段:
用户名(输入框,name="username")
手机号(输入框,name="mobile")
邮箱(输入框,name="email")
角色(下拉框,id="role",选项:普通用户、管理员)
状态(单选按钮,name="status",值:1启用,0禁用)
提交按钮,提交后跳转回用户列表,新用户应显示在列表中
测试框架用Python + Selenium,浏览器Chrome。

二、第一轮:写登录脚本
我先给ChatGPT发了一段提示:

“用Python和Selenium写一个登录脚本,URL是http://test.admin.com/login,用户名输入框id是username,密码输入框id是password,登录按钮id是loginBtn。登录成功后跳转到首页。”

它秒回了一段代码,我简化一下核心部分:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("http://test.admin.com/login")
driver.find_element(By.ID, "username").send_keys("admin")
driver.find_element(By.ID, "password").send_keys("123456")
driver.find_element(By.ID, "loginBtn").click()

time.sleep(3)
print(driver.current_url)
driver.quit()
这段代码语法没问题,该有的都有。但我一看就皱眉头——这是教学代码,不是工程代码。

没有等待,直接用time.sleep,脚本会变慢且不稳定
没有错误处理,如果登录失败,它也不知道
没有检查登录结果,只是打印了URL
我追问了一句:“如果登录失败,怎么判断?”

ChatGPT补了一段:

if "index" in driver.current_url:
print("登录成功")
else:
error = driver.find_element(By.CLASS_NAME, "error").text
print("登录失败:", error)
加了判断,但依然没解决等待问题。如果页面加载慢,driver.current_url可能还是登录页的URL,导致误判。

而我手写的版本是这样的:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.ID, "loginBtn"))).click()
wait.until(EC.url_contains("index"))
第一轮小结:ChatGPT生成的登录脚本可运行,但属于“玩具代码”,缺乏工程健壮性。如果直接拿它跑自动化流水线,大概率会时不时报错。

三、第二轮:写新增用户脚本
接下来我让它写新增用户的脚本。这次我给了更详细的元素信息:

“登录后进入用户管理页面,点击‘新增用户’按钮,该按钮XPath是//button[text()=‘新增用户’]。表单字段:用户名输入框name=username,手机号输入框name=mobile,邮箱输入框name=email,角色下拉框id=role,单选按钮name=status(启用选value=1,禁用选value=0)。提交按钮XPath=//button[@type=‘submit’]。”

ChatGPT生成的代码:

点击新增用户

driver.find_element(By.XPATH, "//button[text()='新增用户']").click()
time.sleep(1)

填写表单

driver.find_element(By.NAME, "username").send_keys("testuser01")
driver.find_element(By.NAME, "mobile").send_keys("13800138000")
driver.find_element(By.NAME, "email").send_keys("test@xx.com")

选择角色

from selenium.webdriver.support.ui import Select
role_select = Select(driver.find_element(By.ID, "role"))
role_select.select_by_visible_text("普通用户")

选择状态(启用)

driver.find_element(By.XPATH, "//input[@name='status' and @value='1']").click()

提交

driver.find_element(By.XPATH, "//button[@type='submit']").click()
time.sleep(2)
这段代码看起来挺全,但细看全是坑:

坑1:无等待,纯靠sleep点击“新增用户”后,表单可能还没渲染完,脚本就直接找输入框,极不稳定。

坑2:元素定位太脆弱比如状态单选按钮,它用@value='1'定位。万一哪天开发把value改成‘enabled’呢?脚本立刻挂。

坑3:数据写死用户名“testuser01”只跑第一次有效,第二次就跑不过了(唯一冲突)。

坑4:没有断言提交后它只sleep 2秒,完全不管成功与否。

而我手写的版本至少会考虑这些:

用显式等待代替sleep
生成随机用户名避免重复
对单选按钮用更灵活的方式(比如找包含“启用”文本的label)
提交后等待列表加载,并断言新用户出现
四、第三轮:让ChatGPT改进
看到这,你可能觉得ChatGPT写的UI脚本完全不靠谱。别急,我试着继续“调教”它。

我把问题一个一个抛给它:

“不要用sleep,用显式等待。用户名用随机数避免重复。提交后要断言新用户出现在列表里。”

ChatGPT重新生成了一版,代码变长了,但质量明显提升:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
import random

def test_add_user(driver):
wait = WebDriverWait(driver, 10)

# 点击新增用户
add_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='新增用户']")))
add_btn.click()

# 等待表单加载
wait.until(EC.presence_of_element_located((By.NAME, "username")))

# 生成随机用户名
username = f"testuser{random.randint(1000, 9999)}"
mobile = f"138{random.randint(10000000, 99999999)}"
email = f"{username}@test.com"

# 填写表单
driver.find_element(By.NAME, "username").send_keys(username)
driver.find_element(By.NAME, "mobile").send_keys(mobile)
driver.find_element(By.NAME, "email").send_keys(email)

# 选择角色
Select(driver.find_element(By.ID, "role")).select_by_visible_text("普通用户")

# 选择状态
driver.find_element(By.XPATH, "//input[@name='status' and @value='1']").click()

# 提交
driver.find_element(By.XPATH, "//button[@type='submit']").click()

# 等待列表加载
wait.until(EC.presence_of_element_located((By.XPATH, "//table//tr")))

# 断言新用户出现
user_names = [e.text for e in driver.find_elements(By.XPATH, "//table//tr/td[1]")]
assert username in user_names, f"用户 {username} 未找到"

这段代码已经和我手写的版本很接近了,可以直接拿去跑。唯一的不足是定位策略(比如单选按钮的XPath)还可以优化,但至少思路是对的。

五、多轮对话:还能更好吗?
我继续和ChatGPT对话,让它进一步优化:

我问:单选按钮的XPath写得太死,如果value变化怎么办?

ChatGPT答:可以用关联的文本定位,比如找包含“启用”的label,然后找对应的input。

它给出了改进版:

通过label文本找到对应的单选按钮

enable_label = driver.find_element(By.XPATH, "//label[contains(text(),'启用')]")
enable_label.click() # 如果label可点击

或者

enable_radio = driver.find_element(By.XPATH, "//label[contains(text(),'启用')]/preceding-sibling::input")
enable_radio.click()
我问:如果列表有分页,新用户可能在第二页,怎么处理?

ChatGPT答:可以循环点击下一页,直到找到用户或到达最后一页。

它给出了一个带分页处理的断言函数。

六、实测结论:到底靠不靠谱?
经过两天的折腾,我让ChatGPT写了十几个版本的脚本,跑了无数遍,最后总结几条实实在在的结论:

  1. 能写,但别指望它一次性写对
    ChatGPT第一次生成的代码,只能算是“毛坯房”——骨架有,但装修全无。如果你直接复制粘贴去跑,大概率会碰到元素找不到、等待不够、数据冲突等各种问题。

  2. 它写脚本的上限,取决于你的“引导”
    我发现,跟ChatGPT对话写脚本,有点像带实习生:你交代得越清楚,它产出得越好。如果你只丢一句“写个登录脚本”,它就给你个最简单的demo;如果你告诉它“用显式等待,处理异常,随机生成数据”,它就能生成工程级的代码。

  3. 它最大的价值是“搭架子”
    我现在的工作流变成了这样:

让ChatGPT先按我的描述生成一个基础脚本
我review,指出问题(“这里没等待”,“那里定位不靠谱”)
它迭代优化,我再补充细节
原来写一个模块的UI脚本要半天,现在一小时搞定——ChatGPT负责搭架子,我负责填坑和加固。

  1. 它不懂你的业务上下文
    ChatGPT不知道你这个页面是异步加载的,不知道某个按钮点击后会弹窗,不知道列表默认分页20条。这些信息你必须告诉它,或者自己补。

七、给想入坑的同学几个实操建议
如果你也打算让ChatGPT帮你写UI自动化脚本,这几个技巧能让你少踩坑:

技巧1:给HTML样例

如果能从浏览器复制一小段目标元素的HTML,贴给ChatGPT,它生成的定位器会准得多。

技巧2:明确要求“显式等待”

在提示词里加一句“不要用time.sleep,全部用WebDriverWait”,代码质量立刻上一个台阶。

技巧3:让它写多个版本

比如“用PageObject模式重写这段脚本”,它能给你一个结构清晰的版本。

技巧4:保持怀疑态度

ChatGPT生成的断言往往只覆盖它“看到”的字段,但你业务上可能还需要校验其他字段。所以它的代码只能当草稿,最终还得你自己把关。

写在最后:工具还是工具
这次实测下来,我对ChatGPT的看法变了。

之前我觉得它“不靠谱”,是因为我期待它像人一样理解页面、理解业务。后来我发现,它不是来替代我的,是来给我打下手的。

它替我干了最烦的活——写样板代码、搭测试架子、生成基础断言。而我干它干不了的——判断业务逻辑、优化定位策略、处理异常场景。

就像今天,我用ChatGPT搭了一个新增用户的脚本,然后花了十分钟微调,跑通了。旁边的小周还在手写第一个函数,抬头问我:“你这AI写的?”

我说:“AI写的,但人审的。”

他若有所思地点点头。

我猜下周,他也要开始“带实习生”了。

相关文章
|
2月前
|
人工智能 自然语言处理 文字识别
快手海外版测试不传之秘:AI一键翻译验证所有语种UI截断,把LQA周期从7天干到20分钟
本文介绍快手国际化团队如何用AI实现多语言UI自动化LQA测试:通过“自动化遍历+多模态视觉校验+智能报告”三层架构,将32种语言的LQA周期从7天压缩至20分钟,漏测率下降91%,大幅提升出海产品本地化质量保障效率。
|
7月前
|
人工智能 运维 自然语言处理
喂饭级教程:OpenClaw阿里云/本地部署+K8s MCP 配置自动化管理容器集群,打造AI运维助手!
在AIOps领域,OpenClaw的爆火为运维工作带来了新可能——通过AI代理能力对接Kubernetes MCP(Management Communication Protocol),可实现容器集群的自动化监控、故障排查与资源管理。但OpenClaw对MCP的原生支持并不友好,需通过适配MCP客户端、封装专属技能,才能让AI真正接管运维任务。
3147 130
|
8月前
|
人工智能 测试技术
AI 写的测试用例,你敢直接用吗?这套判断方法,很多团队正在用
本文直击AI写测试用例的核心矛盾:不问“会不会写”,而聚焦“能不能用”。提出四大落地判断标准——业务贴合度、可执行性、异常覆盖力、规范一致性,帮测试工程师快速甄别AI用例价值,实现从“生成即用”到“工程化采纳”的跃升。
|
7月前
|
人工智能 Linux API
OpenClaw Skill开发实战从入门到精通:阿里云/本地部署与免费国产大模型适配实操指南
OpenClaw的Skill插件体系与多Agent协同架构,让AI工具的定制化变得轻量化、平民化,2026年版本对跨平台部署与国产大模型的深度适配,更是降低了个人开发者与中小团队的使用门槛。从简单的RSS抓取Skill开发,到全平台的OpenClaw部署,再到阿里云百炼免费大模型的适配,整个流程无需复杂的底层开发,只需遵循固定的规范与步骤,即可快速搭建专属的AI工具体系。未来,随着OpenClaw社区的不断发展,更多的优质Skill将被开发与共享,AI Agent的应用场景也将进一步延伸至办公、研发、运营等各个领域。
2374 4
|
5月前
|
人工智能 自然语言处理 前端开发
不会开发AI Skill,你明天可能还在改自动化脚本
本文探讨AI时代测试自动化范式变革:从维护脆弱脚本转向构建“AI Skill”——以意图驱动、动态定位、自适应校验的智能测试单元。揭示脚本失效根因在于抽象层次过低,并指出2024年是测试工程师能力分水岭:定义Skill者驾驭AI,仅修脚本者将被替代。
|
11月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
61174 11
|
10月前
|
人工智能 算法 数据可视化
别卷手工测试了!这6个大模型应用场景让你身价翻倍
大语言模型正重塑软件测试:从AI生成用例、智能代码审查到需求深度解析,推动测试自动化、智能化升级。测试工程师需掌握AI协同技能,聚焦高阶质量设计,实现职业跃迁。
|
10月前
|
人工智能 自然语言处理 前端开发
Playwright MCP在UI自动化测试中的定位与思考
本文探讨Playwright与Model Context Protocol(MCP)融合实现AI驱动UI测试的新范式。通过MCP,AI获得“眼”与“手”,可理解页面、自主操作浏览器。结合LangChain构建智能体,能用自然语言执行测试任务,具备强适应性与低门槛优势。但快照信息缺失、元素定位脆弱、成本高及LLM幻觉等问题仍存。该技术非替代传统自动化,而是适用于探索测试、脚本生成、A11y检测等场景的有力补充。
|
12月前
|
存储 数据采集 搜索推荐
Python+淘宝API:3步爬取10万条商品评论(附反爬破解技巧)
本文介绍淘宝商品评论爬取技术,涵盖环境配置、接口分析、反爬破解及数据存储。使用Python模拟请求,动态代理与签名绕过风控,结合Flask中转降低封禁风险,实现高效合规的数据采集,适用于竞品分析与用户画像构建。(238字)
1960 1

热门文章

最新文章