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

24 KiB
Raw Blame History

驱动接口文档

概述

HttpRunner UIXT 提供统一的驱动接口 IDriver,支持多种平台的 UI 自动化操作。每个平台都有专门的驱动实现,但对外提供相同的接口,确保跨平台的一致性。

IDriver 核心接口

接口定义

type IDriver interface {
    // 设备管理
    GetDevice() IDevice
    Setup() error
    TearDown() error

    // 会话管理
    InitSession(capabilities option.Capabilities) error
    GetSession() *DriverSession
    DeleteSession() error

    // 设备信息和状态
    Status() (types.DeviceStatus, error)
    DeviceInfo() (types.DeviceInfo, error)
    BatteryInfo() (types.BatteryInfo, error)
    ForegroundInfo() (app types.AppInfo, err error)
    WindowSize() (types.Size, error)
    ScreenShot(opts ...option.ActionOption) (*bytes.Buffer, error)
    ScreenRecord(opts ...option.ActionOption) (videoPath string, err error)
    Source(srcOpt ...option.SourceOption) (string, error)
    Orientation() (orientation types.Orientation, err error)
    Rotation() (rotation types.Rotation, err error)

    // 配置
    SetRotation(rotation types.Rotation) error
    SetIme(ime string) error

    // 基础操作
    Home() error
    Unlock() error
    Back() error
    PressButton(button types.DeviceButton) error

    // 悬停操作
    HoverBySelector(selector string, opts ...option.ActionOption) error

    // 点击操作
    TapXY(x, y float64, opts ...option.ActionOption) error
    TapAbsXY(x, y float64, opts ...option.ActionOption) error
    TapBySelector(text string, opts ...option.ActionOption) error
    DoubleTap(x, y float64, opts ...option.ActionOption) error
    TouchAndHold(x, y float64, opts ...option.ActionOption) error

    // 右键操作
    SecondaryClick(x, y float64) error
    SecondaryClickBySelector(selector string, options ...option.ActionOption) error

    // 滑动操作
    Drag(fromX, fromY, toX, toY float64, opts ...option.ActionOption) error
    Swipe(fromX, fromY, toX, toY float64, opts ...option.ActionOption) error

    // 输入操作
    Input(text string, opts ...option.ActionOption) error
    Backspace(count int, opts ...option.ActionOption) error

    // 应用管理
    AppLaunch(packageName string) error
    AppTerminate(packageName string) (bool, error)
    AppClear(packageName string) error

    // 文件管理
    PushImage(localPath string) error
    PullImages(localDir string) error
    ClearImages() error
    PushFile(localPath string, remoteDir string) error
    PullFiles(localDir string, remoteDirs ...string) error
    ClearFiles(paths ...string) error

    // 日志管理
    StartCaptureLog(identifier ...string) error
    StopCaptureLog() (result interface{}, err error)
}

Android 驱动

ADBDriver

基于 ADB (Android Debug Bridge) 的基础驱动,提供设备管理和基础操作。

// 创建 ADB 驱动
device, err := uixt.NewAndroidDevice(option.WithSerialNumber("device_serial"))
driver, err := uixt.NewADBDriver(device)

特色功能

  • 应用管理: 安装、卸载、启动、终止应用
  • 文件传输: 推送和拉取文件
  • Shell 命令: 执行 Android shell 命令
  • 日志捕获: 实时捕获系统日志
  • 屏幕录制: 录制屏幕视频
  • 系统设置: 网络、权限、系统配置

使用示例

// 应用管理
err = driver.InstallApp("/path/to/app.apk")
err = driver.UninstallApp("com.example.app")
err = driver.AppLaunch("com.example.app")
terminated, err := driver.AppTerminate("com.example.app")
err = driver.AppClear("com.example.app")

// 文件操作
err = driver.PushFile("/local/path/file.txt", "/sdcard/")
err = driver.PullFiles("/local/dir", "/sdcard/Download")

// Shell 命令
output, err := driver.Shell("pm list packages")
output, err := driver.Shell("dumpsys battery")

// 日志捕获
err = driver.StartCaptureLog("main", "system")
logs, err := driver.StopCaptureLog()

// 权限管理
err = driver.GrantPermission("com.example.app", "android.permission.CAMERA")
err = driver.RevokePermission("com.example.app", "android.permission.CAMERA")

// 系统设置
err = driver.EnableWiFi()
err = driver.ConnectWiFi("SSID", "password")
err = driver.EnableMobileData()

UIA2Driver

基于 UiAutomator2 的高级驱动,提供完整的 UI 自动化功能。

// 创建 UIA2 驱动
device, err := uixt.NewAndroidDevice(option.WithSerialNumber("device_serial"))
driver, err := uixt.NewUIA2Driver(device)

特色功能

  • UI 元素定位: 支持多种选择器
  • 手势操作: 点击、滑动、拖拽等
  • 输入操作: 文本输入、按键操作
  • 屏幕操作: 截图、录制、旋转
  • 页面源码: 获取 UI 层次结构
  • 等待机制: 元素等待和条件等待

选择器类型

// 文本选择器
err = driver.TapBySelector("text=登录")
err = driver.TapBySelector("textContains=登")
err = driver.TapBySelector("textMatches=登.*")

// 资源ID选择器
err = driver.TapBySelector("resource-id=com.example:id/login_button")
err = driver.TapBySelector("resourceId=login_button")

// 类名选择器
err = driver.TapBySelector("className=android.widget.Button")

// 描述选择器
err = driver.TapBySelector("description=登录按钮")
err = driver.TapBySelector("contentDescription=登录按钮")

// 组合选择器
err = driver.TapBySelector("className=android.widget.Button,text=登录")

// XPath 选择器
err = driver.TapBySelector("xpath=//android.widget.Button[@text='登录']")

使用示例

// UI 操作
err = driver.TapXY(0.5, 0.5)                    // 相对坐标点击
err = driver.TapAbsXY(500, 800)                 // 绝对坐标点击
err = driver.TapBySelector("text=登录")          // 通过文本点击
err = driver.DoubleTap(0.5, 0.5)               // 双击
err = driver.TouchAndHold(0.5, 0.5)            // 长按

// 滑动操作
err = driver.Swipe(0.5, 0.8, 0.5, 0.2)         // 滑动
err = driver.Drag(0.2, 0.5, 0.8, 0.5)          // 拖拽

// 输入操作
err = driver.Input("Hello World")
err = driver.Backspace(5)
err = driver.PressButton(types.DeviceButtonBack)

// 屏幕操作
screenshot, err := driver.ScreenShot()
videoPath, err := driver.ScreenRecord()
source, err := driver.Source()

// 等待操作
err = driver.WaitForElement("text=登录", 10*time.Second)
err = driver.WaitForElementGone("text=加载中", 30*time.Second)

iOS 驱动

WDADriver

基于 WebDriverAgent 的 iOS 驱动,提供完整的 iOS UI 自动化功能。

// 创建 WDA 驱动
device, err := uixt.NewIOSDevice(option.WithUDID("device_udid"))
driver, err := uixt.NewWDADriver(device)

特色功能

  • 原生 iOS 支持: 支持 iOS 原生应用和系统应用
  • 多点触控: 支持复杂手势和多指操作
  • 应用管理: 启动、终止、安装、卸载应用
  • 性能监控: 获取应用性能数据和系统信息
  • 弹窗处理: 自动处理系统弹窗和权限请求
  • 屏幕录制: 支持高质量屏幕录制

选择器类型

// 文本选择器
err = driver.TapBySelector("label=登录")
err = driver.TapBySelector("name=登录按钮")

// 类型选择器
err = driver.TapBySelector("type=XCUIElementTypeButton")
err = driver.TapBySelector("className=XCUIElementTypeButton")

// 可访问性标识符
err = driver.TapBySelector("id=login_button")
err = driver.TapBySelector("accessibilityId=login_button")

// 值选择器
err = driver.TapBySelector("value=用户名")

// 组合选择器
err = driver.TapBySelector("type=XCUIElementTypeButton,label=登录")

// XPath 选择器
err = driver.TapBySelector("xpath=//XCUIElementTypeButton[@label='登录']")

// 谓词选择器
err = driver.TapBySelector("predicate=label CONTAINS '登录'")
err = driver.TapBySelector("predicate=type == 'XCUIElementTypeButton' AND visible == 1")

使用示例

// 应用管理
err = driver.AppLaunch("com.apple.mobilesafari")
err = driver.AppLaunch("com.example.app")
terminated, err := driver.AppTerminate("com.example.app")
err = driver.AppActivate("com.example.app") // 激活后台应用

// 手势操作
err = driver.TapXY(0.5, 0.5)                // 点击
err = driver.DoubleTap(100, 200)            // 双击
err = driver.TouchAndHold(150, 300)         // 长按
err = driver.Swipe(0.5, 0.8, 0.5, 0.2)     // 滑动
err = driver.Drag(0.2, 0.5, 0.8, 0.5)      // 拖拽

// 输入操作
err = driver.Input("Hello World")
err = driver.Backspace(5)
err = driver.ClearText()

// 设备操作
err = driver.Home()                         // 回到主屏
err = driver.Back()                         // 返回(如果支持)
err = driver.SetRotation(types.RotationLandscape)

// 屏幕操作
screenshot, err := driver.ScreenShot()
err = driver.StartScreenRecord()
videoPath, err := driver.StopScreenRecord()
source, err := driver.Source()

// 等待操作
err = driver.WaitForElement("label=登录", 10*time.Second)
err = driver.WaitForElementGone("label=加载中", 30*time.Second)

iOS 特有功能

// Siri 操作
err = driver.ActivateSiri("打开设置")
err = driver.ActivateSiri("发送消息给张三")

// 3D Touch / Force Touch
err = driver.ForceTouch(100, 200, 0.8)      // 压力值 0.0-1.0
err = driver.ForceTouchBySelector("label=应用图标", 0.8)

// 设备控制
err = driver.Lock()                         // 锁定设备
err = driver.Unlock()                       // 解锁设备
err = driver.Shake()                        // 摇晃设备

// 音量控制
err = driver.VolumeUp()                     // 音量增加
err = driver.VolumeDown()                   // 音量减少
err = driver.SetVolume(0.5)                 // 设置音量 (0.0-1.0)

// 弹窗处理
err = driver.AcceptAlert()                  // 接受弹窗
err = driver.DismissAlert()                 // 关闭弹窗
alertText, err := driver.GetAlertText()     // 获取弹窗文本

// 键盘操作
err = driver.HideKeyboard()                 // 隐藏键盘
isVisible, err := driver.IsKeyboardShown()  // 检查键盘是否显示

// 应用状态
state, err := driver.GetAppState("com.example.app")
// 0: not installed, 1: not running, 2: running in background, 4: running in foreground

// 设备信息
battery, err := driver.BatteryInfo()
orientation, err := driver.Orientation()
size, err := driver.WindowSize()

HarmonyOS 驱动

HDCDriver

基于 HDC (HarmonyOS Device Connector) 的鸿蒙驱动,提供完整的 HarmonyOS UI 自动化功能。

// 创建 HDC 驱动
device, err := uixt.NewHarmonyDevice(option.WithConnectKey("device_key"))
driver, err := uixt.NewHDCDriver(device)

特色功能

  • 原生鸿蒙支持: 支持 HarmonyOS 应用和系统应用
  • 分布式操作: 支持多设备协同和跨设备操作
  • 原子化服务: 支持轻量级应用和服务
  • ArkUI 支持: 支持 ArkUI 框架的组件识别
  • 多模态交互: 支持语音、手势等多种交互方式

选择器类型

// 文本选择器
err = driver.TapBySelector("text=登录")
err = driver.TapBySelector("textContains=登")

// 组件类型选择器
err = driver.TapBySelector("type=Button")
err = driver.TapBySelector("className=ohos.agp.components.Button")

// ID 选择器
err = driver.TapBySelector("id=login_button")
err = driver.TapBySelector("resourceId=login_button")

// 描述选择器
err = driver.TapBySelector("description=登录按钮")
err = driver.TapBySelector("contentDescription=登录按钮")

// 组合选择器
err = driver.TapBySelector("type=Button,text=登录")

// XPath 选择器
err = driver.TapBySelector("xpath=//Button[@text='登录']")

使用示例

// 基础操作
err = driver.TapXY(0.5, 0.5)                // 点击
err = driver.DoubleTap(0.5, 0.5)            // 双击
err = driver.TouchAndHold(0.5, 0.5)         // 长按
err = driver.Swipe(0.2, 0.8, 0.8, 0.2)     // 滑动
err = driver.Drag(0.2, 0.5, 0.8, 0.5)      // 拖拽

// 输入操作
err = driver.Input("测试文本")
err = driver.Backspace(5)
err = driver.PressButton(types.DeviceButtonBack)

// 应用管理
err = driver.AppLaunch("com.huawei.hmos.example")
err = driver.AppLaunch("com.example.harmony.app")
terminated, err := driver.AppTerminate("com.example.app")
err = driver.AppClear("com.example.app")

// 屏幕操作
screenshot, err := driver.ScreenShot()
videoPath, err := driver.ScreenRecord()
source, err := driver.Source()

// 等待操作
err = driver.WaitForElement("text=登录", 10*time.Second)
err = driver.WaitForElementGone("text=加载中", 30*time.Second)

HarmonyOS 特有功能

// 分布式操作
err = driver.ConnectDistributedDevice("target_device_id")
err = driver.DisconnectDistributedDevice("target_device_id")

// 跨设备应用迁移
err = driver.MigrateApp("com.example.app", "target_device_id")

// 原子化服务
err = driver.LaunchAtomicService("service_id", map[string]interface{}{
    "param1": "value1",
    "param2": "value2",
})
err = driver.StopAtomicService("service_id")

// 多模态交互
err = driver.VoiceCommand("打开设置")
err = driver.GestureCommand("swipe_up")

// 系统设置
err = driver.EnableDistributedCapability()
err = driver.DisableDistributedCapability()

// 性能监控
performance, err := driver.GetPerformanceData()
memory, err := driver.GetMemoryInfo()
cpu, err := driver.GetCPUInfo()

// 设备信息
info, err := driver.DeviceInfo()
battery, err := driver.BatteryInfo()

Web 驱动

BrowserDriver

基于 WebDriver 协议的浏览器驱动,支持多种浏览器的 Web 自动化测试。

// 创建浏览器驱动
device, err := uixt.NewBrowserDevice(option.WithBrowserID("chrome"))
driver, err := uixt.NewBrowserDriver(device)

特色功能

  • 多浏览器支持: Chrome、Firefox、Safari、Edge
  • JavaScript 执行: 执行自定义脚本和异步脚本
  • 多标签页管理: 创建、切换、关闭标签页
  • Cookie 管理: 获取、设置、删除 Cookie
  • 文件上传下载: 支持文件操作
  • 网络监控: 监控网络请求和响应
  • 移动端模拟: 模拟移动设备和触摸操作

选择器类型

// CSS 选择器
err = driver.TapBySelector("#login-button")
err = driver.TapBySelector(".btn-primary")
err = driver.TapBySelector("button[type='submit']")

// XPath 选择器
err = driver.TapBySelector("xpath=//button[@id='login']")
err = driver.TapBySelector("xpath=//div[contains(@class, 'login')]//button")

// 文本选择器
err = driver.TapBySelector("text=登录")
err = driver.TapBySelector("linkText=点击这里")
err = driver.TapBySelector("partialLinkText=点击")

// 标签名选择器
err = driver.TapBySelector("tagName=button")
err = driver.TapBySelector("tagName=input")

// 属性选择器
err = driver.TapBySelector("name=username")
err = driver.TapBySelector("className=btn")

使用示例

// 页面导航
err = driver.NavigateTo("https://example.com")
err = driver.Refresh()
err = driver.GoBack()
err = driver.GoForward()

// 元素操作
err = driver.TapBySelector("#login-button")
err = driver.DoubleTap(100, 200)
err = driver.TouchAndHold(150, 300)
err = driver.Input("username")
err = driver.Backspace(5)

// 滑动和拖拽
err = driver.Swipe(0.5, 0.8, 0.5, 0.2)
err = driver.Drag(0.2, 0.5, 0.8, 0.5)

// 屏幕操作
screenshot, err := driver.ScreenShot()
err = driver.StartScreenRecord()
videoPath, err := driver.StopScreenRecord()

// JavaScript 执行
result, err := driver.ExecuteScript("return document.title;")
err = driver.ExecuteAsyncScript("callback(arguments[0]);", "test")

// 标签页管理
err = driver.NewTab()
err = driver.CloseTab(1)
err = driver.SwitchToTab(0)

// 等待操作
err = driver.WaitForElement("#element", 10*time.Second)
err = driver.WaitForElementGone("#loading", 30*time.Second)
err = driver.WaitForPageLoad(30*time.Second)

Web 特有功能

// Cookie 操作
cookies, err := driver.GetCookies()
err = driver.SetCookie("name", "value", "domain.com")
err = driver.DeleteCookie("name")
err = driver.DeleteAllCookies()

// 窗口管理
err = driver.SetWindowSize(1920, 1080)
size, err := driver.GetWindowSize()
err = driver.Maximize()
err = driver.Minimize()
err = driver.Fullscreen()

// 页面信息
title, err := driver.GetTitle()
url, err := driver.GetCurrentURL()
source, err := driver.GetPageSource()

// 框架操作
err = driver.SwitchToFrame("frame_name")
err = driver.SwitchToFrameByIndex(0)
err = driver.SwitchToDefaultContent()

// 弹窗处理
err = driver.AcceptAlert()
err = driver.DismissAlert()
alertText, err := driver.GetAlertText()
err = driver.SendAlertText("input text")

// 文件操作
err = driver.UploadFile("#file-input", "/path/to/file.txt")
downloadPath, err := driver.DownloadFile("https://example.com/file.pdf")

// 网络监控
err = driver.StartNetworkMonitoring()
requests, err := driver.GetNetworkRequests()
err = driver.StopNetworkMonitoring()

// 移动端模拟
err = driver.SetMobileEmulation("iPhone 12")
err = driver.SetUserAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)")

// 性能监控
metrics, err := driver.GetPerformanceMetrics()
logs, err := driver.GetBrowserLogs()

// 截图和录制
fullPageScreenshot, err := driver.FullPageScreenShot()
elementScreenshot, err := driver.ElementScreenShot("#element")

// 元素信息
isVisible, err := driver.IsElementVisible("#element")
isEnabled, err := driver.IsElementEnabled("#button")
text, err := driver.GetElementText("#element")
value, err := driver.GetElementValue("#input")
attribute, err := driver.GetElementAttribute("#element", "class")

// 表单操作
err = driver.SelectOption("#select", "option_value")
err = driver.CheckCheckbox("#checkbox")
err = driver.UncheckCheckbox("#checkbox")
err = driver.SelectRadioButton("#radio")

// 滚动操作
err = driver.ScrollToElement("#element")
err = driver.ScrollToTop()
err = driver.ScrollToBottom()
err = driver.ScrollBy(0, 500)

扩展驱动 (XTDriver)

概述

XTDriver 是对基础驱动的扩展,集成了 AI 能力和 MCP 工具系统。

// 创建扩展驱动
baseDriver, err := uixt.NewUIA2Driver(device)
xtDriver, err := uixt.NewXTDriver(baseDriver,
    option.WithCVService(option.CVServiceTypeVEDEM),
    option.WithLLMService(option.OPENAI_GPT_4O),
)

核心组件

type XTDriver struct {
    IDriver                              // 基础驱动能力
    CVService  ai.ICVService             // 计算机视觉服务
    LLMService ai.ILLMService            // 大语言模型服务
    client     *MCPClient4XTDriver       // MCP 客户端
}

AI 增强功能

智能操作

// 使用自然语言执行操作
result, err := xtDriver.LLMService.Plan(ctx, &ai.PlanningOptions{
    UserInstruction: "点击登录按钮并输入用户名",
    Message:         message,
    Size:           screenSize,
})

// 执行规划的操作
for _, toolCall := range result.ToolCalls {
    // 自动执行工具调用
}

智能识别

// OCR 文本识别
cvResult, err := xtDriver.CVService.ReadFromBuffer(screenshot)
ocrTexts := cvResult.OCRResult.ToOCRTexts()

// 查找特定文本
targetText, err := ocrTexts.FindText("登录")
center := targetText.Center()

// 点击识别的文本
err = xtDriver.TapAbsXY(center.X, center.Y)

智能断言

// 使用自然语言进行断言
assertResult, err := xtDriver.LLMService.Assert(ctx, &ai.AssertOptions{
    Assertion:  "页面应该显示用户已登录",
    Screenshot: screenshot,
    Size:       screenSize,
})

if assertResult.Pass {
    fmt.Println("断言通过")
} else {
    fmt.Printf("断言失败: %s\n", assertResult.Thought)
}

MCP 工具集成

// 执行 MCP 工具
result, err := xtDriver.ExecuteAction(ctx, option.MobileAction{
    Method: option.ActionTapXY,
    Params: map[string]interface{}{
        "x": 0.5,
        "y": 0.5,
    },
})

驱动选择指南

平台对应关系

平台 推荐驱动 备选驱动 说明
Android UIA2Driver ADBDriver UIA2 提供完整 UI 功能ADB 提供基础操作
iOS WDADriver - 唯一选择,基于 WebDriverAgent
HarmonyOS HDCDriver - 原生鸿蒙支持
Web BrowserDriver - 支持所有主流浏览器

选择建议

功能需求

  • 基础操作: ADBDriver (Android)
  • 完整 UI 自动化: UIA2Driver (Android), WDADriver (iOS)
  • AI 增强: XTDriver (所有平台)
  • Web 自动化: BrowserDriver

性能考虑

  • 速度优先: ADBDriver < UIA2Driver < WDADriver
  • 稳定性: WDADriver > UIA2Driver > ADBDriver
  • 功能完整性: XTDriver > 平台驱动 > 基础驱动

驱动配置

通用配置

// 超时配置
driver.SetTimeout(30 * time.Second)

// 重试配置
driver.SetRetryCount(3)
driver.SetRetryInterval(1 * time.Second)

// 日志配置
driver.SetLogLevel(log.DebugLevel)
driver.EnableActionLog(true)

平台特定配置

Android 配置

// UiAutomator2 配置
driver.SetUiAutomator2Config(uia2.Config{
    WaitForIdleTimeout:    10 * time.Second,
    WaitForSelectorTimeout: 20 * time.Second,
    ActionAcknowledgmentTimeout: 3 * time.Second,
})

// ADB 配置
driver.SetADBConfig(adb.Config{
    CommandTimeout: 30 * time.Second,
    ShellTimeout:   60 * time.Second,
})

iOS 配置

// WebDriverAgent 配置
driver.SetWDAConfig(wda.Config{
    ConnectionTimeout: 60 * time.Second,
    CommandTimeout:    30 * time.Second,
    SnapshotTimeout:   15 * time.Second,
})

Web 配置

// WebDriver 配置
driver.SetWebDriverConfig(webdriver.Config{
    PageLoadTimeout:    30 * time.Second,
    ScriptTimeout:      10 * time.Second,
    ImplicitWaitTimeout: 5 * time.Second,
})

最佳实践

1. 驱动生命周期管理

func useDriver() error {
    // 创建驱动
    driver, err := createDriver()
    if err != nil {
        return err
    }

    // 初始化
    err = driver.Setup()
    if err != nil {
        return err
    }
    defer driver.TearDown() // 确保清理

    // 使用驱动
    return performOperations(driver)
}

2. 错误处理

// 带重试的操作
func tapWithRetry(driver IDriver, x, y float64) error {
    maxRetries := 3
    for i := 0; i < maxRetries; i++ {
        err := driver.TapXY(x, y)
        if err == nil {
            return nil
        }

        // 检查是否是临时错误
        if isTemporaryError(err) {
            time.Sleep(time.Duration(i+1) * time.Second)
            continue
        }

        return err
    }
    return fmt.Errorf("operation failed after %d retries", maxRetries)
}

3. 性能优化

// 批量操作
func performBatchOperations(driver IDriver, operations []Operation) error {
    // 开始批量模式
    driver.BeginBatch()
    defer driver.EndBatch()

    for _, op := range operations {
        err := op.Execute(driver)
        if err != nil {
            return err
        }
    }

    return nil
}

4. 跨平台兼容

// 平台适配
func performPlatformSpecificOperation(driver IDriver) error {
    switch d := driver.(type) {
    case *UIA2Driver:
        // Android 特定操作
        return d.AndroidSpecificMethod()
    case *WDADriver:
        // iOS 特定操作
        return d.IOSSpecificMethod()
    case *BrowserDriver:
        // Web 特定操作
        return d.WebSpecificMethod()
    default:
        // 通用操作
        return driver.TapXY(0.5, 0.5)
    }
}

故障排除

常见问题

驱动初始化失败

// 检查设备连接
status, err := driver.Status()
if err != nil {
    log.Error("Device not connected: %v", err)
    return err
}

// 检查驱动服务
if !driver.IsServiceRunning() {
    err = driver.StartService()
    if err != nil {
        log.Error("Failed to start driver service: %v", err)
        return err
    }
}

操作超时

// 增加超时时间
driver.SetTimeout(60 * time.Second)

// 等待元素出现
err = driver.WaitForElement("selector", 30*time.Second)
if err != nil {
    log.Error("Element not found: %v", err)
    return err
}

内存泄漏

// 定期清理资源
func periodicCleanup(driver IDriver) {
    ticker := time.NewTicker(5 * time.Minute)
    defer ticker.Stop()

    for range ticker.C {
        driver.ClearCache()
        runtime.GC()
    }
}

参考资料