feat: check android uiautomator server package installed

This commit is contained in:
lilong.129
2024-10-11 20:57:09 +08:00
parent 7506ebcb3b
commit 37cbfacc2d
6 changed files with 45 additions and 13 deletions

View File

@@ -77,6 +77,8 @@ var (
// UI automation related: [70, 80) // UI automation related: [70, 80)
var ( var (
MobileUIDriverAppNotInstalled = errors.New("mobile UI driver app not installed") // 68
MobileUIDriverAppCrashed = errors.New("mobile UI driver app crashed") // 69
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
MobileUITapError = errors.New("mobile UI tap error") // 72 MobileUITapError = errors.New("mobile UI tap error") // 72
@@ -168,6 +170,8 @@ var errorsMap = map[error]int{
DeviceUIResponseSlow: 67, DeviceUIResponseSlow: 67,
// UI automation related // UI automation related
MobileUIDriverAppNotInstalled: 68,
MobileUIDriverAppCrashed: 69,
MobileUIDriverError: 70, MobileUIDriverError: 70,
MobileUILaunchAppError: 71, MobileUILaunchAppError: 71,
MobileUITapError: 72, MobileUITapError: 72,

View File

@@ -1 +1 @@
v5.0.0-beta-2410091557 v5.0.0-beta-2410112057

View File

@@ -675,7 +675,7 @@ func (d *Device) ListPackages() ([]string, error) {
return packages, nil return packages, nil
} }
func (d *Device) IsPackagesInstalled(packageName string) bool { func (d *Device) IsPackageInstalled(packageName string) bool {
packages, err := d.ListPackages() packages, err := d.ListPackages()
if err != nil { if err != nil {
return false return false

View File

@@ -349,7 +349,7 @@ func TestDevice_ListPackages(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
t.Log(res) t.Log(res)
installed := dev.IsPackagesInstalled("io.appium.uiautomator2.server") installed := dev.IsPackageInstalled("io.appium.uiautomator2.server")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@@ -115,8 +115,6 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO
return return
} }
// uiautomator2 server must be started before
// adb shell am instrument -w $UIA2ServerPackageName
func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, err error) { func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, err error) {
device = &AndroidDevice{ device = &AndroidDevice{
UIA2IP: UIA2ServerHost, UIA2IP: UIA2ServerHost,
@@ -210,8 +208,26 @@ func (dev *AndroidDevice) Init() error {
dev.d.RunShellCommand("rm", "-r", env.DeviceActionLogFilePath) dev.d.RunShellCommand("rm", "-r", env.DeviceActionLogFilePath)
if dev.UIA2 { if dev.UIA2 {
// uiautomator2 server must be started before
var packageName string
if strings.Contains(dev.UIA2Package, "/") {
packageName = strings.Split(dev.UIA2Package, "/")[0]
} else {
packageName = dev.UIA2Package
}
// check uiautomator server package installed
if !dev.d.IsPackageInstalled(packageName) {
return errors.Wrap(code.MobileUIDriverAppNotInstalled,
"uiautomator server package not installed")
}
// start uiautomator2 server // start uiautomator2 server
go dev.startUIA2Server() go func() {
if err := dev.startUIA2Server(); err != nil {
log.Error().Err(err).Msg("start UIA2 failed")
}
}()
} }
return nil return nil
} }
@@ -378,7 +394,7 @@ func (dev *AndroidDevice) Install(appPath string, opts *InstallOptions) error {
case "vivo": case "vivo":
return dev.installVivoSilent(app, args...) return dev.installVivoSilent(app, args...)
case "oppo", "realme", "oneplus": case "oppo", "realme", "oneplus":
if dev.d.IsPackagesInstalled(EvalInstallerPackageName) { if dev.d.IsPackageInstalled(EvalInstallerPackageName) {
return dev.installViaInstaller(app, args...) return dev.installViaInstaller(app, args...)
} }
log.Warn().Msg("oppo not install eval installer") log.Warn().Msg("oppo not install eval installer")
@@ -534,13 +550,24 @@ func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) {
} }
func (dev *AndroidDevice) startUIA2Server() error { func (dev *AndroidDevice) startUIA2Server() error {
log.Info().Msgf("start uiautomator server %s", dev.UIA2Package) const maxRetries = 3
out, err := dev.d.RunShellCommand("am", "instrument", "-w", dev.UIA2Package) for attempt := 1; attempt <= maxRetries; attempt++ {
if strings.Contains(out, "Process crashed") { log.Info().Str("package", dev.UIA2Package).
log.Error().Msg("uiautomator server crashed, restart...") Int("attempt", attempt).Msg("start uiautomator server")
return dev.startUIA2Server() // $ adb shell am instrument -w $UIA2ServerPackageName
// -w: wait for instrumentation to finish before returning.
// Required for test runners.
out, err := dev.d.RunShellCommand("am", "instrument", "-w", dev.UIA2Package)
if err != nil {
return errors.Wrap(err, "start uiautomator server failed")
}
if strings.Contains(out, "Process crashed") {
log.Error().Msg("uiautomator server crashed, retrying...")
}
} }
return err
return errors.Wrapf(code.MobileUIDriverAppCrashed,
"uiautomator server crashed %d times", maxRetries)
} }
func (dev *AndroidDevice) stopUIA2Server() error { func (dev *AndroidDevice) stopUIA2Server() error {

View File

@@ -384,6 +384,7 @@ func TestDriver_AppLaunch(t *testing.T) {
func TestDriver_IsAppInForeground(t *testing.T) { func TestDriver_IsAppInForeground(t *testing.T) {
setupAndroidUIA2Driver(t) setupAndroidUIA2Driver(t)
// setupAndroidAdbDriver(t)
err := driverExt.Driver.AppLaunch("com.android.settings") err := driverExt.Driver.AppLaunch("com.android.settings")
checkErr(t, err) checkErr(t, err)