feat: save foreground app when step failed

This commit is contained in:
lilong.129
2023-06-07 16:25:04 +08:00
parent 4fb56211d8
commit e7b4d4f8b7
3 changed files with 33 additions and 25 deletions

View File

@@ -70,12 +70,12 @@ var (
// UI automation related: [70, 80) // UI automation related: [70, 80)
var ( var (
MobileUIDriverError = errors.New("mobile UI driver error") // 70 MobileUIDriverError = errors.New("mobile UI driver error") // 70
MobileUILaunchAppError = errors.New("mobile UI launch app error") // 71 MobileUILaunchAppError = errors.New("mobile UI launch app error") // 71
MobileUIValidationError = errors.New("mobile UI validation error") // 75 MobileUIValidationError = errors.New("mobile UI validation error") // 75
MobileUIAppNotInForegroundError = errors.New("mobile UI app not in foreground error") // 76 MobileUIAssertForegroundAppError = errors.New("mobile UI assert foreground app error") // 76
MobileUIActivityNotMatchError = errors.New("mobile UI activity not match error") // 77 MobileUIAssertForegroundActivityError = errors.New("mobile UI assert foreground activity error") // 77
MobileUIPopupError = errors.New("mobile UI popup error") // 78 MobileUIPopupError = errors.New("mobile UI popup error") // 78
) )
// OCR related: [80, 90) // OCR related: [80, 90)
@@ -134,12 +134,12 @@ var errorsMap = map[error]int{
AndroidCaptureLogError: 66, AndroidCaptureLogError: 66,
// UI automation related // UI automation related
MobileUIDriverError: 70, MobileUIDriverError: 70,
MobileUILaunchAppError: 71, MobileUILaunchAppError: 71,
MobileUIValidationError: 75, MobileUIValidationError: 75,
MobileUIAppNotInForegroundError: 76, MobileUIAssertForegroundAppError: 76,
MobileUIActivityNotMatchError: 77, MobileUIAssertForegroundActivityError: 77,
MobileUIPopupError: 78, MobileUIPopupError: 78,
// OCR related // OCR related
OCREnvMissedError: 80, OCREnvMissedError: 80,

View File

@@ -427,7 +427,7 @@ func (ad *adbDriver) GetForegroundApp() (app AppInfo, err error) {
} }
} }
return AppInfo{}, errors.New("get foreground app failed") return AppInfo{}, errors.Wrap(code.MobileUIAssertForegroundAppError, "get foreground app failed")
} }
func (ad *adbDriver) AssertForegroundApp(packageName string, activityType ...string) error { func (ad *adbDriver) AssertForegroundApp(packageName string, activityType ...string) error {
@@ -447,20 +447,21 @@ func (ad *adbDriver) AssertForegroundApp(packageName string, activityType ...str
Interface("foreground_app", app.AppBaseInfo). Interface("foreground_app", app.AppBaseInfo).
Str("expected_package", packageName). Str("expected_package", packageName).
Msg("assert package failed") Msg("assert package failed")
return errors.Wrap(code.MobileUIAppNotInForegroundError, "assert package failed") return errors.Wrap(code.MobileUIAssertForegroundAppError,
"assert foreground package failed")
} }
// assert activity
if len(activityType) == 0 { if len(activityType) == 0 {
return nil return nil
} }
expectActivityType := activityType[0]
// assert activity
expectActivityType := activityType[0]
activities, ok := androidActivities[packageName] activities, ok := androidActivities[packageName]
if !ok { if !ok {
msg := fmt.Sprintf("activities not configured for package %s", packageName) msg := fmt.Sprintf("activities not configured for package %s", packageName)
log.Error().Msg(msg) log.Error().Msg(msg)
return errors.Wrap(code.MobileUIActivityNotMatchError, msg) return errors.Wrap(code.MobileUIAssertForegroundActivityError, msg)
} }
expectActivities, ok := activities[expectActivityType] expectActivities, ok := activities[expectActivityType]
@@ -468,24 +469,25 @@ func (ad *adbDriver) AssertForegroundApp(packageName string, activityType ...str
msg := fmt.Sprintf("activity type %s not configured for package %s", msg := fmt.Sprintf("activity type %s not configured for package %s",
expectActivityType, packageName) expectActivityType, packageName)
log.Error().Msg(msg) log.Error().Msg(msg)
return errors.Wrap(code.MobileUIActivityNotMatchError, msg) return errors.Wrap(code.MobileUIAssertForegroundActivityError, msg)
} }
// assertion // assertion
for _, expectActivity := range expectActivities { for _, expectActivity := range expectActivities {
if strings.HasSuffix(app.Activity, expectActivity) { if strings.HasSuffix(app.Activity, expectActivity) {
// assert success // assert activity success
return nil return nil
} }
} }
// assert failed // assert activity failed
log.Error(). log.Error().
Interface("foreground_app", app.AppBaseInfo). Interface("foreground_app", app.AppBaseInfo).
Str("expected_activity_type", expectActivityType). Str("expected_activity_type", expectActivityType).
Strs("expected_activities", expectActivities). Strs("expected_activities", expectActivities).
Msg("assert activity failed") Msg("assert activity failed")
return errors.Wrap(code.MobileUIActivityNotMatchError, "assert activity failed") return errors.Wrap(code.MobileUIAssertForegroundActivityError,
"assert foreground activity failed")
} }
var androidActivities = map[string]map[string][]string{ var androidActivities = map[string]map[string][]string{

View File

@@ -589,13 +589,19 @@ func runStepMobileUI(s *SessionRunner, step *TStep) (stepResult *StepResult, err
attachments := make(map[string]interface{}) attachments := make(map[string]interface{})
if err != nil { if err != nil {
attachments["error"] = err.Error() attachments["error"] = err.Error()
// save foreground app
if app, err1 := uiDriver.Driver.GetForegroundApp(); err1 == nil {
attachments["foreground_app"] = app.AppBaseInfo
} else {
log.Warn().Err(err1).Msg("save foreground app failed, ignore")
}
} }
// take screenshot after each step // take screenshot after each step
_, _, err := uiDriver.TakeScreenShot( if _, _, err2 := uiDriver.TakeScreenShot(
builtin.GenNameWithTimestamp("%d_step_") + step.Name) builtin.GenNameWithTimestamp("%d_step_") + step.Name); err2 != nil {
if err != nil { log.Error().Err(err2).Str("step", step.Name).Msg("take screenshot failed on step finished")
log.Error().Err(err).Str("step", step.Name).Msg("take screenshot failed on step finished")
} }
// save attachments // save attachments