feat: check android uiautomator server running

This commit is contained in:
lilong.129
2024-10-11 21:32:06 +08:00
parent 37cbfacc2d
commit f8da26776a
3 changed files with 31 additions and 30 deletions
+1 -1
View File
@@ -1 +1 @@
v5.0.0-beta-2410112057 v5.0.0-beta-2410112132
+8
View File
@@ -687,6 +687,14 @@ func (d *Device) IsPackageInstalled(packageName string) bool {
return builtin.Contains(packages, packageName) return builtin.Contains(packages, packageName)
} }
func (d *Device) IsPackageRunning(packageName string) bool {
output, err := d.RunShellCommand("pidof", packageName)
if err != nil {
return false
}
return strings.TrimSpace(output) != ""
}
func (d *Device) ScreenCap() ([]byte, error) { func (d *Device) ScreenCap() ([]byte, error) {
if d.HasFeature(FeatShellV2) { if d.HasFeature(FeatShellV2) {
return d.RunShellCommandV2WithBytes("screencap", "-p") return d.RunShellCommandV2WithBytes("screencap", "-p")
+22 -29
View File
@@ -36,9 +36,10 @@ var (
AdbServerPort = gadb.AdbServerPort // 5037 AdbServerPort = gadb.AdbServerPort // 5037
// uiautomator2 server // uiautomator2 server
UIA2ServerHost = "localhost" UIA2ServerHost = "localhost"
UIA2ServerPort = 6790 UIA2ServerPort = 6790
UIA2ServerPackageName = "io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner" UIA2ServerPackageName = "io.appium.uiautomator2.server"
UIA2ServerTestPackageName = "io.appium.uiautomator2.server.test"
EvalInstallerPackageName = "sogou.mobile.explorer" EvalInstallerPackageName = "sogou.mobile.explorer"
InstallViaInstallerCommand = "am start -S -n sogou.mobile.explorer/.PackageInstallerActivity -d" InstallViaInstallerCommand = "am start -S -n sogou.mobile.explorer/.PackageInstallerActivity -d"
@@ -81,12 +82,6 @@ func WithUIA2Port(port int) AndroidDeviceOption {
} }
} }
func WithUIA2Package(packageName string) AndroidDeviceOption {
return func(device *AndroidDevice) {
device.UIA2Package = packageName
}
}
func WithAdbLogOn(logOn bool) AndroidDeviceOption { func WithAdbLogOn(logOn bool) AndroidDeviceOption {
return func(device *AndroidDevice) { return func(device *AndroidDevice) {
device.LogOn = logOn device.LogOn = logOn
@@ -106,9 +101,6 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO
if dev.UIA2Port != 0 { if dev.UIA2Port != 0 {
deviceOptions = append(deviceOptions, WithUIA2Port(dev.UIA2Port)) deviceOptions = append(deviceOptions, WithUIA2Port(dev.UIA2Port))
} }
if dev.UIA2Package != "" {
deviceOptions = append(deviceOptions, WithUIA2Package(dev.UIA2Package))
}
if dev.LogOn { if dev.LogOn {
deviceOptions = append(deviceOptions, WithAdbLogOn(true)) deviceOptions = append(deviceOptions, WithAdbLogOn(true))
} }
@@ -117,9 +109,8 @@ func GetAndroidDeviceOptions(dev *AndroidDevice) (deviceOptions []AndroidDeviceO
func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, err error) { func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, err error) {
device = &AndroidDevice{ device = &AndroidDevice{
UIA2IP: UIA2ServerHost, UIA2IP: UIA2ServerHost,
UIA2Port: UIA2ServerPort, UIA2Port: UIA2ServerPort,
UIA2Package: UIA2ServerPackageName,
} }
for _, option := range options { for _, option := range options {
option(device) option(device)
@@ -198,7 +189,6 @@ type AndroidDevice struct {
UIA2 bool `json:"uia2,omitempty" yaml:"uia2,omitempty"` // use uiautomator2 UIA2 bool `json:"uia2,omitempty" yaml:"uia2,omitempty"` // use uiautomator2
UIA2IP string `json:"uia2_ip,omitempty" yaml:"uia2_ip,omitempty"` // uiautomator2 server ip UIA2IP string `json:"uia2_ip,omitempty" yaml:"uia2_ip,omitempty"` // uiautomator2 server ip
UIA2Port int `json:"uia2_port,omitempty" yaml:"uia2_port,omitempty"` // uiautomator2 server port UIA2Port int `json:"uia2_port,omitempty" yaml:"uia2_port,omitempty"` // uiautomator2 server port
UIA2Package string `json:"uia2_package,omitempty" yaml:"uia2_package,omitempty"`
LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"` LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"`
IgnorePopup bool `json:"ignore_popup,omitempty" yaml:"ignore_popup,omitempty"` IgnorePopup bool `json:"ignore_popup,omitempty" yaml:"ignore_popup,omitempty"`
} }
@@ -209,17 +199,20 @@ func (dev *AndroidDevice) Init() error {
if dev.UIA2 { if dev.UIA2 {
// uiautomator2 server must be started before // 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 // check uiautomator server package installed
if !dev.d.IsPackageInstalled(packageName) { if !dev.d.IsPackageInstalled(UIA2ServerPackageName) {
return errors.Wrap(code.MobileUIDriverAppNotInstalled, return errors.Wrapf(code.MobileUIDriverAppNotInstalled,
"uiautomator server package not installed") "%s not installed", UIA2ServerPackageName)
}
if !dev.d.IsPackageInstalled(UIA2ServerTestPackageName) {
return errors.Wrapf(code.MobileUIDriverAppNotInstalled,
"%s not installed", UIA2ServerTestPackageName)
}
// check uiautomator server package running
if dev.d.IsPackageRunning(UIA2ServerPackageName) {
return nil
} }
// start uiautomator2 server // start uiautomator2 server
@@ -552,12 +545,12 @@ func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) {
func (dev *AndroidDevice) startUIA2Server() error { func (dev *AndroidDevice) startUIA2Server() error {
const maxRetries = 3 const maxRetries = 3
for attempt := 1; attempt <= maxRetries; attempt++ { for attempt := 1; attempt <= maxRetries; attempt++ {
log.Info().Str("package", dev.UIA2Package). log.Info().Str("package", UIA2ServerTestPackageName).
Int("attempt", attempt).Msg("start uiautomator server") Int("attempt", attempt).Msg("start uiautomator server")
// $ adb shell am instrument -w $UIA2ServerPackageName // $ adb shell am instrument -w $UIA2ServerTestPackageName
// -w: wait for instrumentation to finish before returning. // -w: wait for instrumentation to finish before returning.
// Required for test runners. // Required for test runners.
out, err := dev.d.RunShellCommand("am", "instrument", "-w", dev.UIA2Package) out, err := dev.d.RunShellCommand("am", "instrument", "-w", UIA2ServerTestPackageName)
if err != nil { if err != nil {
return errors.Wrap(err, "start uiautomator server failed") return errors.Wrap(err, "start uiautomator server failed")
} }
@@ -571,7 +564,7 @@ func (dev *AndroidDevice) startUIA2Server() error {
} }
func (dev *AndroidDevice) stopUIA2Server() error { func (dev *AndroidDevice) stopUIA2Server() error {
_, err := dev.d.RunShellCommand("am", "force-stop", dev.UIA2Package) _, err := dev.d.RunShellCommand("am", "force-stop", UIA2ServerPackageName)
return err return err
} }