refactor: Device struct

This commit is contained in:
lilong.129
2025-02-10 20:45:28 +08:00
parent c6b0aefc56
commit 2d6e1fb5e4
11 changed files with 94 additions and 91 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ var rebootCmd = &cobra.Command{
if err != nil { if err != nil {
return err return err
} }
fmt.Printf("reboot %s success\n", device.UDID) fmt.Printf("reboot %s success\n", device.Options.UDID)
return nil return nil
}, },
} }
+3 -3
View File
@@ -121,7 +121,7 @@ func (c *TConfig) SetWebSocket(times, interval, timeout, size int64) *TConfig {
func (c *TConfig) SetIOS(opts ...option.IOSDeviceOption) *TConfig { func (c *TConfig) SetIOS(opts ...option.IOSDeviceOption) *TConfig {
iosOptions := option.NewIOSDeviceOptions(opts...) iosOptions := option.NewIOSDeviceOptions(opts...)
device := &uixt.IOSDevice{ device := &uixt.IOSDevice{
IOSDeviceOptions: iosOptions, Options: iosOptions,
} }
// each device can have its own settings // each device can have its own settings
@@ -142,7 +142,7 @@ func (c *TConfig) SetIOS(opts ...option.IOSDeviceOption) *TConfig {
func (c *TConfig) SetHarmony(opts ...option.HarmonyDeviceOption) *TConfig { func (c *TConfig) SetHarmony(opts ...option.HarmonyDeviceOption) *TConfig {
harmonyOptions := option.NewHarmonyDeviceOptions(opts...) harmonyOptions := option.NewHarmonyDeviceOptions(opts...)
device := &uixt.HarmonyDevice{ device := &uixt.HarmonyDevice{
HarmonyDeviceOptions: harmonyOptions, Options: harmonyOptions,
} }
// each device can have its own settings // each device can have its own settings
@@ -163,7 +163,7 @@ func (c *TConfig) SetHarmony(opts ...option.HarmonyDeviceOption) *TConfig {
func (c *TConfig) SetAndroid(opts ...option.AndroidDeviceOption) *TConfig { func (c *TConfig) SetAndroid(opts ...option.AndroidDeviceOption) *TConfig {
uiaOptions := option.NewAndroidDeviceOptions(opts...) uiaOptions := option.NewAndroidDeviceOptions(opts...)
device := &uixt.AndroidDevice{ device := &uixt.AndroidDevice{
AndroidDeviceOptions: uiaOptions, Options: uiaOptions,
} }
// each device can have its own settings // each device can have its own settings
+1 -1
View File
@@ -1 +1 @@
v5.0.0+2502101959 v5.0.0+2502102045
+35 -34
View File
@@ -80,45 +80,45 @@ func NewAndroidDevice(opts ...option.AndroidDeviceOption) (device *AndroidDevice
} }
device = &AndroidDevice{ device = &AndroidDevice{
Device: gadbDevice, Device: gadbDevice,
AndroidDeviceOptions: androidOptions, Options: androidOptions,
Logcat: NewAdbLogcat(androidOptions.SerialNumber), Logcat: NewAdbLogcat(androidOptions.SerialNumber),
} }
log.Info().Str("serial", device.SerialNumber).Msg("init android device") log.Info().Str("serial", device.Options.SerialNumber).Msg("init android device")
return device, nil return device, nil
} }
type AndroidDevice struct { type AndroidDevice struct {
*gadb.Device *gadb.Device
*option.AndroidDeviceOptions Options *option.AndroidDeviceOptions
Logcat *AdbLogcat Logcat *AdbLogcat
} }
func (dev *AndroidDevice) Setup() error { func (dev *AndroidDevice) Setup() error {
dev.RunShellCommand("ime", "enable", option.UnicodeImePackageName) dev.Device.RunShellCommand("ime", "enable", option.UnicodeImePackageName)
dev.RunShellCommand("rm", "-r", config.DeviceActionLogFilePath) dev.Device.RunShellCommand("rm", "-r", config.DeviceActionLogFilePath)
// setup evalite // setup evalite
evalToolRaw, err := evalite.ReadFile("evalite") evalToolRaw, err := evalite.ReadFile("evalite")
if err != nil { if err != nil {
return errors.Wrap(code.LoadFileError, err.Error()) return errors.Wrap(code.LoadFileError, err.Error())
} }
err = dev.Push(bytes.NewReader(evalToolRaw), "/data/local/tmp/evalite", time.Now()) err = dev.Device.Push(bytes.NewReader(evalToolRaw), "/data/local/tmp/evalite", time.Now())
if err != nil { if err != nil {
return errors.Wrap(code.DeviceShellExecError, err.Error()) return errors.Wrap(code.DeviceShellExecError, err.Error())
} }
if dev.UIA2 { if dev.Options.UIA2 {
// uiautomator2 server must be started before // uiautomator2 server must be started before
// check uiautomator server package installed // check uiautomator server package installed
if !dev.IsPackageInstalled(dev.UIA2ServerPackageName) { if !dev.Device.IsPackageInstalled(dev.Options.UIA2ServerPackageName) {
return errors.Wrapf(code.MobileUIDriverAppNotInstalled, return errors.Wrapf(code.MobileUIDriverAppNotInstalled,
"%s not installed", dev.UIA2ServerPackageName) "%s not installed", dev.Options.UIA2ServerPackageName)
} }
if !dev.IsPackageInstalled(dev.UIA2ServerTestPackageName) { if !dev.Device.IsPackageInstalled(dev.Options.UIA2ServerTestPackageName) {
return errors.Wrapf(code.MobileUIDriverAppNotInstalled, return errors.Wrapf(code.MobileUIDriverAppNotInstalled,
"%s not installed", dev.UIA2ServerTestPackageName) "%s not installed", dev.Options.UIA2ServerTestPackageName)
} }
// TODO: check uiautomator server package running // TODO: check uiautomator server package running
@@ -142,16 +142,16 @@ func (dev *AndroidDevice) Teardown() error {
} }
func (dev *AndroidDevice) UUID() string { func (dev *AndroidDevice) UUID() string {
return dev.SerialNumber return dev.Options.SerialNumber
} }
func (dev *AndroidDevice) LogEnabled() bool { func (dev *AndroidDevice) LogEnabled() bool {
return dev.LogOn return dev.Options.LogOn
} }
func (dev *AndroidDevice) NewDriver() (driverExt IDriverExt, err error) { func (dev *AndroidDevice) NewDriver() (driverExt IDriverExt, err error) {
var driver IDriver var driver IDriver
if dev.UIA2 || dev.LogOn { if dev.Options.UIA2 || dev.Options.LogOn {
driver, err = NewUIA2Driver(dev) driver, err = NewUIA2Driver(dev)
} else { } else {
driver, err = NewADBDriver(dev) driver, err = NewADBDriver(dev)
@@ -160,7 +160,7 @@ func (dev *AndroidDevice) NewDriver() (driverExt IDriverExt, err error) {
return nil, errors.Wrap(err, "failed to init UIA driver") return nil, errors.Wrap(err, "failed to init UIA driver")
} }
if dev.LogOn { if dev.Options.LogOn {
err = driver.StartCaptureLog("hrp_adb_log") err = driver.StartCaptureLog("hrp_adb_log")
if err != nil { if err != nil {
return nil, err return nil, err
@@ -200,7 +200,7 @@ func (dev *AndroidDevice) StopPcap() string {
func (dev *AndroidDevice) Install(apkPath string, opts ...option.InstallOption) error { func (dev *AndroidDevice) Install(apkPath string, opts ...option.InstallOption) error {
installOpts := option.NewInstallOptions(opts...) installOpts := option.NewInstallOptions(opts...)
brand, err := dev.Brand() brand, err := dev.Device.Brand()
if err != nil { if err != nil {
return err return err
} }
@@ -218,7 +218,7 @@ func (dev *AndroidDevice) Install(apkPath string, opts ...option.InstallOption)
case "vivo": case "vivo":
return dev.installVivoSilent(apkPath, args...) return dev.installVivoSilent(apkPath, args...)
case "oppo", "realme", "oneplus": case "oppo", "realme", "oneplus":
if dev.IsPackageInstalled(EvalInstallerPackageName) { if dev.Device.IsPackageInstalled(EvalInstallerPackageName) {
return dev.installViaInstaller(apkPath, args...) return dev.installViaInstaller(apkPath, args...)
} }
log.Warn().Msg("oppo not install eval installer") log.Warn().Msg("oppo not install eval installer")
@@ -236,13 +236,13 @@ func (dev *AndroidDevice) installVivoSilent(apkPath string, args ...string) erro
verifyCode = verifyCode[:8] verifyCode = verifyCode[:8]
verifyCode = "-V" + verifyCode verifyCode = "-V" + verifyCode
args = append([]string{verifyCode}, args...) args = append([]string{verifyCode}, args...)
_, err := dev.InstallAPK(apkPath, args...) _, err := dev.Device.InstallAPK(apkPath, args...)
return err return err
} }
func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) error { func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) error {
appRemotePath := "/data/local/tmp/" + strconv.FormatInt(time.Now().UnixMilli(), 10) + ".apk" appRemotePath := "/data/local/tmp/" + strconv.FormatInt(time.Now().UnixMilli(), 10) + ".apk"
err := dev.PushFile(apkPath, appRemotePath, time.Now()) err := dev.Device.PushFile(apkPath, appRemotePath, time.Now())
if err != nil { if err != nil {
return err return err
} }
@@ -250,7 +250,7 @@ func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) er
defer func() { defer func() {
close(done) close(done)
}() }()
logcat := NewAdbLogcatWithCallback(dev.Serial(), func(line string) { logcat := NewAdbLogcatWithCallback(dev.Device.Serial(), func(line string) {
re := regexp.MustCompile(`\{.*?}`) re := regexp.MustCompile(`\{.*?}`)
match := re.FindString(line) match := re.FindString(line)
if match == "" { if match == "" {
@@ -280,7 +280,7 @@ func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) er
// 需要监听是否完成安装 // 需要监听是否完成安装
command := strings.Split(InstallViaInstallerCommand, " ") command := strings.Split(InstallViaInstallerCommand, " ")
args = append(command, appRemotePath) args = append(command, appRemotePath)
_, err = dev.RunShellCommand("am", args[1:]...) _, err = dev.Device.RunShellCommand("am", args[1:]...)
if err != nil { if err != nil {
return err return err
} }
@@ -295,18 +295,18 @@ func (dev *AndroidDevice) installViaInstaller(apkPath string, args ...string) er
} }
func (dev *AndroidDevice) installCommon(apkPath string, args ...string) error { func (dev *AndroidDevice) installCommon(apkPath string, args ...string) error {
_, err := dev.InstallAPK(apkPath, args...) _, err := dev.Device.InstallAPK(apkPath, args...)
return err return err
} }
func (dev *AndroidDevice) Uninstall(packageName string) error { func (dev *AndroidDevice) Uninstall(packageName string) error {
_, err := dev.RunShellCommand("uninstall", packageName) _, err := dev.Device.RunShellCommand("uninstall", packageName)
return err return err
} }
func (dev *AndroidDevice) GetCurrentWindow() (windowInfo types.WindowInfo, err error) { func (dev *AndroidDevice) GetCurrentWindow() (windowInfo types.WindowInfo, err error) {
// adb shell dumpsys window | grep -E 'mCurrentFocus|mFocusedApp' // adb shell dumpsys window | grep -E 'mCurrentFocus|mFocusedApp'
output, err := dev.RunShellCommand("dumpsys", "window", "|", "grep", "-E", "'mCurrentFocus|mFocusedApp'") output, err := dev.Device.RunShellCommand("dumpsys", "window", "|", "grep", "-E", "'mCurrentFocus|mFocusedApp'")
if err != nil { if err != nil {
return types.WindowInfo{}, errors.Wrap(err, "get current window failed") return types.WindowInfo{}, errors.Wrap(err, "get current window failed")
} }
@@ -332,7 +332,7 @@ func (dev *AndroidDevice) GetCurrentWindow() (windowInfo types.WindowInfo, err e
} }
// adb shell dumpsys activity activities | grep mResumedActivity // adb shell dumpsys activity activities | grep mResumedActivity
output, err = dev.RunShellCommand("dumpsys", "activity", "activities", "|", "grep", "mResumedActivity") output, err = dev.Device.RunShellCommand("dumpsys", "activity", "activities", "|", "grep", "mResumedActivity")
if err != nil { if err != nil {
return types.WindowInfo{}, errors.Wrap(err, "get current activity failed") return types.WindowInfo{}, errors.Wrap(err, "get current activity failed")
} }
@@ -386,7 +386,7 @@ func (dev *AndroidDevice) GetPackageInfo(packageName string) (types.AppInfo, err
} }
func (dev *AndroidDevice) getPackageVersion(packageName string) (string, error) { func (dev *AndroidDevice) getPackageVersion(packageName string) (string, error) {
output, err := dev.RunShellCommand("dumpsys", "package", packageName, "|", "grep", "versionName") output, err := dev.Device.RunShellCommand("dumpsys", "package", packageName, "|", "grep", "versionName")
if err != nil { if err != nil {
return "", errors.Wrap(err, "get package version failed") return "", errors.Wrap(err, "get package version failed")
} }
@@ -401,7 +401,7 @@ func (dev *AndroidDevice) getPackageVersion(packageName string) (string, error)
} }
func (dev *AndroidDevice) getPackagePath(packageName string) (string, error) { func (dev *AndroidDevice) getPackagePath(packageName string) (string, error) {
output, err := dev.RunShellCommand("pm", "path", packageName) output, err := dev.Device.RunShellCommand("pm", "path", packageName)
if err != nil { if err != nil {
return "", errors.Wrap(err, "get package path failed") return "", errors.Wrap(err, "get package path failed")
} }
@@ -414,7 +414,7 @@ func (dev *AndroidDevice) getPackagePath(packageName string) (string, error) {
} }
func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) { func (dev *AndroidDevice) getPackageMD5(packagePath string) (string, error) {
output, err := dev.RunShellCommand("md5sum", packagePath) output, err := dev.Device.RunShellCommand("md5sum", packagePath)
if err != nil { if err != nil {
return "", errors.Wrap(err, "get package md5 failed") return "", errors.Wrap(err, "get package md5 failed")
} }
@@ -428,12 +428,13 @@ 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.UIA2ServerTestPackageName). log.Info().Str("package", dev.Options.UIA2ServerTestPackageName).
Int("attempt", attempt).Msg("start uiautomator server") Int("attempt", attempt).Msg("start uiautomator server")
// $ adb shell am instrument -w $UIA2ServerTestPackageName // $ 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.RunShellCommand("am", "instrument", "-w", dev.UIA2ServerTestPackageName) out, err := dev.Device.RunShellCommand("am", "instrument", "-w",
dev.Options.UIA2ServerTestPackageName)
if err != nil { if err != nil {
return errors.Wrap(err, "start uiautomator server failed") return errors.Wrap(err, "start uiautomator server failed")
} }
@@ -447,7 +448,7 @@ func (dev *AndroidDevice) startUIA2Server() error {
} }
func (dev *AndroidDevice) stopUIA2Server() error { func (dev *AndroidDevice) stopUIA2Server() error {
_, err := dev.RunShellCommand("am", "force-stop", dev.UIA2ServerPackageName) _, err := dev.Device.RunShellCommand("am", "force-stop", dev.Options.UIA2ServerPackageName)
return err return err
} }
+7 -4
View File
@@ -21,18 +21,21 @@ import (
func NewUIA2Driver(device *AndroidDevice) (*UIA2Driver, error) { func NewUIA2Driver(device *AndroidDevice) (*UIA2Driver, error) {
log.Info().Interface("device", device).Msg("init android UIA2 driver") log.Info().Interface("device", device).Msg("init android UIA2 driver")
localPort, err := device.Forward(device.UIA2Port) localPort, err := device.Device.Forward(device.Options.UIA2Port)
if err != nil { if err != nil {
return nil, errors.Wrap(code.DeviceConnectionError, return nil, errors.Wrap(code.DeviceConnectionError,
fmt.Sprintf("forward port %d->%d failed: %v", fmt.Sprintf("forward port %d->%d failed: %v",
localPort, device.UIA2Port, err)) localPort, device.Options.UIA2Port, err))
}
driver := &UIA2Driver{
ADBDriver: &ADBDriver{
AndroidDevice: device,
},
} }
driver := new(UIA2Driver)
err = driver.Session.InitConnection(localPort) err = driver.Session.InitConnection(localPort)
if err != nil { if err != nil {
return nil, err return nil, err
} }
driver.Device = device.Device
driver.Logcat = device.Logcat driver.Logcat = device.Logcat
err = driver.InitSession(nil) err = driver.InitSession(nil)
+4 -4
View File
@@ -18,8 +18,8 @@ var driverExt IDriverExt
func setupAndroidAdbDriver(t *testing.T) { func setupAndroidAdbDriver(t *testing.T) {
device, err := NewAndroidDevice() device, err := NewAndroidDevice()
checkErr(t, err) checkErr(t, err)
device.UIA2 = false device.Options.UIA2 = false
device.LogOn = false device.Options.LogOn = false
driverExt, err = device.NewDriver() driverExt, err = device.NewDriver()
checkErr(t, err) checkErr(t, err)
} }
@@ -27,8 +27,8 @@ func setupAndroidAdbDriver(t *testing.T) {
func setupAndroidUIA2Driver(t *testing.T) { func setupAndroidUIA2Driver(t *testing.T) {
device, err := NewAndroidDevice() device, err := NewAndroidDevice()
checkErr(t, err) checkErr(t, err)
device.UIA2 = true device.Options.UIA2 = true
device.LogOn = false device.Options.LogOn = false
driverExt, err = device.NewDriver() driverExt, err = device.NewDriver()
checkErr(t, err) checkErr(t, err)
} }
@@ -22,7 +22,7 @@ const (
) )
func NewShootsAndroidDriver(device *uixt.AndroidDevice) (driver *ShootsAndroidDriver, err error) { func NewShootsAndroidDriver(device *uixt.AndroidDevice) (driver *ShootsAndroidDriver, err error) {
socketLocalPort, err := device.Forward(shootsSocketName) socketLocalPort, err := device.Device.Forward(shootsSocketName)
if err != nil { if err != nil {
return nil, errors.Wrap(code.DeviceConnectionError, return nil, errors.Wrap(code.DeviceConnectionError,
fmt.Sprintf("forward port %d->%s failed: %v", fmt.Sprintf("forward port %d->%s failed: %v",
@@ -40,7 +40,7 @@ func NewShootsAndroidDriver(device *uixt.AndroidDevice) (driver *ShootsAndroidDr
} }
driver.InitSession(nil) driver.InitSession(nil)
serverLocalPort, err := device.Forward(douyinServerPort) serverLocalPort, err := device.Device.Forward(douyinServerPort)
if err != nil { if err != nil {
return nil, errors.Wrap(code.DeviceConnectionError, return nil, errors.Wrap(code.DeviceConnectionError,
fmt.Sprintf("forward port %d->%d failed: %v", fmt.Sprintf("forward port %d->%d failed: %v",
+6 -6
View File
@@ -13,7 +13,7 @@ import (
type HarmonyDevice struct { type HarmonyDevice struct {
*ghdc.Device *ghdc.Device
*option.HarmonyDeviceOptions Options *option.HarmonyDeviceOptions
} }
func NewHarmonyDevice(opts ...option.HarmonyDeviceOption) (device *HarmonyDevice, err error) { func NewHarmonyDevice(opts ...option.HarmonyDeviceOption) (device *HarmonyDevice, err error) {
@@ -58,10 +58,10 @@ func NewHarmonyDevice(opts ...option.HarmonyDeviceOption) (device *HarmonyDevice
} }
device = &HarmonyDevice{ device = &HarmonyDevice{
HarmonyDeviceOptions: deviceConfig, Options: deviceConfig,
Device: harmonyDevice, Device: harmonyDevice,
} }
log.Info().Str("connectKey", device.ConnectKey).Msg("init harmony device") log.Info().Str("connectKey", device.Options.ConnectKey).Msg("init harmony device")
return device, nil return device, nil
} }
@@ -74,11 +74,11 @@ func (dev *HarmonyDevice) Teardown() error {
} }
func (dev *HarmonyDevice) UUID() string { func (dev *HarmonyDevice) UUID() string {
return dev.ConnectKey return dev.Options.ConnectKey
} }
func (dev *HarmonyDevice) LogEnabled() bool { func (dev *HarmonyDevice) LogEnabled() bool {
return dev.LogOn return dev.Options.LogOn
} }
func (dev *HarmonyDevice) Install(appPath string, opts ...option.InstallOption) error { func (dev *HarmonyDevice) Install(appPath string, opts ...option.InstallOption) error {
-1
View File
@@ -18,7 +18,6 @@ import (
type HDCDriver struct { type HDCDriver struct {
*HarmonyDevice *HarmonyDevice
*Session *Session
IDriver
*DriverExt *DriverExt
points []ExportPoint points []ExportPoint
uiDriver *ghdc.UIDriver uiDriver *ghdc.UIDriver
+29 -29
View File
@@ -127,11 +127,11 @@ func NewIOSDevice(opts ...option.IOSDeviceOption) (device *IOSDevice, err error)
} }
device = &IOSDevice{ device = &IOSDevice{
IOSDeviceOptions: deviceOptions, DeviceEntry: dev,
listeners: make(map[int]*forward.ConnListener), Options: deviceOptions,
d: dev, listeners: make(map[int]*forward.ConnListener),
} }
log.Info().Str("udid", device.UDID).Msg("init ios device") log.Info().Str("udid", device.Options.UDID).Msg("init ios device")
err = device.Setup() err = device.Setup()
if err != nil { if err != nil {
_ = device.Teardown() _ = device.Teardown()
@@ -141,8 +141,8 @@ func NewIOSDevice(opts ...option.IOSDeviceOption) (device *IOSDevice, err error)
} }
type IOSDevice struct { type IOSDevice struct {
*option.IOSDeviceOptions ios.DeviceEntry
d ios.DeviceEntry Options *option.IOSDeviceOptions
listeners map[int]*forward.ConnListener listeners map[int]*forward.ConnListener
} }
@@ -202,11 +202,11 @@ func (dev *IOSDevice) Teardown() error {
} }
func (dev *IOSDevice) UUID() string { func (dev *IOSDevice) UUID() string {
return dev.UDID return dev.Options.UDID
} }
func (dev *IOSDevice) LogEnabled() bool { func (dev *IOSDevice) LogEnabled() bool {
return dev.LogOn return dev.Options.LogOn
} }
func (dev *IOSDevice) getAppInfo(packageName string) (appInfo types.AppInfo, err error) { func (dev *IOSDevice) getAppInfo(packageName string) (appInfo types.AppInfo, err error) {
@@ -233,22 +233,22 @@ func (dev *IOSDevice) NewDriver() (driverExt IDriverExt, err error) {
return nil, errors.Wrap(err, "failed to init WDA driver") return nil, errors.Wrap(err, "failed to init WDA driver")
} }
settings, err := driver.SetAppiumSettings(map[string]interface{}{ settings, err := driver.SetAppiumSettings(map[string]interface{}{
"snapshotMaxDepth": dev.SnapshotMaxDepth, "snapshotMaxDepth": dev.Options.SnapshotMaxDepth,
"acceptAlertButtonSelector": dev.AcceptAlertButtonSelector, "acceptAlertButtonSelector": dev.Options.AcceptAlertButtonSelector,
}) })
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to set appium WDA settings") return nil, errors.Wrap(err, "failed to set appium WDA settings")
} }
log.Info().Interface("appiumWDASettings", settings).Msg("set appium WDA settings") log.Info().Interface("appiumWDASettings", settings).Msg("set appium WDA settings")
if dev.ResetHomeOnStartup { if dev.Options.ResetHomeOnStartup {
log.Info().Msg("go back to home screen") log.Info().Msg("go back to home screen")
if err = driver.Homescreen(); err != nil { if err = driver.Homescreen(); err != nil {
return nil, errors.Wrap(code.MobileUIDriverError, return nil, errors.Wrap(code.MobileUIDriverError,
fmt.Sprintf("go back to home screen failed: %v", err)) fmt.Sprintf("go back to home screen failed: %v", err))
} }
} }
if dev.LogOn { if dev.Options.LogOn {
err = driver.StartCaptureLog("hrp_wda_log") err = driver.StartCaptureLog("hrp_wda_log")
if err != nil { if err != nil {
return nil, err return nil, err
@@ -272,7 +272,7 @@ func (dev *IOSDevice) Install(appPath string, opts ...option.InstallOption) (err
installOpts := option.NewInstallOptions(opts...) installOpts := option.NewInstallOptions(opts...)
for i := 0; i <= installOpts.RetryTimes; i++ { for i := 0; i <= installOpts.RetryTimes; i++ {
var conn *zipconduit.Connection var conn *zipconduit.Connection
conn, err = zipconduit.New(dev.d) conn, err = zipconduit.New(dev.DeviceEntry)
if err != nil { if err != nil {
return err return err
} }
@@ -289,7 +289,7 @@ func (dev *IOSDevice) Install(appPath string, opts ...option.InstallOption) (err
} }
func (dev *IOSDevice) Uninstall(bundleId string) error { func (dev *IOSDevice) Uninstall(bundleId string) error {
svc, err := installationproxy.New(dev.d) svc, err := installationproxy.New(dev.DeviceEntry)
if err != nil { if err != nil {
return err return err
} }
@@ -306,7 +306,7 @@ func (dev *IOSDevice) Forward(localPort, remotePort int) error {
log.Warn().Msg(fmt.Sprintf("local port :%d is already in use", localPort)) log.Warn().Msg(fmt.Sprintf("local port :%d is already in use", localPort))
_ = dev.listeners[localPort].Close() _ = dev.listeners[localPort].Close()
} }
listener, err := forward.Forward(dev.d, uint16(localPort), uint16(remotePort)) listener, err := forward.Forward(dev.DeviceEntry, uint16(localPort), uint16(remotePort))
if err != nil { if err != nil {
log.Error().Err(err).Msg(fmt.Sprintf("failed to forward %d to %d", localPort, remotePort)) log.Error().Err(err).Msg(fmt.Sprintf("failed to forward %d to %d", localPort, remotePort))
return err return err
@@ -316,7 +316,7 @@ func (dev *IOSDevice) Forward(localPort, remotePort int) error {
} }
func (dev *IOSDevice) GetDeviceInfo() (*DeviceDetail, error) { func (dev *IOSDevice) GetDeviceInfo() (*DeviceDetail, error) {
deviceInfo, err := deviceinfo.NewDeviceInfo(dev.d) deviceInfo, err := deviceinfo.NewDeviceInfo(dev.DeviceEntry)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to get device info") log.Error().Err(err).Msg("failed to get device info")
return nil, err return nil, err
@@ -343,7 +343,7 @@ func (dev *IOSDevice) GetDeviceInfo() (*DeviceDetail, error) {
} }
func (dev *IOSDevice) ListApps(appType ApplicationType) (apps []installationproxy.AppInfo, err error) { func (dev *IOSDevice) ListApps(appType ApplicationType) (apps []installationproxy.AppInfo, err error) {
svc, _ := installationproxy.New(dev.d) svc, _ := installationproxy.New(dev.DeviceEntry)
defer svc.Close() defer svc.Close()
switch appType { switch appType {
case ApplicationTypeSystem: case ApplicationTypeSystem:
@@ -363,7 +363,7 @@ func (dev *IOSDevice) ListApps(appType ApplicationType) (apps []installationprox
} }
func (dev *IOSDevice) GetAppInfo(packageName string) (appInfo installationproxy.AppInfo, err error) { func (dev *IOSDevice) GetAppInfo(packageName string) (appInfo installationproxy.AppInfo, err error) {
svc, _ := installationproxy.New(dev.d) svc, _ := installationproxy.New(dev.DeviceEntry)
defer svc.Close() defer svc.Close()
apps, err := svc.BrowseAllApps() apps, err := svc.BrowseAllApps()
if err != nil { if err != nil {
@@ -379,7 +379,7 @@ func (dev *IOSDevice) GetAppInfo(packageName string) (appInfo installationproxy.
} }
func (dev *IOSDevice) ListImages() (images []string, err error) { func (dev *IOSDevice) ListImages() (images []string, err error) {
conn, err := imagemounter.NewImageMounter(dev.d) conn, err := imagemounter.NewImageMounter(dev.DeviceEntry)
if err != nil { if err != nil {
return nil, errors.Wrap(code.DeviceConnectionError, err.Error()) return nil, errors.Wrap(code.DeviceConnectionError, err.Error())
} }
@@ -397,7 +397,7 @@ func (dev *IOSDevice) ListImages() (images []string, err error) {
func (dev *IOSDevice) MountImage(imagePath string) (err error) { func (dev *IOSDevice) MountImage(imagePath string) (err error) {
log.Info().Str("imagePath", imagePath).Msg("mount ios developer image") log.Info().Str("imagePath", imagePath).Msg("mount ios developer image")
conn, err := imagemounter.NewImageMounter(dev.d) conn, err := imagemounter.NewImageMounter(dev.DeviceEntry)
if err != nil { if err != nil {
return errors.Wrap(code.DeviceConnectionError, err.Error()) return errors.Wrap(code.DeviceConnectionError, err.Error())
} }
@@ -414,7 +414,7 @@ func (dev *IOSDevice) MountImage(imagePath string) (err error) {
func (dev *IOSDevice) AutoMountImage(baseDir string) (err error) { func (dev *IOSDevice) AutoMountImage(baseDir string) (err error) {
log.Info().Str("baseDir", baseDir).Msg("auto mount ios developer image") log.Info().Str("baseDir", baseDir).Msg("auto mount ios developer image")
imagePath, err := imagemounter.DownloadImageFor(dev.d, baseDir) imagePath, err := imagemounter.DownloadImageFor(dev.DeviceEntry, baseDir)
if err != nil { if err != nil {
return errors.Wrapf(code.DeviceConnectionError, return errors.Wrapf(code.DeviceConnectionError,
"download ios developer image failed: %v", err) "download ios developer image failed: %v", err)
@@ -432,7 +432,7 @@ func (dev *IOSDevice) RunXCTest(ctx context.Context, bundleID, testRunnerBundleI
BundleId: bundleID, BundleId: bundleID,
TestRunnerBundleId: testRunnerBundleID, TestRunnerBundleId: testRunnerBundleID,
XctestConfigName: xctestConfig, XctestConfigName: xctestConfig,
Device: dev.d, Device: dev.DeviceEntry,
Listener: listener, Listener: listener,
} }
_, err = testmanagerd.RunTestWithConfig(ctx, config) _, err = testmanagerd.RunTestWithConfig(ctx, config)
@@ -455,7 +455,7 @@ func (dev *IOSDevice) RunXCTestDaemon(ctx context.Context, bundleID, testRunnerB
} }
func (dev *IOSDevice) getVersion() (version *semver.Version, err error) { func (dev *IOSDevice) getVersion() (version *semver.Version, err error) {
version, err = ios.GetProductVersion(dev.d) version, err = ios.GetProductVersion(dev.DeviceEntry)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to get version") log.Error().Err(err).Msg("failed to get version")
return nil, err return nil, err
@@ -465,7 +465,7 @@ func (dev *IOSDevice) getVersion() (version *semver.Version, err error) {
} }
func (dev *IOSDevice) ListProcess(applicationsOnly bool) (processList []instruments.ProcessInfo, err error) { func (dev *IOSDevice) ListProcess(applicationsOnly bool) (processList []instruments.ProcessInfo, err error) {
service, err := instruments.NewDeviceInfoService(dev.d) service, err := instruments.NewDeviceInfoService(dev.DeviceEntry)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to list process") log.Error().Err(err).Msg("failed to list process")
return return
@@ -485,7 +485,7 @@ func (dev *IOSDevice) ListProcess(applicationsOnly bool) (processList []instrume
} }
func (dev *IOSDevice) Reboot() error { func (dev *IOSDevice) Reboot() error {
err := diagnostics.Reboot(dev.d) err := diagnostics.Reboot(dev.DeviceEntry)
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to reboot device") log.Error().Err(err).Msg("failed to reboot device")
return err return err
@@ -503,7 +503,7 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities option.Capabilities) (driver ID
return nil, errors.Wrap(code.DeviceHTTPDriverError, return nil, errors.Wrap(code.DeviceHTTPDriverError,
fmt.Sprintf("get free port failed: %v", err)) fmt.Sprintf("get free port failed: %v", err))
} }
if err = dev.Forward(localPort, dev.WDAPort); err != nil { if err = dev.Forward(localPort, dev.Options.WDAPort); err != nil {
return nil, errors.Wrap(code.DeviceHTTPDriverError, return nil, errors.Wrap(code.DeviceHTTPDriverError,
fmt.Sprintf("forward tcp port failed: %v", err)) fmt.Sprintf("forward tcp port failed: %v", err))
} }
@@ -519,7 +519,7 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities option.Capabilities) (driver ID
return nil, errors.Wrap(code.DeviceHTTPDriverError, return nil, errors.Wrap(code.DeviceHTTPDriverError,
fmt.Sprintf("get free port failed: %v", err)) fmt.Sprintf("get free port failed: %v", err))
} }
if err = dev.Forward(localMjpegPort, dev.WDAMjpegPort); err != nil { if err = dev.Forward(localMjpegPort, dev.Options.WDAMjpegPort); err != nil {
return nil, errors.Wrap(code.DeviceHTTPDriverError, return nil, errors.Wrap(code.DeviceHTTPDriverError,
fmt.Sprintf("forward tcp port failed: %v", err)) fmt.Sprintf("forward tcp port failed: %v", err))
} }
@@ -534,7 +534,7 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities option.Capabilities) (driver ID
wd := new(WDADriver) wd := new(WDADriver)
wd.IOSDevice = dev wd.IOSDevice = dev
wd.udid = dev.UDID wd.udid = dev.Options.UDID
wd.client = &http.Client{ wd.client = &http.Client{
Timeout: time.Second * 10, // 设置超时时间为 10 秒 Timeout: time.Second * 10, // 设置超时时间为 10 秒
} }
@@ -566,7 +566,7 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities option.Capabilities) (driver ID
} }
func (dev *IOSDevice) GetPackageInfo(packageName string) (types.AppInfo, error) { func (dev *IOSDevice) GetPackageInfo(packageName string) (types.AppInfo, error) {
svc, err := installationproxy.New(dev.d) svc, err := installationproxy.New(dev.DeviceEntry)
if err != nil { if err != nil {
return types.AppInfo{}, errors.Wrap(code.DeviceGetInfoError, err.Error()) return types.AppInfo{}, errors.Wrap(code.DeviceGetInfoError, err.Error())
} }
+6 -6
View File
@@ -423,7 +423,7 @@ func (r *CaseRunner) parseConfig() (parsedConfig *TConfig, err error) {
return nil, errors.Wrap(code.InvalidCaseError, return nil, errors.Wrap(code.InvalidCaseError,
fmt.Sprintf("parse android config failed: %v", err)) fmt.Sprintf("parse android config failed: %v", err))
} }
device, err := uixt.NewAndroidDevice(androidDevice.Options()...) device, err := uixt.NewAndroidDevice(androidDevice.Options.Options()...)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "init android device failed") return nil, errors.Wrap(err, "init android device failed")
} }
@@ -435,7 +435,7 @@ func (r *CaseRunner) parseConfig() (parsedConfig *TConfig, err error) {
return nil, errors.Wrap(err, "init android driver failed") return nil, errors.Wrap(err, "init android driver failed")
} }
r.uixtDrivers[androidDevice.SerialNumber] = driverExt r.uixtDrivers[androidDevice.Options.SerialNumber] = driverExt
} }
// parse iOS devices config // parse iOS devices config
for _, iosDevice := range parsedConfig.IOS { for _, iosDevice := range parsedConfig.IOS {
@@ -445,7 +445,7 @@ func (r *CaseRunner) parseConfig() (parsedConfig *TConfig, err error) {
fmt.Sprintf("parse ios config failed: %v", err)) fmt.Sprintf("parse ios config failed: %v", err))
} }
device, err := uixt.NewIOSDevice(iosDevice.Options()...) device, err := uixt.NewIOSDevice(iosDevice.Options.Options()...)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "init ios device failed") return nil, errors.Wrap(err, "init ios device failed")
} }
@@ -457,7 +457,7 @@ func (r *CaseRunner) parseConfig() (parsedConfig *TConfig, err error) {
return nil, errors.Wrap(err, "init ios driver failed") return nil, errors.Wrap(err, "init ios driver failed")
} }
r.uixtDrivers[iosDevice.UDID] = driverExt r.uixtDrivers[iosDevice.Options.UDID] = driverExt
} }
// parse harmony devices config // parse harmony devices config
for _, harmonyDevice := range parsedConfig.Harmony { for _, harmonyDevice := range parsedConfig.Harmony {
@@ -467,7 +467,7 @@ func (r *CaseRunner) parseConfig() (parsedConfig *TConfig, err error) {
fmt.Sprintf("parse harmony config failed: %v", err)) fmt.Sprintf("parse harmony config failed: %v", err))
} }
device, err := uixt.NewHarmonyDevice(harmonyDevice.Options()...) device, err := uixt.NewHarmonyDevice(harmonyDevice.Options.Options()...)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "init harmony device failed") return nil, errors.Wrap(err, "init harmony device failed")
} }
@@ -479,7 +479,7 @@ func (r *CaseRunner) parseConfig() (parsedConfig *TConfig, err error) {
return nil, errors.Wrap(err, "init harmony driver failed") return nil, errors.Wrap(err, "init harmony driver failed")
} }
r.uixtDrivers[harmonyDevice.ConnectKey] = driverExt r.uixtDrivers[harmonyDevice.Options.ConnectKey] = driverExt
} }
return parsedConfig, nil return parsedConfig, nil