mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-05 15:37:35 +08:00
feat: check android uiautomator server running
This commit is contained in:
@@ -1 +1 @@
|
|||||||
v5.0.0-beta-2410112057
|
v5.0.0-beta-2410112132
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user