From 6067d5ddbd56ee4a2df04f939eff17bc2abfda48 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 28 Apr 2023 16:15:53 +0800 Subject: [PATCH] refactor: AssertAppForeground --- docs/CHANGELOG.md | 2 +- hrp/internal/code/code.go | 2 ++ hrp/pkg/uixt/android_adb_driver.go | 11 +++++------ hrp/pkg/uixt/android_test.go | 9 +++++---- hrp/pkg/uixt/ext.go | 12 +----------- hrp/pkg/uixt/interface.go | 4 ++-- hrp/pkg/uixt/ios_driver.go | 4 ++-- hrp/pkg/uixt/video_crawler.go | 11 +++++++++++ hrp/step_mobile_ui.go | 6 +++--- 9 files changed, 32 insertions(+), 29 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ca27fbc5..8f18b940 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,7 +7,7 @@ - feat: add `sleep_random` to sleep random seconds, with weight for multiple time ranges - feat: input text with adb - feat: add adb `screencap` sub command -- feat: add `IsAppInForeground` to check if the given package is in foreground +- feat: add `AssertAppInForeground` to check if the given package is in foreground - feat: check if app is in foreground when step failed - feat: add validator AssertAppInForeground and AssertAppNotInForeground - feat: save screenshots of all steps including ocr and cv recognition process data diff --git a/hrp/internal/code/code.go b/hrp/internal/code/code.go index 71f9226c..23d79bea 100644 --- a/hrp/internal/code/code.go +++ b/hrp/internal/code/code.go @@ -61,6 +61,7 @@ var ( var ( AndroidDeviceConnectionError = errors.New("android device connection error") // 60 AndroidDeviceUSBDriverError = errors.New("android device USB driver error") // 61 + AndroidShellExecError = errors.New("android shell exec error") // 62 AndroidScreenShotError = errors.New("android screenshot error") // 65 AndroidCaptureLogError = errors.New("android capture log error") // 66 ) @@ -121,6 +122,7 @@ var errorsMap = map[error]int{ // android related AndroidDeviceConnectionError: 60, AndroidDeviceUSBDriverError: 61, + AndroidShellExecError: 62, AndroidScreenShotError: 65, AndroidCaptureLogError: 66, diff --git a/hrp/pkg/uixt/android_adb_driver.go b/hrp/pkg/uixt/android_adb_driver.go index 388c444e..b509d3b3 100644 --- a/hrp/pkg/uixt/android_adb_driver.go +++ b/hrp/pkg/uixt/android_adb_driver.go @@ -362,30 +362,29 @@ func (ad *adbDriver) GetLastLaunchedApp() (packageName string) { return ad.lastLaunchedPackageName } -func (ad *adbDriver) IsAppInForeground(packageName string) (bool, error) { +func (ad *adbDriver) AssertAppForeground(packageName string) error { if packageName == "" { - return false, errors.New("package name is not given") + return errors.New("package name is not given") } // adb shell dumpsys activity activities | grep mResumedActivity output, err := ad.adbClient.RunShellCommand("dumpsys", "activity", "activities") if err != nil { log.Error().Err(err).Msg("failed to dumpsys activities") - return false, err + return errors.Wrap(code.AndroidShellExecError, err.Error()) } lines := strings.Split(string(output), "\n") - isInForeground := false for _, line := range lines { trimmedLine := strings.TrimSpace(line) if strings.HasPrefix(trimmedLine, "mResumedActivity:") { if strings.Contains(trimmedLine, packageName) { - isInForeground = true + return nil } break } } - return isInForeground, nil + return errors.New("app is not in foreground") } diff --git a/hrp/pkg/uixt/android_test.go b/hrp/pkg/uixt/android_test.go index 433cc38a..af916d3e 100644 --- a/hrp/pkg/uixt/android_test.go +++ b/hrp/pkg/uixt/android_test.go @@ -361,18 +361,19 @@ func TestDriver_IsAppInForeground(t *testing.T) { t.Fatal(err) } - yes, err := driver.Driver.IsAppInForeground(driver.Driver.GetLastLaunchedApp()) - if err != nil || !yes { + err = driver.Driver.AssertAppForeground(driver.Driver.GetLastLaunchedApp()) + if err != nil { t.Fatal(err) } + time.Sleep(2 * time.Second) _, err = driver.Driver.AppTerminate("com.android.settings") if err != nil { t.Fatal(err) } - yes, err = driver.Driver.IsAppInForeground("com.android.settings") - if err != nil || yes { + err = driver.Driver.AssertAppForeground("com.android.settings") + if err == nil { t.Fatal(err) } } diff --git a/hrp/pkg/uixt/ext.go b/hrp/pkg/uixt/ext.go index 59c658a7..3c57ffb6 100644 --- a/hrp/pkg/uixt/ext.go +++ b/hrp/pkg/uixt/ext.go @@ -217,16 +217,6 @@ func (dExt *DriverExt) IsImageExist(text string) bool { return err == nil } -func (dExt *DriverExt) IsAppInForeground(packageName string) bool { - // check if app is in foreground - yes, err := dExt.Driver.IsAppInForeground(packageName) - if !yes || err != nil { - log.Info().Str("packageName", packageName).Msg("app is not in foreground") - return false - } - return true -} - // (x1, y1) is the top left corner, (x2, y2) is the bottom right corner // the value of (x, y) is between 0 and 1, which means the percentage of the screen func (dExt *DriverExt) getAbsScope(x1, y1, x2, y2 float64) (int, int, int, int) { @@ -250,7 +240,7 @@ func (dExt *DriverExt) DoValidation(check, assert, expected string, message ...s case SelectorImage: result = (dExt.IsImageExist(expected) == exp) case SelectorForegroundApp: - result = (dExt.IsAppInForeground(expected) == exp) + result = ((dExt.Driver.AssertAppForeground(expected) == nil) == exp) } if !result { diff --git a/hrp/pkg/uixt/interface.go b/hrp/pkg/uixt/interface.go index 7d6145b3..180f2066 100644 --- a/hrp/pkg/uixt/interface.go +++ b/hrp/pkg/uixt/interface.go @@ -621,8 +621,8 @@ type WebDriver interface { AppTerminate(packageName string) (bool, error) // GetLastLaunchedApp returns the package name of the last launched app GetLastLaunchedApp() string - // IsAppInForeground returns true if the given package is in foreground - IsAppInForeground(packageName string) (bool, error) + // AssertAppForeground returns nil if the given package is in foreground + AssertAppForeground(packageName string) error // StartCamera Starts a new camera for recording StartCamera() error diff --git a/hrp/pkg/uixt/ios_driver.go b/hrp/pkg/uixt/ios_driver.go index 64cb8f24..29902268 100644 --- a/hrp/pkg/uixt/ios_driver.go +++ b/hrp/pkg/uixt/ios_driver.go @@ -369,8 +369,8 @@ func (wd *wdaDriver) GetLastLaunchedApp() (packageName string) { return wd.lastLaunchedPackageName } -func (wd *wdaDriver) IsAppInForeground(packageName string) (bool, error) { - return false, errors.New("not implemented") +func (wd *wdaDriver) AssertAppForeground(packageName string) error { + return nil } func (wd *wdaDriver) Tap(x, y int, options ...DataOption) error { diff --git a/hrp/pkg/uixt/video_crawler.go b/hrp/pkg/uixt/video_crawler.go index 450fc744..777c4d72 100644 --- a/hrp/pkg/uixt/video_crawler.go +++ b/hrp/pkg/uixt/video_crawler.go @@ -3,7 +3,10 @@ package uixt import ( "time" + "github.com/pkg/errors" "github.com/rs/zerolog/log" + + "github.com/httprunner/httprunner/v4/hrp/internal/code" ) type VideoCrawlerConfigs struct { @@ -24,6 +27,14 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) { // loop until target count achieved for { + // check if app in foreground + err := dExt.Driver.AssertAppForeground(configs.AppPackageName) + if err != nil { + log.Error().Err(err).Str("packageName", configs.AppPackageName).Msg("app is not in foreground") + err = errors.Wrap(code.MobileUIAppNotInForegroundError, err.Error()) + return err + } + // take screenshot and get screen texts by OCR texts, err := dExt.GetScreenTextsByOCR() if err != nil { diff --git a/hrp/step_mobile_ui.go b/hrp/step_mobile_ui.go index 35877e3b..2ba33467 100644 --- a/hrp/step_mobile_ui.go +++ b/hrp/step_mobile_ui.go @@ -601,9 +601,9 @@ func runStepMobileUI(s *SessionRunner, step *TStep) (stepResult *StepResult, err // check if app is in foreground packageName := uiDriver.Driver.GetLastLaunchedApp() - yes, err2 := uiDriver.Driver.IsAppInForeground(packageName) - if packageName != "" && (!yes || err2 != nil) { - log.Error().Err(err2).Str("packageName", packageName).Msg("app is not in foreground") + err := uiDriver.Driver.AssertAppForeground(packageName) + if packageName != "" && err != nil { + log.Error().Err(err).Str("packageName", packageName).Msg("app is not in foreground") err = errors.Wrap(code.MobileUIAppNotInForegroundError, err.Error()) } }