手把手教你用 Python 调用 GPT-4o 接口,实现 UI 自动化脚本的自动修复

简介: 本文介绍如何用GPT-4o自动修复Selenium元素定位失败问题:当页面改版导致class/id变更时,脚本捕获异常,将HTML发给AI,智能推荐稳定新定位器(XPath/CSS等),实现“自愈”式UI自动化,显著降低维护成本。

说实话,做了几年 UI 自动化,最让我头疼的不是写脚本,而是维护脚本。
开发今天改个 class,明天换个 id,后天直接把按钮位置挪了——你前一天跑得好好的用例,第二天就红成一片。
手动一条条改定位器?改到一半开发又上线了,简直血压拉满。

所以我一直在想:能不能让 AI 帮我们修脚本?

OpenAI 发布 GPT-4o 之后,我发现这事儿还真能落地。这篇文章我就拿一个真实的 Selenium 脚本举例,带你一步步写一个能自动修复元素定位失败的脚本。全程代码亲测可用,不说废话。

  1. 你大概需要准备什么
    Python 3.8+(我用的是 3.10)
    一个 OpenAI API Key(GPT-4o 需要付费,但一次调用几分钱,完全扛得住)
    装几个库:
    pip install openai selenium
    Chrome 浏览器 + 对应版本的 chromedriver(如果你用其他浏览器同理)
  2. 先写一个会“坏掉”的自动化脚本
    我们拿百度首页做例子(只是演示,别在生产环境随便压测)。
    正常情况下,百度搜索框的 name 属性是 wd,提交按钮的 id 是 su。

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

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

正常定位

search_box = driver.find_element(By.NAME, "wd")
search_box.send_keys("GPT-4o")
driver.find_element(By.ID, "su").click()
现在假设前端改版:

输入框的 name 改成了 keyword
提交按钮的 id 从 su 改成了 search-btn
如果你硬跑上面的代码,会直接抛出 NoSuchElementException。

  1. 第一次调用 GPT-4o:让它推荐新的定位器
    当脚本报错时,我们唯一能依赖的就是页面的实时 HTML。
    所以我们可以在 try...except 里捕获异常,然后把当前页面的 DOM 结构发给 GPT-4o,让它帮我们找出可用的新定位器。

3.1 封装一个函数,把当前页面源码发给 GPT-4o
from openai import OpenAI

client = OpenAI(api_key="你的密钥")

def ask_gpt_for_locator(page_source, old_locator):
prompt = f"""
你是一个 UI 自动化测试专家。
以下是一个网页的 HTML 源码,原本的元素定位器 {old_locator} 已经失效。
请根据页面当前结构,推荐一个稳定且大概率唯一的新定位器(可以是 id、name、XPath、CSS selector 中的任意一种)。
只返回定位器本身,不要多余解释。

HTML:
{page_source[:6000]} # 限制长度,节省 token
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=0
)
return response.choices[0].message.content.strip()
这里有个小技巧:temperature 设为 0,让输出尽量确定,不给它自由发挥的空间。

3.2 写一个带自动修复的 find_element
from selenium.common.exceptions import NoSuchElementException

def smart_find_element(driver, by, value):
try:
return driver.find_element(by, value)
except NoSuchElementException:
print(f"定位失败:({by}, {value}),尝试 GPT-4o 修复...")
page_source = driver.page_source
new_locator = ask_gpt_for_locator(page_source, {by: value})
print(f"GPT-4o 建议的新定位器:{new_locator}")

    # 简单解析建议的定位器(这里只做了最简处理,实际需要更鲁棒的解析)
    if new_locator.startswith("//") or new_locator.startswith("("):
        return driver.find_element(By.XPATH, new_locator)
    elif new_locator.startswith("#") or"."in new_locator:
        return driver.find_element(By.CSS_SELECTOR, new_locator)
    else:
        # 默认当成 id 试试
        return driver.find_element(By.ID, new_locator)

用的时候只需要把原来的 find_element 替换成 smart_find_element,其余代码基本不用动。

  1. 完整的自动修复演示
    下面我把整个流程串起来,模拟一次“改版后的百度页面”。

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

---------- OpenAI 初始化 ----------

client = OpenAI(api_key="sk-你的密钥")

def ask_gpt_for_locator(page_source, old_locator):
prompt = f"""
当前页面 HTML 如下,原本定位器 {old_locator} 已失效。
请返回一个唯一、稳定的新定位器(推荐 XPath 或 CSS)。
只返回定位器字符串,不要加任何注释。
HTML:
{page_source[:5000]}
"""
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=0
)
return resp.choices[0].message.content.strip()

---------- 带修复功能的查找 ----------

def smart_find_element(driver, by, value):
try:
return driver.find_element(by, value)
except NoSuchElementException:
print(f"[修复] {by}={value} 失效,请求 GPT...")
html = driver.page_source
new_loc = ask_gpt_for_locator(html, {by: value})
print(f"[GPT] 推荐: {new_loc}")

    # 非常简陋的定位器类型判断,正式项目建议用正则或解析
    if new_loc.startswith(('//', '(')):
        return driver.find_element(By.XPATH, new_loc)
    else:
        # 尝试作为 CSS 处理
        return driver.find_element(By.CSS_SELECTOR, new_loc)

---------- 测试用例 ----------

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

try:

# 故意传一个错误的名字,模拟改版
box = smart_find_element(driver, By.NAME, "wd")   # 实际已改成 keyword
box.send_keys("GPT-4o auto repair")

btn = smart_find_element(driver, By.ID, "su")     # 实际已改成 search-btn
btn.click()

time.sleep(3)
print("测试通过 ✅")

except Exception as e:
print(f"最终失败: {e}")
finally:
driver.quit()
跑一遍看看效果
当你第一次运行,Selenium 找不到 name="wd",自动触发 GPT 请求,几秒后返回类似:

input[name='keyword']
然后程序会用 CSS Selector 重新定位,输入文字并提交——原本挂掉的用例自己活过来了。

  1. 踩过的一些坑(希望你避开)
    GPT 偶尔会乱给定位器
    比如给一个 div:nth-child(3) 这种极度脆弱的 selector。我的对策:在 prompt 里强调“唯一、稳定”,并且强制要求优先使用 id 或 name,实在没有再用 XPath 层级关系。

token 消耗比想象中快
一次请求发 5000 字符的 HTML 大概花掉 1 美分不到,但如果你跑几百个用例就不便宜了。优化策略:

只发送包含目标元素的局部 HTML(比如按钮附近的父容器)
缓存 GPT 返回的定位器,同一个页面同一个元素第二次直接从缓存取
响应速度
GPT-4o 比 4 快不少,但还是有 1~2 秒延迟。如果是 CI 流水线可以接受,但本地调试时会有点不耐烦。我一般加一个 print 提示“AI 修复中,请稍候”,用户体验会好一点。

  1. 还能怎么玩?
    上面的例子只修复了元素定位,其实整个测试步骤都可以交给 GPT。

比如你把失败时的截图、控制台日志、页面源码一股脑发给它,然后问:“这个步骤原本想点击登录按钮,现在被一个弹窗挡住了,请给出修正后的 Python Selenium 代码。”
它真的能给你写出一段先关弹窗、再点登录的脚本——我试过,靠谱。

另一种玩法:不需要提前准备定位器。
你只要告诉 GPT “在百度首页搜索‘天气’”,它直接输出完整的 Selenium 代码。这相当于把测试用例从自然语言“编译”成自动化脚本,连元素定位这一步都省了。

  1. 写在最后
    以前我们总说 UI 自动化维护成本高,是因为脚本是“死”的,页面是“活”的。
    现在有了 GPT-4o 这种能看懂界面、能写代码的模型,脚本也可以“活”过来。

当然,这不是让你把所有的 find_element 都换成 AI 版——毕竟每次调用都要花钱、花时间。
更好的用法是:作为兜底策略。常规定位失败时,再请 GPT 出山,一次修复,永久生效(把修好的定位器存到配置文件里)。

代码我已经贴在上面了,复制下来,换成你自己的 API Key 就能跑。
如果跑不通,大概率是页面改得太离谱,或者 GPT 抽风——多试两次,或者把 prompt 改得更具体一点。

自动化测试不该是手工作坊,让 AI 帮你搬砖,省下时间干点更有意思的事吧。

相关文章
|
26天前
|
机器学习/深度学习 SQL 人工智能
别再群发拜年消息了!三步微调AI,让它学会你的“独家语气”
每逢春节,通用AI祝福总显生硬空洞。本文探讨如何通过微调(LoRA),将“人情世故”转化为结构化数据(称呼/关系/细节/风格等),让AI真正学会你的语气与记忆,生成有温度、带梗、专属的个性化祝福——技术不是替代表达,而是帮你把来不及说的情意,说得恰到好处。(239字)
272 16
别再群发拜年消息了!三步微调AI,让它学会你的“独家语气”
|
26天前
|
安全 C++
关系记忆不是越完整越好:chunk size 的隐性代价
本文揭示关系型RAG(如祝福/道歉生成)中一个反直觉真相:关系信息并非越完整越好。大chunk会将“可引用的触发点”异化为“需总结的材料”,诱使模型转向安全、抽象、概括性表达,丧失走心感。核心原则是——切分重在“可被直接引用”,而非“逻辑完整”。
|
26天前
|
存储 人工智能 弹性计算
2026年阿里云服务器租用价格表:一年、1个月、3年和1小时收费清单(完整版)
在云计算快速普及的2026年,阿里云作为国内领先的云计算服务提供商,凭借稳定的性能、灵活的配置和透明的定价,成为个人开发者、中小企业及大型企业上云的首选。阿里云服务器租用价格体系基于机型品类、配置规格、计费模式及部署地域构建,采用“基础套餐 + 组件叠加”的透明定价方式,无隐藏消费,核心涵盖轻量应用服务器、ECS云服务器、GPU高性能服务器三大品类,计费方式包括年付、月付、3年付及按量付费(按小时计费),费用从38元/年到数万元/年不等,适配个人开发、中小企业建站、AI计算等全场景需求。
966 11
|
26天前
|
人工智能 安全 程序员
编程已shi?2026年AI技术趋势预测
Django联合创始人Willison在2026年初发布AI技术趋势预测:1年内LLM生成代码将达生产级;3年AI可协作开发浏览器;6年后手写代码或成历史,程序员转向架构设计与AI协同。安全沙箱、Jevons悖论与角色重塑是核心议题。
|
人工智能 弹性计算 自然语言处理
专属个人主页助你在求职季脱引而出
AI时代是时候告别传统的“纸片简历”了!你需要一个能动态展示、深度链接、真正代表你的“云端名片”——专属个人主页! 本方案介绍如何通过自然语言,5分钟快速在云端搭建一个可对外提供访问的个人主页。
1619 0
|
9天前
|
人工智能 程序员 开发工具
2026年最值得押注的AI技能,我选Skills
本文直击AI时代焦虑症:面对“颠覆”“革命”等刷屏热词,与其疲于追赶新概念,不如专注沉淀可复用的AI技能(Skills)。它无需编程,用Markdown文档封装你的经验,实现从“临时对话”到“长期协作”的跃迁,让AI真正成为你的数字资产。
|
12天前
|
人工智能 缓存 关系型数据库
Apache Doris 4.0.3 版本正式发布
亲爱的社区小伙伴们,**Apache Doris 4.0.3 版本已正式发布。**此版本新增了在 AI & Search、湖仓一体、查询引擎等方面的能力,并同步进行了多项优化改进及问题修复,欢迎下载体验!
127 8
|
26天前
|
机器学习/深度学习 数据采集 人工智能
OpAgent:登顶WebArena的多模态Web GUI Agent
蚂蚁集团自研多模态Web智能体OpAgent,以71.6%的成功率登顶WebArena榜单。该方案通过层次化多任务微调构建基座,利用在线强化学习与混合奖励机制应对环境动态性,并结合模块化架构实现复杂任务的稳健执行与自我修正,刷新了Web智能体领域的SOTA纪录。
135 11
|
1月前
|
人工智能 弹性计算 自然语言处理
还不会部署OpenClaw?阿里云推出五种OpenClaw快速部署方案
OpenClaw(原Clawdbot/Moltbot)是开源本地优先AI代理,能通过自然语言调用浏览器、邮件、文件等工具,真正“替你干活”。阿里云官方推出五种可视化部署方案,零代码、低成本、一键上线,个人、企业与开发者皆可快速拥有专属AI数字员工。
464 23
|
24天前
|
人工智能 前端开发 测试技术
从手工点点到AI自动生成用例,测试人的这个春天不太一样
本文讲述一位北京测试工程师在三月借助AI革新工作方式的真实经历:从用AI高效生成测试点、用例,到应对复杂业务逻辑,再到反思人机协作本质。他发现AI并未取代测试,而是将工程师从重复劳动中解放,转向更需判断力的设计与风险分析——这个春天,因工具变聪明而不同。

热门文章

最新文章