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")
}
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
output, err := ad.adbClient.RunShellCommand("dumpsys", "activity", "activities")
if err != nil {
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")
for _, line := range lines {
trimmedLine := strings.TrimSpace(line)
if strings.HasPrefix(trimmedLine, "mResumedActivity:") {
if strings.Contains(trimmedLine, packageName) {
return nil
// mResumedActivity: ActivityRecord{9656d74 u0 com.android.settings/.Settings t407}
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) {
device, _ := NewAndroidDevice()
driver, err := device.NewDriver(nil)
if err != nil {
t.Fatal(err)
setupAndroid(t)
err := driverExt.Driver.AppLaunch("com.android.settings")
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")
if err != nil {
t.Fatal(err)
}
err = driver.Driver.AssertAppForeground(driver.Driver.GetLastLaunchedApp())
err = driverExt.Driver.AssertAppForeground(driverExt.Driver.GetLastLaunchedApp())
if err != nil {
t.Fatal(err)
}
time.Sleep(2 * time.Second)
_, err = driver.Driver.AppTerminate("com.android.settings")
_, err = driverExt.Driver.AppTerminate("com.android.settings")
if err != nil {
t.Fatal(err)
}
err = driver.Driver.AssertAppForeground("com.android.settings")
err = driverExt.Driver.AssertAppForeground("com.android.settings")
if err == nil {
t.Fatal(err)
}

View File

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

View File

@@ -373,6 +373,10 @@ func (wd *wdaDriver) AssertAppForeground(packageName string) error {
return nil
}
func (wd *wdaDriver) GetForegroundApp() (string, error) {
return "", nil
}
func (wd *wdaDriver) Tap(x, y int, options ...DataOption) error {
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
for {
// check if app in foreground
err := dExt.Driver.AssertAppForeground(configs.AppPackageName)
if err != nil {
if err := dExt.Driver.AssertAppForeground(configs.AppPackageName); 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