feat: add GetForegroundApp for android

This commit is contained in:
lilong.129
2023-04-28 16:59:02 +08:00
parent 6067d5ddbd
commit 8498fe10e3
5 changed files with 39 additions and 20 deletions

View File

@@ -367,24 +367,38 @@ func (ad *adbDriver) AssertAppForeground(packageName string) error {
return errors.New("package name is not given") return errors.New("package name is not given")
} }
foreApp, err := ad.GetForegroundApp()
if err != nil {
return err
}
if foreApp != packageName {
return errors.New("app is not in foreground")
}
return nil
}
func (ad *adbDriver) GetForegroundApp() (packageName string, err error) {
// adb shell dumpsys activity activities | grep mResumedActivity // adb shell dumpsys activity activities | grep mResumedActivity
output, err := ad.adbClient.RunShellCommand("dumpsys", "activity", "activities") output, err := ad.adbClient.RunShellCommand("dumpsys", "activity", "activities")
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to dumpsys activities") log.Error().Err(err).Msg("failed to dumpsys activities")
return errors.Wrap(code.AndroidShellExecError, err.Error()) return "", errors.Wrap(code.AndroidShellExecError, err.Error())
} }
lines := strings.Split(string(output), "\n") lines := strings.Split(string(output), "\n")
for _, line := range lines { for _, line := range lines {
trimmedLine := strings.TrimSpace(line) trimmedLine := strings.TrimSpace(line)
if strings.HasPrefix(trimmedLine, "mResumedActivity:") { if strings.HasPrefix(trimmedLine, "mResumedActivity:") {
if strings.Contains(trimmedLine, packageName) { // mResumedActivity: ActivityRecord{9656d74 u0 com.android.settings/.Settings t407}
return nil strs := strings.Split(trimmedLine, " ")
for _, str := range strs {
if strings.Contains(str, "/") {
// com.android.settings/.Settings
return strings.Split(str, "/")[0], nil
}
} }
break
} }
} }
return errors.New("app is not in foreground") return "", errors.New("get foreground app failed")
} }

View File

@@ -350,29 +350,29 @@ func TestDriver_AppLaunch(t *testing.T) {
} }
func TestDriver_IsAppInForeground(t *testing.T) { func TestDriver_IsAppInForeground(t *testing.T) {
device, _ := NewAndroidDevice() setupAndroid(t)
driver, err := device.NewDriver(nil)
if err != nil { err := driverExt.Driver.AppLaunch("com.android.settings")
t.Fatal(err) checkErr(t, err)
foreApp, err := driverExt.Driver.GetForegroundApp()
checkErr(t, err)
if foreApp != "com.android.settings" {
t.FailNow()
} }
err = driver.Driver.AppLaunch("com.android.settings") err = driverExt.Driver.AssertAppForeground(driverExt.Driver.GetLastLaunchedApp())
if err != nil {
t.Fatal(err)
}
err = driver.Driver.AssertAppForeground(driver.Driver.GetLastLaunchedApp())
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)
_, err = driver.Driver.AppTerminate("com.android.settings") _, err = driverExt.Driver.AppTerminate("com.android.settings")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
err = driver.Driver.AssertAppForeground("com.android.settings") err = driverExt.Driver.AssertAppForeground("com.android.settings")
if err == nil { if err == nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@@ -623,6 +623,8 @@ type WebDriver interface {
GetLastLaunchedApp() string GetLastLaunchedApp() string
// AssertAppForeground returns nil if the given package is in foreground // AssertAppForeground returns nil if the given package is in foreground
AssertAppForeground(packageName string) error AssertAppForeground(packageName string) error
// GetForegroundApp returns current foreground app package name
GetForegroundApp() (string, error)
// StartCamera Starts a new camera for recording // StartCamera Starts a new camera for recording
StartCamera() error StartCamera() error

View File

@@ -373,6 +373,10 @@ func (wd *wdaDriver) AssertAppForeground(packageName string) error {
return nil return nil
} }
func (wd *wdaDriver) GetForegroundApp() (string, error) {
return "", nil
}
func (wd *wdaDriver) Tap(x, y int, options ...DataOption) error { func (wd *wdaDriver) Tap(x, y int, options ...DataOption) error {
return wd.TapFloat(float64(x), float64(y), options...) return wd.TapFloat(float64(x), float64(y), options...)
} }

View File

@@ -28,8 +28,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
// loop until target count achieved // loop until target count achieved
for { for {
// check if app in foreground // check if app in foreground
err := dExt.Driver.AssertAppForeground(configs.AppPackageName) if err := dExt.Driver.AssertAppForeground(configs.AppPackageName); err != nil {
if err != nil {
log.Error().Err(err).Str("packageName", configs.AppPackageName).Msg("app is not in foreground") log.Error().Err(err).Str("packageName", configs.AppPackageName).Msg("app is not in foreground")
err = errors.Wrap(code.MobileUIAppNotInForegroundError, err.Error()) err = errors.Wrap(code.MobileUIAppNotInForegroundError, err.Error())
return err return err