refactor: exit with AndroidShellExecError code for adb shell failure

This commit is contained in:
lilong.129
2023-05-04 00:15:02 +08:00
parent 87cba44164
commit 247f6b9975
6 changed files with 34 additions and 16 deletions
+1 -1
View File
@@ -63,7 +63,7 @@ var (
var ( var (
AndroidDeviceConnectionError = errors.New("android device connection error") // 60 AndroidDeviceConnectionError = errors.New("android device connection error") // 60
AndroidDeviceUSBDriverError = errors.New("android device USB driver error") // 61 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 AndroidScreenShotError = errors.New("android screenshot error") // 65
AndroidCaptureLogError = errors.New("android capture log error") // 66 AndroidCaptureLogError = errors.New("android capture log error") // 66
) )
+7 -3
View File
@@ -3,16 +3,17 @@ package gadb
import ( import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"errors"
"fmt" "fmt"
"io" "io"
"os" "os"
"strings" "strings"
"time" "time"
"github.com/pkg/errors"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/httprunner/httprunner/v4/hrp/internal/builtin" "github.com/httprunner/httprunner/v4/hrp/internal/builtin"
"github.com/httprunner/httprunner/v4/hrp/internal/code"
) )
type DeviceFileInfo struct { type DeviceFileInfo struct {
@@ -244,7 +245,10 @@ func (d *Device) ReverseForwardKillAll() error {
func (d *Device) RunShellCommand(cmd string, args ...string) (string, error) { func (d *Device) RunShellCommand(cmd string, args ...string) (string, error) {
raw, err := d.RunShellCommandWithBytes(cmd, args...) 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) { 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) res, err := d.RunShellCommand("pm", "install", "-f", remote)
if err != nil { if err != nil {
return "", fmt.Errorf("error installing: %v", err) return "", errors.Wrap(err, "install apk failed")
} }
if haserr(res) { if haserr(res) {
return "", errors.New(res) return "", errors.New(res)
+23 -9
View File
@@ -59,7 +59,7 @@ func (ad *adbDriver) WindowSize() (size Size, err error) {
// adb shell wm size // adb shell wm size
resp, err := ad.adbClient.RunShellCommand("wm", "size") resp, err := ad.adbClient.RunShellCommand("wm", "size")
if err != nil { if err != nil {
return return size, errors.Wrap(err, "get window size failed")
} }
// Physical size: 1080x2340 // Physical size: 1080x2340
@@ -84,12 +84,15 @@ func (ad *adbDriver) Scale() (scale float64, err error) {
func (ad *adbDriver) PressBack(options ...ActionOption) (err error) { func (ad *adbDriver) PressBack(options ...ActionOption) (err error) {
// adb shell input keyevent 4 // adb shell input keyevent 4
_, err = ad.adbClient.RunShellCommand("input", "keyevent", fmt.Sprintf("%d", KCBack)) _, 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) { func (ad *adbDriver) StartCamera() (err error) {
if _, err = ad.adbClient.RunShellCommand("rm", "-r", "/sdcard/DCIM/Camera"); err != nil { 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) time.Sleep(5 * time.Second)
var version string var version string
@@ -176,7 +179,7 @@ func (ad *adbDriver) AppTerminate(packageName string) (successful bool, err erro
// adb shell am force-stop <packagename> // adb shell am force-stop <packagename>
_, err = ad.adbClient.RunShellCommand("am", "force-stop", packageName) _, err = ad.adbClient.RunShellCommand("am", "force-stop", packageName)
if err != nil { if err != nil {
return false, err return false, errors.Wrap(err, "force-stop app failed")
} }
if ad.lastLaunchedPackageName == packageName { 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 // adb shell input tap x y
xStr := fmt.Sprintf("%.1f", x)
yStr := fmt.Sprintf("%.1f", y)
_, err = ad.adbClient.RunShellCommand( _, err = ad.adbClient.RunShellCommand(
"input", "tap", fmt.Sprintf("%.1f", x), fmt.Sprintf("%.1f", y)) "input", "tap", xStr, yStr)
return 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 { 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", fromX), fmt.Sprintf("%.1f", fromY),
fmt.Sprintf("%.1f", toX), fmt.Sprintf("%.1f", toY), 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 { 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) { func (ad *adbDriver) SendKeys(text string, options ...ActionOption) (err error) {
// adb shell input text <text> // adb shell input text <text>
_, err = ad.adbClient.RunShellCommand("input", "text", 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) { 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") output, err := ad.adbClient.RunShellCommand("dumpsys", "activity", "activities")
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to dumpsys activities") 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") lines := strings.Split(string(output), "\n")
+1 -1
View File
@@ -163,7 +163,7 @@ func (ud *uiaDriver) WindowSize() (size Size, err error) {
// register(getHandler, new GetDeviceSize("/wd/hub/session/:sessionId/window/:windowHandle/size")) // register(getHandler, new GetDeviceSize("/wd/hub/session/:sessionId/window/:windowHandle/size"))
var rawResp rawResponse var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.sessionId, "window/:windowHandle/size"); err != nil { 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 } }) reply := new(struct{ Value struct{ Size } })
if err = json.Unmarshal(rawResp, reply); err != nil { if err = json.Unmarshal(rawResp, reply); err != nil {
+1 -1
View File
@@ -86,7 +86,7 @@ func NewDriverExt(device Device, driver WebDriver) (dExt *DriverExt, err error)
// get device window size // get device window size
dExt.windowSize, err = dExt.Driver.WindowSize() dExt.windowSize, err = dExt.Driver.WindowSize()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to get windows size") return nil, err
} }
if dExt.OCRService, err = newVEDEMOCRService(); err != nil { if dExt.OCRService, err = newVEDEMOCRService(); err != nil {
+1 -1
View File
@@ -137,7 +137,7 @@ func (wd *wdaDriver) WindowSize() (size Size, err error) {
// [[FBRoute GET:@"/window/size"] respondWithTarget:self action:@selector(handleGetWindowSize:)] // [[FBRoute GET:@"/window/size"] respondWithTarget:self action:@selector(handleGetWindowSize:)]
var rawResp rawResponse var rawResp rawResponse
if rawResp, err = wd.httpGET("/session", wd.sessionId, "/window/size"); err != nil { 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 } }) reply := new(struct{ Value struct{ Size } })
if err = json.Unmarshal(rawResp, reply); err != nil { if err = json.Unmarshal(rawResp, reply); err != nil {