App UI 自动化测试一直是痛点——元素定位不稳定、页面变更后用例大量失效、维护成本高。2026年8月我们设计了基于元素 Skills 的自动化测试框架,用 AI 辅助元素定位和用例生成,大幅降低维护成本。今天把实践分享出来。
一、传统 UI 自动化的痛点#
- 元素定位不稳定:XPath、ID 经常变,页面改版后用例大量失败
- 维护成本高:一个页面改版,相关用例都要改,维护工作量大
- 用例编写慢:手工写元素定位和操作步骤,效率低
- 跨平台困难:iOS 和 Android 元素定位方式不同,要写两套
- 调试困难:用例失败后排查原因耗时,不知道是元素没找到还是逻辑错了
二、元素 Skills 概念#
把页面上的每个可操作元素封装成一个 “Skill”,Skill 包含元素的语义描述、定位策略、操作方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| // ElementSkill 元素技能定义
type ElementSkill struct {
Name string `json:"name"` // 技能名称,如"登录按钮"
Description string `json:"description"` // 语义描述,AI 用这个理解元素
Page string `json:"page"` // 所属页面
Platforms map[string]Locator `json:"platforms"` // 各平台的定位策略
Actions map[string]ActionFunc `json:"-"` // 可执行的操作
}
// Locator 定位策略
type Locator struct {
Type string `json:"type"` // id/xpath/accessibility_id/text
Value string `json:"value"` // 定位值
Fallback []Locator `json:"fallback"` // 备选定位策略
}
|
Skill 示例#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| {
"name": "登录按钮",
"description": "登录页面的登录提交按钮,点击后提交用户名密码进行登录",
"page": "登录页",
"platforms": {
"android": {
"type": "id",
"value": "com.example:id/btn_login",
"fallback": [
{"type": "text", "value": "登录"},
{"type": "xpath", "value": "//button[contains(@text,'登录')]"}
]
},
"ios": {
"type": "accessibility_id",
"value": "login_button",
"fallback": [
{"type": "text", "value": "登录"}
]
}
}
}
|
每个元素有多个备选定位策略,主定位失败自动尝试备选,提升稳定性。
三、AI 辅助元素定位#
元素定位变了的时候,用 AI 自动分析页面结构,找到新的定位策略:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| def auto_relocate_element(driver, skill: ElementSkill) -> Locator:
"""AI 自动重新定位元素"""
# 1. 获取当前页面结构
page_source = driver.page_source
# 2. 截图
screenshot = driver.get_screenshot_as_base64()
# 3. 调用多模态大模型,根据元素描述找到元素
prompt = f"""
请在以下 App 页面中找到这个元素:
元素名称:{skill.name}
元素描述:{skill.description}
页面结构:{page_source[:3000]}
请返回这个元素的最佳定位策略,格式:
{{
"type": "id/xpath/accessibility_id/text",
"value": "定位值",
"confidence": 0.95
}}
"""
result = multimodal_ai.chat(prompt, image=screenshot)
locator = json.loads(result)
# 4. 验证定位是否有效
if locator["confidence"] > 0.8:
try:
driver.find_element(locator["type"], locator["value"])
return Locator(**locator)
except:
pass
return None
|
元素定位失败时,自动调用 AI 重新定位,找到后更新 Skill 配置,不用人工改。
四、AI 生成测试用例#
用自然语言描述测试场景,AI 自动生成测试用例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| def generate_test_case(scenario: str) -> str:
"""根据自然语言场景生成测试用例"""
prompt = f"""
你是一位 App 自动化测试工程师,请根据以下测试场景生成 Python 测试用例代码。
可用的元素 Skills:
{get_all_skills_as_text()}
测试场景:{scenario}
要求:
1. 使用 pytest 框架
2. 通过 Skill 名称操作元素,不用直接写定位
3. 包含断言验证
4. 代码简洁,注释清晰
示例:
def test_login_success(driver):
skills = SkillRegistry(driver)
skills["用户名输入框"].input("13800138000")
skills["密码输入框"].input("123456")
skills["登录按钮"].click()
assert skills["首页标题"].is_displayed()
"""
code = ai.chat(prompt)
return code
|
测试人员只需要写"测试场景:用户使用正确的手机号和密码登录,应该成功跳转到首页",AI 自动生成完整的测试用例代码。
五、框架架构#
Skill 注册表#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| type SkillRegistry struct {
driver WebDriver
skills map[string]*ElementSkill
aiClient *AIClient
}
func (r *SkillRegistry) Get(name string) *ElementSkill {
return r.skills[name]
}
// 操作元素,定位失败时自动 AI 重定位
func (r *SkillRegistry) Click(skillName string) error {
skill := r.skills[skillName]
element, err := r.findElement(skill)
if err != nil {
// 定位失败,AI 自动重定位
newLocator := r.aiClient.AutoRelocate(r.driver, skill)
if newLocator != nil {
skill.Platforms[r.driver.Platform()].Fallback = append(
skill.Platforms[r.driver.Platform()].Fallback, *newLocator)
element, err = r.driver.FindElement(newLocator.Type, newLocator.Value)
}
}
if err != nil {
return fmt.Errorf("元素 %s 定位失败: %v", skillName, err)
}
return element.Click()
}
|
六、踩坑经验#
- AI 定位不准:多模态模型有时定位错元素,特别是页面相似元素多时。加了置信度阈值,低于 0.8 的不自动采用,人工确认
- Skill 维护成本:元素多了 Skill 配置文件管理复杂。用页面对象模式(Page Object),按页面组织 Skill,自动从代码注解生成配置
- AI 生成用例质量参差:AI 生成的用例有时逻辑不对或缺少断言。加了用例评审环节,AI 生成后人工审核,确认后才入库
- 执行速度慢:每个元素定位失败都调 AI,执行时间变长。加了缓存,同一个元素 AI 定位成功后缓存结果,后续直接用
- 跨平台一致性:iOS 和 Android 页面结构差异大,同一个 Skill 两套定位。用语义描述统一,AI 根据平台自动适配
七、总结#
基于元素 Skills 的 App UI 自动化框架核心:
- 元素 Skills 化:每个元素封装成语义化的 Skill,包含描述、多平台定位、备选策略
- AI 辅助定位:元素定位失败时 AI 自动重定位,降低维护成本
- AI 生成用例:自然语言描述场景,AI 自动生成测试代码,提升编写效率
- 多备选定位:每个元素多个定位策略,主定位失败自动尝试备选,提升稳定性
- 跨平台统一:一套 Skill 配置支持 iOS 和 Android,不用写两套
- 智能调试:用例失败时 AI 分析失败原因,给出修复建议
UI 自动化的核心矛盾是"页面频繁变更"和"用例维护成本高"。基于元素 Skills + AI 辅助的框架,把元素定位和用例编写这两个最耗时的环节用 AI 辅助,大幅降低维护成本。AI 不是替代测试人员,而是让测试人员从繁琐的元素定位和用例编写中解放出来,专注于测试场景设计和质量保障。