mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-07 15:31:23 +08:00
feat: check android uiautomator server package installed
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v5.0.0-beta-2410091557
|
v5.0.0-beta-2410112057
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user