mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-07 07:21:23 +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")
|
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")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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...)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user