霍格沃兹测试开发学社

《Python测试开发进阶训练营》(随到随学!)
2023年第2期《Python全栈开发与自动化测试班》(开班在即)
报名联系weixin/qq:2314507862

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

上个月我们组里搞了个“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)还可以优化,但至少思路是对的。

人工智能技术学习交流群
伙伴们,对AI测试、大模型评测、质量保障感兴趣吗?我们建了一个 「人工智能测试开发交流群」,专门用来探讨相关技术、分享资料、互通有无。无论你是正在实践还是好奇探索,都欢迎扫码加入,一起抱团成长!期待与你交流!👇

image

五、多轮对话:还能更好吗?
我继续和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写的,但人审的。”

他若有所思地点点头。

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

推荐学习
AI Agent进阶 OpenClaw + Claude Code公开课,手把手带你掌握 从“网页操控”到“终端自主编程”的执行力。

扫码进群,报名学习。

image

关于我们
霍格沃兹测试开发学社,隶属于 测吧(北京)科技有限公司,是一个面向软件测试爱好者的技术交流社区。

学社围绕现代软件测试工程体系展开,内容涵盖软件测试入门、自动化测试、性能测试、接口测试、测试开发、全栈测试,以及人工智能测试与 AI 在测试工程中的应用实践。

我们关注测试工程能力的系统化建设,包括 Python 自动化测试、Java 自动化测试、Web 与 App 自动化、持续集成与质量体系建设,同时探索 AI 驱动的测试设计、用例生成、自动化执行与质量分析方法,沉淀可复用、可落地的测试开发工程经验。

在技术社区与工程实践之外,学社还参与测试工程人才培养体系建设,面向高校提供测试实训平台与实践支持,组织开展 “火焰杯” 软件测试相关技术赛事,并探索以能力为导向的人才培养模式,包括高校学员先学习、就业后付款的实践路径。

同时,学社结合真实行业需求,为在职测试工程师与高潜学员提供名企大厂 1v1 私教服务,用于个性化能力提升与工程实践指导。

posted @ 2026-02-24 12:01  霍格沃兹测试开发学社  阅读(5)  评论(0)    收藏  举报