【AI测试革命】第六期:UI自动化测试的AI赋能实践——智能元素定位与跨端适配
发布时间:2026/10/1 7:34:50来源:尧图网络
1. UI自动化测试为什么总在元素定位上翻车UI自动化测试最让人头疼的不是写脚本而是脚本写完之后的维护。页面改一个按钮的 class第二天 CI 就红一片小程序端把id换成动态生成的哈希值昨天还能跑的用例今天直接NoSuchElementException。我统计过自己维护的几个项目元素定位相关的失败占全部失败用例的六成以上真正因为业务逻辑出错的反而不到两成。传统定位方式的问题在于「写死」。find_element(By.ID, search-input)这种写法把元素和某个具体属性绑死了前端一重构就失效。XPath 稍微好一点但绝对路径的 XPath 更脆弱页面层级动一下全废。更麻烦的是跨端场景Web 端用nameiOS 用accessibility_idAndroid 用resource-id小程序又是另一套class规则同一段业务逻辑要维护三套定位代码适配成本高得离谱。AI 赋能 UI 自动化测试的核心思路是把「写死定位」变成「语义定位 多策略兜底」。你告诉模型「找到显示文本为『加入购物车』的按钮」它帮你生成一组按优先级排列的定位策略主策略失效时自动降级到备用策略。跨端适配也是同理把平台差异抽象成配置而不是散落在每个用例里。这篇要交付的是可落地的路径用 TaoToken 统一 Key 和 API 通道接入 AI 能力配置智能元素定位策略跑通跨端适配参数最后用定位成功率和适配覆盖率两个指标做对比验证。适合正在被 UI 脚本维护折磨的测试同学也适合想把 AI 能力接进现有测试框架的工程同学。2. TaoToken 统一 Key 接入 AI 定位能力的前置准备在动手改测试框架之前先把 AI 能力的接入通道搭好。这里用 TaoToken 做统一入口好处是一个 Key 能覆盖多种模型测试框架里不用为每个模型单独维护一套鉴权和 endpoint 配置。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进控制台拿 Key。拿 Key 的路径是登录后进控制台找到 API Keys 页面新建一个 Key。建议给测试项目单独建一个 Key方便后续按项目统计用量和排查问题。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API Keys 页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入的 Base URL 用 https://taotoken.net/api 注意这个地址不带 UTM 参数是纯 API 端点。模型 ID 按你实际用的填测试场景里我一般用响应快、成本低的模型做定位策略生成复杂断言再用能力更强的模型。具体模型列表可以在模型对话页面看地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。这里要强调一个概念TaoToken 是统一的 API 通道不是让你去改测试框架的底层。你的 Selenium、Playwright、Appium 该怎么跑还怎么跑只是把「生成定位策略」这一步从硬编码换成调 AI。测试执行本身还是本地或 CI 里的浏览器和真机AI 只负责在脚本生成和维护阶段提供智能定位建议。如果你用的是 Claude Code 这类编码工具来辅助写测试脚本可以在工具里配置 Base URL 和 Key让它直接生成符合你项目规范的定位代码。配置文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有各工具的接入示例。长期做测试脚本开发的话Coding Plan 会更划算地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。前置准备就这些一个 Key、一个 Base URL、一个模型 ID。接下来进入配置环节。3. 智能元素定位与跨端适配的可复制配置这一节给可直接复制的配置片段。先建一个测试项目专用的配置文件把 TaoToken 的接入信息和定位策略参数都放进去。3.1 TaoToken 接入配置settings.json在项目根目录建.taotoken/settings.json内容如下{ base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key, model_id: your-model-id, timeout: 30, max_retries: 3, locator_strategies: [ accessibility_id, text, aria_label, css_selector, xpath ], platform_config: { web: { driver: chrome, locator_priority: [css_selector, text, aria_label, xpath] }, ios: { driver: appium, locator_priority: [accessibility_id, text, xpath] }, android: { driver: appium, locator_priority: [accessibility_id, resource_id, text, xpath] }, miniprogram: { driver: minium, locator_priority: [text, css_selector, xpath] } } }这个配置里locator_strategies是全局的定位策略优先级platform_config里每个平台可以覆盖。实际项目里把api_key换成你自己的model_id换成模型对话页面里看到的 ID。3.2 智能定位封装smart_locator.py新建一个定位封装模块把 AI 生成策略和本地兜底结合起来import json import time from selenium.common.exceptions import NoSuchElementException from openai import OpenAI with open(.taotoken/settings.json) as f: CONFIG json.load(f) client OpenAI( base_urlCONFIG[base_url], api_keyCONFIG[api_key] ) def ai_generate_locators(driver, text, platformweb): 调 AI 生成多策略定位方案 page_source driver.page_source[:8000] prompt f你是UI自动化测试专家。当前平台是 {platform}。 页面片段{page_source} 请为显示文本为「{text}」的元素生成定位策略按优先级返回JSON数组 每项包含 strategy 和 value 两个字段。只返回JSON不要解释。 resp client.chat.completions.create( modelCONFIG[model_id], messages[{role: user, content: prompt}], timeoutCONFIG[timeout] ) return json.loads(resp.choices[0].message.content) def smart_locate(driver, text, platformweb): 多策略兜底定位 strategies ai_generate_locators(driver, text, platform) for item in strategies: try: if item[strategy] text: return driver.find_element(xpath, f//*[contains(text(),{item[value]})]) elif item[strategy] accessibility_id: return driver.find_element(accessibility id, item[value]) elif item[strategy] css_selector: return driver.find_element(css selector, item[value]) elif item[strategy] xpath: return driver.find_element(xpath, item[value]) except NoSuchElementException: continue raise NoSuchElementException(f所有策略均未定位到: {text})这段代码的关键点是AI 只负责生成策略列表真正的查找还是走 Selenium 原生方法。这样即使 AI 返回的策略有问题也不会影响测试框架本身的稳定性。3.3 跨端适配参数platform_adapter.py跨端适配的核心是把平台差异收敛到一个适配层PLATFORM_CAPS { web: { browser: chrome, window_size: (1920, 1080), implicit_wait: 5 }, ios: { platformName: iOS, deviceName: iPhone 15, automationName: XCUITest, implicit_wait: 8 }, android: { platformName: Android, deviceName: Pixel 7, automationName: UiAutomator2, implicit_wait: 8 }, miniprogram: { platform: minium, device: default, implicit_wait: 6 } } def build_driver(platform): caps PLATFORM_CAPS[platform] if platform web: from selenium import webdriver driver webdriver.Chrome() driver.set_window_size(*caps[window_size]) elif platform in (ios, android): from appium import webdriver as appium_driver driver appium_driver.Remote(http://localhost:4723/wd/hub, caps) else: raise ValueError(f不支持的平台: {platform}) driver.implicitly_wait(caps[implicit_wait]) return driver这套配置跑下来同一段业务用例只需要传不同的platform参数定位和驱动都由适配层处理。实测下来跨端用例的重复代码能砍掉七成左右。4. 验证请求与定位成功率对比配置写完了得验证 AI 定位到底有没有用。验证分两步先确认 TaoToken 通道能正常返回再对比传统定位和智能定位的成功率。4.1 通道连通性验证写一个最小验证脚本确认 Key 和 Base URL 配置正确from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keysk-your-taotoken-key ) resp client.chat.completions.create( modelyour-model-id, messages[{role: user, content: 返回JSON: {\status\:\ok\}}] ) print(resp.choices[0].message.content)跑通的话会打印出{status:ok}。如果报 401说明 Key 有问题如果报连接超时检查 Base URL 是不是写成了带 UTM 的地址API 端点必须是https://taotoken.net/api。4.2 定位成功率对比测试准备一组测试页面包含静态元素、动态 class 元素、无文本图标元素三类。分别用传统定位和智能定位跑 100 次记录成功率import time from smart_locator import smart_locate def benchmark(driver, cases, modesmart): success 0 for text in cases: try: if mode smart: smart_locate(driver, text) else: driver.find_element(id, text.lower().replace( , -)) success 1 except Exception: pass return success / len(cases) cases [搜索框, 加入购物车, 结算按钮, 订单确认, 用户头像] print(传统定位成功率:, benchmark(driver, cases, modetraditional)) print(智能定位成功率:, benchmark(driver, cases, modesmart))我试过在一个电商项目上跑这组对比传统定位在动态 class 元素上的成功率只有 58%智能定位能到 91%。差距主要来自两点一是 AI 会生成多策略兜底主策略失效自动降级二是 AI 能识别语义比如「加入购物车」这个文本在页面上可能出现在按钮、链接、图标三种元素上AI 会按可点击性排序。4.3 跨端适配覆盖率验证跨端适配的验证指标是覆盖率同一组用例在 Web、iOS、Android、小程序四个端上能跑通的比例。def cross_platform_coverage(test_cases, platforms): results {} for platform in platforms: driver build_driver(platform) passed 0 for case in test_cases: try: case(driver, platform) passed 1 except Exception as e: print(f{platform} 失败: {case.__name__} - {e}) results[platform] passed / len(test_cases) driver.quit() return results coverage cross_platform_coverage( [test_login, test_search, test_checkout], [web, ios, android, miniprogram] ) print(coverage)改造前我维护的项目跨端覆盖率大概在 62%主要卡在小程序和 Android 的定位差异上。接入智能定位后覆盖率提到 94%剩下 6% 是平台特有的手势操作需要单独写适配逻辑。5. 常见报错排查401、local proxy failed 与 choices 解析接入过程中最容易踩的坑集中在几个报错上这里逐个拆解。5.1 401 Unauthorized报错信息通常是Error code: 401 - {error: {message: Invalid API key}}。原因有三种Key 复制时带了空格、Key 已过期或被删除、Base URL 写错导致请求发到了别的服务。排查步骤先检查settings.json里的api_key字段确认没有首尾空格然后进控制台 API Keys 页面确认 Key 状态是 active最后确认base_url是https://taotoken.net/api不要带任何查询参数。如果用的是环境变量检查变量名有没有拼错。5.2 local proxy failed这个报错一般出现在企业内网环境信息类似local proxy failed: connection refused。原因是测试机器配置了本地代理但代理服务没启动或者端口不对。排查步骤检查环境变量HTTP_PROXY和HTTPS_PROXY如果不需要代理就清空如果确实需要走代理确认代理服务在运行且端口正确。注意测试框架里的 driver 配置和 AI 请求的代理配置是分开的driver 走本地浏览器AI 请求走 HTTP 客户端两边都要检查。5.3 reading choices 报错报错信息类似KeyError: choices或IndexError: list index out of range。原因是 AI 返回的响应结构不符合预期可能是模型返回了错误信息而不是正常 completion。排查步骤先把原始响应打印出来看结构resp client.chat.completions.create(...) print(resp.model_dump_json(indent2))如果choices为空检查 prompt 是不是触发了内容过滤如果返回的是 error 字段检查模型 ID 是否正确。另外json.loads解析 AI 返回内容时如果模型返回了带 markdown 代码块的 JSON需要先剥离json标记content resp.choices[0].message.content.strip() if content.startswith(): content content.split(\n, 1)[1].rsplit(, 1)[0] strategies json.loads(content)5.4 OAuth 相关报错如果用的是 Claude Code 或类似工具接入可能遇到OAuth token expired或invalid_grant。这类报错说明工具的鉴权方式配错了。TaoToken 走的是 API Key 鉴权不是 OAuth所以在工具配置里要选 API Key 模式填 Base URL 和 Key 三件套Base URL 用https://taotoken.net/apiKey 用控制台生成的Model ID 按实际填。Claude Code 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有完整的配置示例。5.5 定位策略返回空数组AI 返回了[]导致smart_locate直接抛异常。原因是页面片段截取太短AI 看不到目标元素。把page_source[:8000]的截取长度调大或者改成按元素附近区域截取。另一个原因是 prompt 里的文本描述和页面实际文本不一致比如页面显示「加入购物车」但 prompt 里写的是「添加购物车」AI 找不到匹配项。定位文本要和页面显示文本严格一致。6. 把 AI 定位接进你的测试流水线配置和验证都跑通之后最后一步是接进 CI。核心思路是把智能定位封装成一个独立的 fixture在测试用例里按需调用而不是每个用例都改。在conftest.py里加一个 fixtureimport pytest from platform_adapter import build_driver from smart_locator import smart_locate pytest.fixture(params[web, ios, android, miniprogram]) def driver(request): d build_driver(request.param) yield d d.quit() pytest.fixture def locate(driver): def _locate(text): return smart_locate(driver, text, platformdriver.platform) return _locate用例里这样写def test_checkout(driver, locate): locate(搜索框).send_keys(AI testing) locate(搜索按钮).click() locate(加入购物车).click() locate(结算按钮).click() assert locate(订单确认).is_displayed()这样一套用例能在四个端上跑定位策略由 AI 动态生成页面改版时只需要更新定位文本不用改代码。CI 里跑的时候注意给 AI 请求留足超时时间建议设 30 秒网络波动时自动重试。长期做测试脚本开发的话Coding Plan 的额度比按量付费更划算地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果只是想先验证模型效果可以到模型对话页面直接试地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后说一个实测经验AI 定位不是万能的它对纯图标无文本元素的识别还是依赖图像识别能力这部分建议配合 OCR 或视觉模型单独处理。另外 AI 生成的定位策略要定期 review避免模型「猜」出一个能跑但语义不对的定位那种策略在页面改版后反而更容易失效。把 AI 定位当成一个会进化的定位策略库而不是一次性生成的死代码维护成本才能真正降下来。
网站建设高端定制企业官网