Files
httprunner/docs/uixt/options.md
2025-06-11 14:57:08 +08:00

17 KiB
Raw Blame History

配置选项文档

概述

HttpRunner UIXT 提供了丰富的配置选项支持设备配置、驱动配置、AI 服务配置等多个层面的定制化设置。本文档详细介绍所有可用的配置选项。

设备配置选项

Android 设备配置

基础选项

选项 类型 说明 默认值 示例
WithSerialNumber string 设备序列号 必需 "emulator-5554"
WithAdbLogOn bool 启用 ADB 日志 false true
WithReset bool 重置设备状态 false true
device, err := uixt.NewAndroidDevice(
    option.WithSerialNumber("emulator-5554"),
    option.WithAdbLogOn(true),
    option.WithReset(true),
)

网络选项

选项 类型 说明 默认值 示例
WithSystemPort int UiAutomator2 系统端口 8200 8200
WithDevicePort int 设备端口 6790 6790
WithForwardPort int 端口转发 0 8080
WithProxy string 代理设置 "" "http://proxy:8080"
device, err := uixt.NewAndroidDevice(
    option.WithSerialNumber("device_serial"),
    option.WithSystemPort(8200),
    option.WithDevicePort(6790),
    option.WithForwardPort(8080),
    option.WithProxy("http://proxy.example.com:8080"),
)

应用管理选项

选项 类型 说明 默认值 示例
WithInstallApp string 自动安装应用路径 "" "/path/to/app.apk"
WithGrantPermissions bool 自动授予权限 false true
WithSkipServerInstallation bool 跳过服务器安装 false true
WithUiAutomator2Timeout int UiAutomator2 超时(秒) 60 120
device, err := uixt.NewAndroidDevice(
    option.WithSerialNumber("device_serial"),
    option.WithInstallApp("/path/to/app.apk"),
    option.WithGrantPermissions(true),
    option.WithUiAutomator2Timeout(120),
)

iOS 设备配置

基础选项

选项 类型 说明 默认值 示例
WithUDID string 设备 UDID 必需 "00008030-001234567890123A"
WithWDAPort int WebDriverAgent 端口 8700 8700
WithWDAMjpegPort int MJPEG 流端口 8800 8800
device, err := uixt.NewIOSDevice(
    option.WithUDID("00008030-001234567890123A"),
    option.WithWDAPort(8700),
    option.WithWDAMjpegPort(8800),
)

WDA 配置选项

选项 类型 说明 默认值 示例
WithResetHomeOnStartup bool 启动时回到主屏 true false
WithPreventWDAAttachments bool 防止 WDA 附件 false true
WithWDAStartupTimeout int WDA 启动超时(秒) 120 180
WithWDAConnectionTimeout int WDA 连接超时(秒) 60 90
device, err := uixt.NewIOSDevice(
    option.WithUDID("device_udid"),
    option.WithResetHomeOnStartup(false),
    option.WithPreventWDAAttachments(true),
    option.WithWDAStartupTimeout(180),
    option.WithWDAConnectionTimeout(90),
)

HarmonyOS 设备配置

选项 类型 说明 默认值 示例
WithConnectKey string 设备连接密钥 必需 "192.168.1.100:5555"
WithHDCLogOn bool 启用 HDC 日志 false true
WithSystemPort int 系统端口 9200 9200
device, err := uixt.NewHarmonyDevice(
    option.WithConnectKey("192.168.1.100:5555"),
    option.WithHDCLogOn(true),
    option.WithSystemPort(9200),
)

Web 浏览器配置

基础选项

选项 类型 说明 默认值 示例
WithBrowserID string 浏览器标识 必需 "chrome"
WithHeadless bool 无头模式 true false
WithWindowSize int, int 窗口大小 1280x720 1920, 1080
device, err := uixt.NewBrowserDevice(
    option.WithBrowserID("chrome"),
    option.WithHeadless(false),
    option.WithWindowSize(1920, 1080),
)

高级选项

选项 类型 说明 默认值 示例
WithUserAgent string 自定义 User-Agent 默认 "custom-agent"
WithProxy string 代理地址 "http://proxy:8080"
WithExtensions []string 扩展列表 []string{"ext1", "ext2"}
WithDownloadDir string 下载目录 默认 "/path/to/downloads"
device, err := uixt.NewBrowserDevice(
    option.WithBrowserID("chrome"),
    option.WithUserAgent("custom-agent"),
    option.WithProxy("http://proxy:8080"),
    option.WithExtensions([]string{"extension1", "extension2"}),
    option.WithDownloadDir("/custom/download/path"),
)

AI 服务配置

LLM 服务配置

基础配置

// 使用单一模型
xtDriver, err := uixt.NewXTDriver(driver,
    option.WithLLMService(option.OPENAI_GPT_4O),
)

高级配置

// 混合模型配置
config := option.NewLLMServiceConfig(option.DOUBAO_1_5_THINKING_VISION_PRO_250428).
    WithPlannerModel(option.DOUBAO_1_5_UI_TARS_250328).
    WithAsserterModel(option.OPENAI_GPT_4O).
    WithQuerierModel(option.DEEPSEEK_R1_250528)

xtDriver, err := uixt.NewXTDriver(driver,
    option.WithLLMConfig(config),
)

支持的模型

模型名称 特点 适用场景
DOUBAO_1_5_UI_TARS_250328 UI 理解专业模型 UI 元素识别和操作规划
DOUBAO_1_5_THINKING_VISION_PRO_250428 思考推理模型 复杂逻辑推理和断言
OPENAI_GPT_4O 高性能通用模型 全场景通用
DEEPSEEK_R1_250528 成本效益模型 大量查询场景

推荐配置

configs := option.RecommendedConfigurations()

// 混合优化配置(推荐)
config := configs["mixed_optimal"]

// 高性能配置
config := configs["high_performance"]

// 成本优化配置
config := configs["cost_effective"]

// UI 专注配置
config := configs["ui_focused"]

// 推理专注配置
config := configs["reasoning_focused"]

CV 服务配置

选项 类型 说明 默认值 示例
WithCVService CVServiceType CV 服务类型 option.CVServiceTypeVEDEM
xtDriver, err := uixt.NewXTDriver(driver,
    option.WithCVService(option.CVServiceTypeVEDEM),
)

操作配置选项

通用操作选项

时间相关选项

选项 类型 说明 默认值 示例
WithDuration time.Duration 操作持续时间 默认 2*time.Second
WithTimeout time.Duration 操作超时时间 30s 60*time.Second
WithDelay time.Duration 操作前延迟 0 500*time.Millisecond
// 慢速滑动
err := driver.Swipe(0.5, 0.8, 0.5, 0.2,
    option.WithDuration(2*time.Second),
)

// 长按操作
err := driver.TouchAndHold(150, 300,
    option.WithDuration(3*time.Second),
)

// 带超时的操作
err := driver.TapBySelector("登录",
    option.WithTimeout(10*time.Second),
)

精度相关选项

选项 类型 说明 默认值 示例
WithSteps int 滑动步数 默认 20
WithPressure float64 压力值(iOS) 1.0 0.8
WithFrequency int 操作频率 默认 60
// 多步滑动
err := driver.Swipe(0.5, 0.8, 0.5, 0.2,
    option.WithSteps(50),
)

// 3D Touch (iOS)
err := driver.ForceTouch(100, 200,
    option.WithPressure(0.8),
)

截图选项

选项 类型 说明 默认值 示例
WithQuality int 图片质量 80 100
WithFormat string 图片格式 "png" "jpeg"
WithScale float64 缩放比例 1.0 0.5
// 高质量截图
screenshot, err := driver.ScreenShot(
    option.WithQuality(100),
    option.WithFormat("png"),
)

// 缩放截图
screenshot, err := driver.ScreenShot(
    option.WithScale(0.5),
)

录制选项

选项 类型 说明 默认值 示例
WithBitRate int 比特率 4000000 8000000
WithVideoSize string 视频尺寸 默认 "1280x720"
WithTimeLimit time.Duration 录制时长 180s 300*time.Second
// 高质量录制
videoPath, err := driver.ScreenRecord(
    option.WithBitRate(8000000),
    option.WithVideoSize("1920x1080"),
    option.WithTimeLimit(300*time.Second),
)

OCR 选项

选项 类型 说明 默认值 示例
WithRegex bool 使用正则表达式 false true
WithIndex int 文本索引 0 1
WithIgnoreCase bool 忽略大小写 false true
// 正则表达式匹配
err := xtDriver.TapOCR(`\d{4}`,
    option.WithRegex(true),
)

// 选择第二个匹配项
err := xtDriver.TapOCR("按钮",
    option.WithIndex(1),
)

// 忽略大小写
err := xtDriver.TapOCR("LOGIN",
    option.WithIgnoreCase(true),
)

环境变量配置

LLM 模型配置

豆包模型

# 豆包思维视觉专业版
DOUBAO_1_5_THINKING_VISION_PRO_250428_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
DOUBAO_1_5_THINKING_VISION_PRO_250428_API_KEY=your_doubao_api_key

# 豆包UI-TARS
DOUBAO_1_5_UI_TARS_250328_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
DOUBAO_1_5_UI_TARS_250328_API_KEY=your_doubao_ui_tars_api_key

OpenAI 模型

# OpenAI GPT-4O
OPENAI_GPT_4O_BASE_URL=https://api.openai.com/v1
OPENAI_GPT_4O_API_KEY=your_openai_api_key

DeepSeek 模型

# DeepSeek
DEEPSEEK_R1_250528_BASE_URL=https://api.deepseek.com/v1
DEEPSEEK_R1_250528_API_KEY=your_deepseek_api_key

默认配置

# 默认配置,当没有找到服务特定配置时使用
LLM_MODEL_NAME=doubao-1.5-thinking-vision-pro-250428
OPENAI_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
OPENAI_API_KEY=your_default_api_key

CV 服务配置

火山引擎 VEDEM

# 火山引擎 VEDEM 配置
VEDEM_IMAGE_URL=https://visual.volcengineapi.com
VEDEM_IMAGE_AK=your_access_key
VEDEM_IMAGE_SK=your_secret_key

配置优先级

环境变量的加载优先级(从高到低):

  1. .env 文件(当前工作目录)
  2. ~/.hrp/.env 文件(全局用户配置)
  3. 系统环境变量
# 项目级配置文件 .env
OPENAI_API_KEY=project_specific_key

# 用户级配置文件 ~/.hrp/.env
OPENAI_API_KEY=user_default_key

# 系统环境变量
export OPENAI_API_KEY=system_key

配置文件

项目配置文件

创建 .env 文件在项目根目录:

# .env
# LLM 服务配置
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_API_KEY=your_openai_api_key

# CV 服务配置
VEDEM_IMAGE_URL=https://visual.volcengineapi.com
VEDEM_IMAGE_AK=your_access_key
VEDEM_IMAGE_SK=your_secret_key

# 设备配置
DEFAULT_ANDROID_SERIAL=emulator-5554
DEFAULT_IOS_UDID=00008030-001234567890123A

用户配置文件

创建 ~/.hrp/.env 文件:

# ~/.hrp/.env
# 全局默认配置
OPENAI_API_KEY=your_global_api_key
VEDEM_IMAGE_AK=your_global_access_key
VEDEM_IMAGE_SK=your_global_secret_key

YAML 配置文件

# config.yaml
devices:
  android:
    serial: "emulator-5554"
    system_port: 8200
    device_port: 6790
    adb_log: true

  ios:
    udid: "00008030-001234567890123A"
    wda_port: 8700
    mjpeg_port: 8800
    reset_home: false

ai_services:
  llm:
    default_model: "doubao-1.5-thinking-vision-pro-250428"
    planner_model: "doubao-1.5-ui-tars-250328"
    asserter_model: "openai-gpt-4o"
    querier_model: "deepseek-r1-250528"

  cv:
    service_type: "vedem"

operations:
  default_timeout: 30
  screenshot_quality: 80
  video_bitrate: 4000000

动态配置

运行时配置

// 运行时修改配置
func configureDriver(driver IDriver) error {
    // 设置超时
    driver.SetTimeout(60 * time.Second)

    // 设置重试次数
    driver.SetRetryCount(3)

    // 设置日志级别
    driver.SetLogLevel(log.DebugLevel)

    return nil
}

条件配置

// 根据环境选择配置
func createDriverWithEnvironmentConfig(platform string) (*uixt.XTDriver, error) {
    var device uixt.IDevice
    var err error

    switch platform {
    case "android":
        if os.Getenv("CI") == "true" {
            // CI 环境使用模拟器
            device, err = uixt.NewAndroidDevice(
                option.WithSerialNumber("emulator-5554"),
                option.WithReset(true),
            )
        } else {
            // 本地环境使用真机
            device, err = uixt.NewAndroidDevice(
                option.WithSerialNumber(os.Getenv("ANDROID_SERIAL")),
                option.WithAdbLogOn(true),
            )
        }
    }

    if err != nil {
        return nil, err
    }

    driver, err := uixt.NewUIA2Driver(device)
    if err != nil {
        return nil, err
    }

    // 根据环境选择 AI 配置
    var aiOptions []option.AIServiceOption
    if os.Getenv("ENABLE_AI") == "true" {
        configs := option.RecommendedConfigurations()
        aiOptions = append(aiOptions, option.WithLLMConfig(configs["mixed_optimal"]))
        aiOptions = append(aiOptions, option.WithCVService(option.CVServiceTypeVEDEM))
    }

    return uixt.NewXTDriver(driver, aiOptions...)
}

配置验证

配置检查

// 验证配置完整性
func validateConfiguration() error {
    // 检查必需的环境变量
    requiredEnvs := []string{
        "OPENAI_API_KEY",
        "VEDEM_IMAGE_AK",
        "VEDEM_IMAGE_SK",
    }

    for _, env := range requiredEnvs {
        if os.Getenv(env) == "" {
            return fmt.Errorf("required environment variable %s not set", env)
        }
    }

    // 检查设备连接
    devices, err := uixt.DiscoverAndroidDevices()
    if err != nil {
        return fmt.Errorf("failed to discover Android devices: %w", err)
    }

    if len(devices) == 0 {
        return fmt.Errorf("no Android devices found")
    }

    return nil
}

配置诊断

// 配置诊断工具
func diagnoseConfiguration() {
    fmt.Println("=== Configuration Diagnosis ===")

    // 检查环境变量
    fmt.Println("\nEnvironment Variables:")
    envVars := []string{
        "OPENAI_BASE_URL", "OPENAI_API_KEY",
        "VEDEM_IMAGE_URL", "VEDEM_IMAGE_AK", "VEDEM_IMAGE_SK",
    }

    for _, env := range envVars {
        value := os.Getenv(env)
        if value != "" {
            fmt.Printf("  %s: %s\n", env, maskSensitive(value))
        } else {
            fmt.Printf("  %s: NOT SET\n", env)
        }
    }

    // 检查设备连接
    fmt.Println("\nDevice Status:")
    androidDevices, _ := uixt.DiscoverAndroidDevices()
    fmt.Printf("  Android devices: %d\n", len(androidDevices))

    iosDevices, _ := uixt.DiscoverIOSDevices()
    fmt.Printf("  iOS devices: %d\n", len(iosDevices))
}

func maskSensitive(value string) string {
    if len(value) <= 8 {
        return "***"
    }
    return value[:4] + "***" + value[len(value)-4:]
}

最佳实践

1. 配置分层

// 分层配置管理
type Config struct {
    Device    DeviceConfig    `yaml:"device"`
    AI        AIConfig        `yaml:"ai"`
    Operation OperationConfig `yaml:"operation"`
}

type DeviceConfig struct {
    Platform string `yaml:"platform"`
    Serial   string `yaml:"serial"`
    Timeout  int    `yaml:"timeout"`
}

type AIConfig struct {
    LLMModel string `yaml:"llm_model"`
    CVService string `yaml:"cv_service"`
}

type OperationConfig struct {
    DefaultTimeout int `yaml:"default_timeout"`
    RetryCount     int `yaml:"retry_count"`
}

2. 配置验证

// 配置验证
func (c *Config) Validate() error {
    if c.Device.Platform == "" {
        return fmt.Errorf("device platform is required")
    }

    if c.Device.Serial == "" {
        return fmt.Errorf("device serial is required")
    }

    if c.Operation.DefaultTimeout <= 0 {
        c.Operation.DefaultTimeout = 30 // 设置默认值
    }

    return nil
}

3. 配置热重载

// 配置热重载
func watchConfigFile(configPath string, callback func(*Config)) {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    err = watcher.Add(configPath)
    if err != nil {
        log.Fatal(err)
    }

    for {
        select {
        case event := <-watcher.Events:
            if event.Op&fsnotify.Write == fsnotify.Write {
                config, err := loadConfig(configPath)
                if err == nil {
                    callback(config)
                }
            }
        case err := <-watcher.Errors:
            log.Println("error:", err)
        }
    }
}

参考资料