From ab40a8c63f3c90d6c7b324231f0d9544af311bfb Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Mon, 30 Jun 2025 00:11:22 +0800 Subject: [PATCH] refactor: ForegroundInfo --- go.mod | 2 +- internal/version/VERSION | 2 +- uixt/android_driver_adb.go | 55 +++++++++++++++++++++++++++----------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 78c40dbe..ea2db9fe 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ toolchain go1.23.7 require ( github.com/Masterminds/semver v1.5.0 github.com/andybalholm/brotli v1.0.4 + github.com/antchfx/xmlquery v1.4.4 github.com/bytedance/sonic v1.13.2 github.com/charmbracelet/glamour v0.8.0 github.com/charmbracelet/huh v0.3.0 @@ -47,7 +48,6 @@ require ( require ( github.com/alecthomas/chroma/v2 v2.14.0 // indirect - github.com/antchfx/xmlquery v1.4.4 // indirect github.com/antchfx/xpath v1.3.3 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect diff --git a/internal/version/VERSION b/internal/version/VERSION index 53812863..524b9a16 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-250629 +v5.0.0-250630 diff --git a/uixt/android_driver_adb.go b/uixt/android_driver_adb.go index 65ca88ed..1e539364 100644 --- a/uixt/android_driver_adb.go +++ b/uixt/android_driver_adb.go @@ -622,9 +622,13 @@ func (ad *ADBDriver) tapByTextUsingHierarchy(hierarchy *Hierarchy, text string, func (ud *ADBDriver) TapByXpath(xpath string, opts ...option.ActionOption) (err error) { source, err := ud.Source() + if err != nil { + log.Error().Err(err).Msg("failed to get source") + return err + } doc, err := xmlquery.Parse(strings.NewReader(source)) if err != nil { - log.Error().Err(err).Str("serial", ud.Device.Serial()) + log.Error().Err(err).Msg("failed to parse source") return err } targetNodes := xmlquery.Find(doc, xpath) @@ -644,10 +648,12 @@ func (ud *ADBDriver) TapByXpath(xpath string, opts ...option.ActionOption) (err centerX := float64(x1+x2) / 2 centerY := float64(y1+y2) / 2 - log.Info().Str("serial", ud.Device.Serial()).Str("xpath", xpath).Str("bounds", bounds).Msg("find node by xpath success") + log.Info().Str("xpath", xpath).Str("bounds", bounds).Msg("find node by xpath success") return ud.TapAbsXY(centerX, centerY, opts...) } - return + + log.Error().Str("xpath", xpath).Msg("failed to find node by xpath") + return errors.New("failed to find node by xpath") } func (ad *ADBDriver) searchNodes(nodes []Layout, text string, opts ...option.ActionOption) []Bounds { @@ -756,27 +762,44 @@ func (ad *ADBDriver) GetSession() *DriverSession { } func (ad *ADBDriver) ForegroundInfo() (app types.AppInfo, err error) { - packageInfo, err := ad.runShellCommand("CLASSPATH=/data/local/tmp/evalite", "app_process", "/", "com.bytedance.iesqa.eval_process.PackageService", "2>/dev/null") + // Get foreground app package info using evalite service + packageInfo, err := ad.getForegroundPackageInfo() if err != nil { - packageInfo, err = ad.runShellCommand("CLASSPATH=/data/local/tmp/evalite", "app_process", "/", "com.bytedance.iesqa.eval_process.PackageService", "2>/dev/null") - if err != nil { - log.Error().Err(err).Str("serial", ad.Device.Serial()).Msg("failed to get foreground app") - return app, err - } + log.Error().Err(err).Msg("failed to get foreground app info") + return app, err } - log.Info().Str("serial", ad.Device.Serial()).Msg("foreground app output: " + packageInfo) - if strings.TrimSpace(packageInfo) == "" { - log.Error().Str("serial", ad.Device.Serial()).Msg("foreground app output is empty") - return app, errors.New("foreground app output is empty") + + // Parse package info JSON + packageInfo = strings.TrimSpace(packageInfo) + if packageInfo == "" { + err = errors.New("foreground app output is empty") + log.Error().Err(err).Msg("get foreground app info failed") + return app, err } - err = json.Unmarshal([]byte(strings.TrimSpace(packageInfo)), &app) - if err != nil { - log.Error().Err(err).Str("serial", ad.Device.Serial()).Str("packageInfo", packageInfo).Msg("failed to parse package info") + if err = json.Unmarshal([]byte(packageInfo), &app); err != nil { + log.Error().Err(err).Str("packageInfo", packageInfo).Msg("failed to parse package info") return app, err } return app, nil } +// getForegroundPackageInfo executes the evalite service command to get foreground app info +func (ad *ADBDriver) getForegroundPackageInfo() (string, error) { + const maxRetries = 2 + var lastErr error + for i := 0; i < maxRetries; i++ { + packageInfo, err := ad.runShellCommand("CLASSPATH=/data/local/tmp/evalite", + "app_process", "/", "com.bytedance.iesqa.eval_process.PackageService", "2>/dev/null") + if err == nil { + return packageInfo, nil + } + lastErr = err + log.Warn().Err(err).Int("attempt", i+1).Msg("failed to get foreground package info, retrying") + } + + return "", lastErr +} + func (ad *ADBDriver) SetIme(imeRegx string) error { log.Info().Str("imeRegx", imeRegx).Msg("ADBDriver.SetIme") imeList := ad.ListIme()