mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-11 18:11:21 +08:00
feat: add GetForegroundApp for android
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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...)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user