diff --git a/hrp/internal/code/code.go b/hrp/internal/code/code.go index 87c830ea..e7e74aa7 100644 --- a/hrp/internal/code/code.go +++ b/hrp/internal/code/code.go @@ -63,7 +63,7 @@ var ( var ( AndroidDeviceConnectionError = errors.New("android device connection error") // 60 AndroidDeviceUSBDriverError = errors.New("android device USB driver error") // 61 - AndroidShellExecError = errors.New("android shell exec error") // 62 + AndroidShellExecError = errors.New("android adb shell exec error") // 62 AndroidScreenShotError = errors.New("android screenshot error") // 65 AndroidCaptureLogError = errors.New("android capture log error") // 66 ) diff --git a/hrp/pkg/gadb/device.go b/hrp/pkg/gadb/device.go index 2067755a..8bbf7e92 100644 --- a/hrp/pkg/gadb/device.go +++ b/hrp/pkg/gadb/device.go @@ -3,16 +3,17 @@ package gadb import ( "bytes" "encoding/binary" - "errors" "fmt" "io" "os" "strings" "time" + "github.com/pkg/errors" "github.com/rs/zerolog/log" "github.com/httprunner/httprunner/v4/hrp/internal/builtin" + "github.com/httprunner/httprunner/v4/hrp/internal/code" ) type DeviceFileInfo struct { @@ -244,7 +245,10 @@ func (d *Device) ReverseForwardKillAll() error { func (d *Device) RunShellCommand(cmd string, args ...string) (string, error) { raw, err := d.RunShellCommandWithBytes(cmd, args...) - return string(raw), err + if err != nil { + return "", errors.Wrap(code.AndroidShellExecError, err.Error()) + } + return string(raw), nil } func (d *Device) RunShellCommandWithBytes(cmd string, args ...string) ([]byte, error) { @@ -548,7 +552,7 @@ func (d *Device) InstallAPK(apk io.ReadSeeker) (string, error) { res, err := d.RunShellCommand("pm", "install", "-f", remote) if err != nil { - return "", fmt.Errorf("error installing: %v", err) + return "", errors.Wrap(err, "install apk failed") } if haserr(res) { return "", errors.New(res) diff --git a/hrp/pkg/uixt/android_adb_driver.go b/hrp/pkg/uixt/android_adb_driver.go index 858ad229..89c33859 100644 --- a/hrp/pkg/uixt/android_adb_driver.go +++ b/hrp/pkg/uixt/android_adb_driver.go @@ -59,7 +59,7 @@ func (ad *adbDriver) WindowSize() (size Size, err error) { // adb shell wm size resp, err := ad.adbClient.RunShellCommand("wm", "size") if err != nil { - return + return size, errors.Wrap(err, "get window size failed") } // Physical size: 1080x2340 @@ -84,12 +84,15 @@ func (ad *adbDriver) Scale() (scale float64, err error) { func (ad *adbDriver) PressBack(options ...ActionOption) (err error) { // adb shell input keyevent 4 _, err = ad.adbClient.RunShellCommand("input", "keyevent", fmt.Sprintf("%d", KCBack)) - return + if err != nil { + return errors.Wrap(err, "press back failed") + } + return nil } func (ad *adbDriver) StartCamera() (err error) { if _, err = ad.adbClient.RunShellCommand("rm", "-r", "/sdcard/DCIM/Camera"); err != nil { - return err + return errors.Wrap(err, "remove /sdcard/DCIM/Camera failed") } time.Sleep(5 * time.Second) var version string @@ -176,7 +179,7 @@ func (ad *adbDriver) AppTerminate(packageName string) (successful bool, err erro // adb shell am force-stop _, err = ad.adbClient.RunShellCommand("am", "force-stop", packageName) if err != nil { - return false, err + return false, errors.Wrap(err, "force-stop app failed") } if ad.lastLaunchedPackageName == packageName { @@ -198,9 +201,14 @@ func (ad *adbDriver) TapFloat(x, y float64, options ...ActionOption) (err error) } // adb shell input tap x y + xStr := fmt.Sprintf("%.1f", x) + yStr := fmt.Sprintf("%.1f", y) _, err = ad.adbClient.RunShellCommand( - "input", "tap", fmt.Sprintf("%.1f", x), fmt.Sprintf("%.1f", y)) - return + "input", "tap", xStr, yStr) + if err != nil { + return errors.Wrap(err, fmt.Sprintf("tap <%s, %s> failed", xStr, yStr)) + } + return nil } func (ad *adbDriver) DoubleTap(x, y int) error { @@ -241,7 +249,10 @@ func (ad *adbDriver) SwipeFloat(fromX, fromY, toX, toY float64, options ...Actio fmt.Sprintf("%.1f", fromX), fmt.Sprintf("%.1f", fromY), fmt.Sprintf("%.1f", toX), fmt.Sprintf("%.1f", toY), ) - return err + if err != nil { + return errors.Wrap(err, "swipe failed") + } + return nil } func (ad *adbDriver) ForceTouch(x, y int, pressure float64, second ...float64) error { @@ -266,7 +277,10 @@ func (ad *adbDriver) GetPasteboard(contentType PasteboardType) (raw *bytes.Buffe func (ad *adbDriver) SendKeys(text string, options ...ActionOption) (err error) { // adb shell input text _, err = ad.adbClient.RunShellCommand("input", "text", text) - return + if err != nil { + return errors.Wrap(err, "send keys failed") + } + return nil } func (ad *adbDriver) Input(text string, options ...ActionOption) (err error) { @@ -382,7 +396,7 @@ func (ad *adbDriver) GetForegroundApp() (app AppInfo, err error) { output, err := ad.adbClient.RunShellCommand("dumpsys", "activity", "activities") if err != nil { log.Error().Err(err).Msg("failed to dumpsys activities") - return AppInfo{}, errors.Wrap(code.AndroidShellExecError, err.Error()) + return AppInfo{}, errors.Wrap(err, "dumpsys activities failed") } lines := strings.Split(string(output), "\n") diff --git a/hrp/pkg/uixt/android_uia2_driver.go b/hrp/pkg/uixt/android_uia2_driver.go index 5f426e04..a6e92334 100644 --- a/hrp/pkg/uixt/android_uia2_driver.go +++ b/hrp/pkg/uixt/android_uia2_driver.go @@ -163,7 +163,7 @@ func (ud *uiaDriver) WindowSize() (size Size, err error) { // register(getHandler, new GetDeviceSize("/wd/hub/session/:sessionId/window/:windowHandle/size")) var rawResp rawResponse if rawResp, err = ud.httpGET("/session", ud.sessionId, "window/:windowHandle/size"); err != nil { - return Size{}, err + return Size{}, errors.Wrap(err, "get window size failed with uiautomator2") } reply := new(struct{ Value struct{ Size } }) if err = json.Unmarshal(rawResp, reply); err != nil { diff --git a/hrp/pkg/uixt/ext.go b/hrp/pkg/uixt/ext.go index cb25faa0..0b2bd70b 100644 --- a/hrp/pkg/uixt/ext.go +++ b/hrp/pkg/uixt/ext.go @@ -86,7 +86,7 @@ func NewDriverExt(device Device, driver WebDriver) (dExt *DriverExt, err error) // get device window size dExt.windowSize, err = dExt.Driver.WindowSize() if err != nil { - return nil, errors.Wrap(err, "failed to get windows size") + return nil, err } if dExt.OCRService, err = newVEDEMOCRService(); err != nil { diff --git a/hrp/pkg/uixt/ios_driver.go b/hrp/pkg/uixt/ios_driver.go index 5507de6e..004e7a62 100644 --- a/hrp/pkg/uixt/ios_driver.go +++ b/hrp/pkg/uixt/ios_driver.go @@ -137,7 +137,7 @@ func (wd *wdaDriver) WindowSize() (size Size, err error) { // [[FBRoute GET:@"/window/size"] respondWithTarget:self action:@selector(handleGetWindowSize:)] var rawResp rawResponse if rawResp, err = wd.httpGET("/session", wd.sessionId, "/window/size"); err != nil { - return Size{}, err + return Size{}, errors.Wrap(err, "get window size failed with wda") } reply := new(struct{ Value struct{ Size } }) if err = json.Unmarshal(rawResp, reply); err != nil {