App UI 自动化测试一直是痛点——元素定位不稳定、页面变更后用例大量失效、维护成本高。2026年8月我们设计了基于元素 Skills 的自动化测试框架,用 AI 辅助元素定位和用例生成,大幅降低维护成本。今天把实践分享出来。

一、传统 UI 自动化的痛点

  1. 元素定位不稳定:XPath、ID 经常变,页面改版后用例大量失败
  2. 维护成本高:一个页面改版,相关用例都要改,维护工作量大
  3. 用例编写慢:手工写元素定位和操作步骤,效率低
  4. 跨平台困难:iOS 和 Android 元素定位方式不同,要写两套
  5. 调试困难:用例失败后排查原因耗时,不知道是元素没找到还是逻辑错了

二、元素 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 自动生成完整的测试用例代码。

五、框架架构

/AIAipOpSiSu/kmiAAlI/nldWreobiDdriver

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()
}

六、踩坑经验

  1. AI 定位不准:多模态模型有时定位错元素,特别是页面相似元素多时。加了置信度阈值,低于 0.8 的不自动采用,人工确认
  2. Skill 维护成本:元素多了 Skill 配置文件管理复杂。用页面对象模式(Page Object),按页面组织 Skill,自动从代码注解生成配置
  3. AI 生成用例质量参差:AI 生成的用例有时逻辑不对或缺少断言。加了用例评审环节,AI 生成后人工审核,确认后才入库
  4. 执行速度慢:每个元素定位失败都调 AI,执行时间变长。加了缓存,同一个元素 AI 定位成功后缓存结果,后续直接用
  5. 跨平台一致性:iOS 和 Android 页面结构差异大,同一个 Skill 两套定位。用语义描述统一,AI 根据平台自动适配

七、总结

基于元素 Skills 的 App UI 自动化框架核心:

  1. 元素 Skills 化:每个元素封装成语义化的 Skill,包含描述、多平台定位、备选策略
  2. AI 辅助定位:元素定位失败时 AI 自动重定位,降低维护成本
  3. AI 生成用例:自然语言描述场景,AI 自动生成测试代码,提升编写效率
  4. 多备选定位:每个元素多个定位策略,主定位失败自动尝试备选,提升稳定性
  5. 跨平台统一:一套 Skill 配置支持 iOS 和 Android,不用写两套
  6. 智能调试:用例失败时 AI 分析失败原因,给出修复建议

UI 自动化的核心矛盾是"页面频繁变更"和"用例维护成本高"。基于元素 Skills + AI 辅助的框架,把元素定位和用例编写这两个最耗时的环节用 AI 辅助,大幅降低维护成本。AI 不是替代测试人员,而是让测试人员从繁琐的元素定位和用例编写中解放出来,专注于测试场景设计和质量保障。