fix: screenshot

This commit is contained in:
debugtalk
2022-09-26 14:47:19 +08:00
parent 58289557b6
commit 1ecea74214
7 changed files with 35 additions and 31 deletions

View File

@@ -101,7 +101,7 @@ func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, er
}
device.SerialNumber = dev.Serial()
device.Device = dev
device.d = dev
return device, nil
}
@@ -109,7 +109,7 @@ func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, er
}
type AndroidDevice struct {
gadb.Device
d gadb.Device
SerialNumber string `json:"serial,omitempty" yaml:"serial,omitempty"`
IP string `json:"ip,omitempty" yaml:"ip,omitempty"`
Port int `json:"port,omitempty" yaml:"port,omitempty"`
@@ -136,17 +136,17 @@ func (dev *AndroidDevice) NewUSBDriver(capabilities Capabilities) (driver *uiaDr
if localPort, err = getFreePort(); err != nil {
return nil, err
}
if err = dev.Forward(localPort, UIA2ServerPort); err != nil {
if err = dev.d.Forward(localPort, UIA2ServerPort); err != nil {
return nil, err
}
rawURL := fmt.Sprintf("http://%s%d:6790/wd/hub", forwardToPrefix, localPort)
driver, err = NewUIADriver(capabilities, rawURL)
if err != nil {
_ = dev.ForwardKill(localPort)
_ = dev.d.ForwardKill(localPort)
return nil, err
}
driver.adbDevice = dev.Device
driver.adbDevice = dev.d
driver.localPort = localPort
conn, err := net.Dial("tcp", fmt.Sprintf(":%d", localPort))
@@ -165,7 +165,7 @@ func (dev *AndroidDevice) NewHTTPDriver(capabilities Capabilities) (driver *uiaD
if driver, err = NewUIADriver(capabilities, rawURL); err != nil {
return nil, err
}
driver.adbDevice = dev.Device
driver.adbDevice = dev.d
return driver, nil
}

View File

@@ -152,10 +152,10 @@ func (dExt *DriverExt) takeScreenShot() (raw *bytes.Buffer, err error) {
return dExt.frame, nil
}
if raw, err = dExt.Driver.Screenshot(); err != nil {
log.Error().Err(err).Msgf("screenshot failed: %v", err)
log.Error().Err(err).Msg("takeScreenShot failed")
return nil, err
}
return
return raw, nil
}
// saveScreenShot saves image file to $CWD/screenshots/ folder
@@ -203,7 +203,11 @@ func (dExt *DriverExt) ScreenShot(fileName string) (string, error) {
return "", errors.Wrap(err, "screenshot by WDA failed")
}
return dExt.saveScreenShot(raw, fileName)
path, err := dExt.saveScreenShot(raw, fileName)
if err != nil {
return "", errors.Wrap(err, "save screenshot failed")
}
return path, nil
}
// isPathExists returns true if path exists, whether path is file or dir

View File

@@ -64,7 +64,7 @@ func InitWDAClient(device *IOSDevice) (*DriverExt, error) {
// aviod getting stuck when some super app is activate such as douyin or wexin
log.Info().Msg("switch to iOS springboard")
bundleID := "com.apple.springboard"
_, err = iosDevice.AppLaunch(bundleID)
_, err = iosDevice.d.AppLaunch(bundleID)
if err != nil {
return nil, errors.Wrap(err, "launch springboard failed")
}
@@ -153,7 +153,7 @@ func NewIOSDevice(options ...IOSDeviceOption) (device *IOSDevice, err error) {
}
device.UDID = dev.Properties().SerialNumber
device.Device = dev
device.d = dev
return device, nil
}
@@ -161,7 +161,7 @@ func NewIOSDevice(options ...IOSDeviceOption) (device *IOSDevice, err error) {
}
type IOSDevice struct {
giDevice.Device
d giDevice.Device
UDID string `json:"udid,omitempty" yaml:"udid,omitempty"`
Port int `json:"port,omitempty" yaml:"port,omitempty"`
MjpegPort int `json:"mjpeg_port,omitempty" yaml:"mjpeg_port,omitempty"`
@@ -203,12 +203,12 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities Capabilities) (driver WebDriver
func (dev *IOSDevice) NewUSBDriver(capabilities Capabilities) (driver WebDriver, err error) {
wd := new(wdaDriver)
if wd.defaultConn, err = dev.NewConnect(dev.Port, 0); err != nil {
if wd.defaultConn, err = dev.d.NewConnect(dev.Port, 0); err != nil {
return nil, fmt.Errorf("create connection: %w", err)
}
wd.client = convertToHTTPClient(wd.defaultConn.RawConn())
if wd.mjpegUSBConn, err = dev.NewConnect(dev.MjpegPort, 0); err != nil {
if wd.mjpegUSBConn, err = dev.d.NewConnect(dev.MjpegPort, 0); err != nil {
return nil, fmt.Errorf("create connection MJPEG: %w", err)
}
wd.mjpegClient = convertToHTTPClient(wd.mjpegUSBConn.RawConn())
@@ -377,7 +377,7 @@ func (r rawResponse) checkErr() (err error) {
func (r rawResponse) valueConvertToString() (s string, err error) {
reply := new(struct{ Value string })
if err = json.Unmarshal(r, reply); err != nil {
return "", err
return "", errors.Wrapf(err, "json.Unmarshal failed, rawResponse: %s", string(r))
}
s = reply.Value
return
@@ -411,13 +411,13 @@ func (r rawResponse) valueConvertToJsonRawMessage() (raw builtinJSON.RawMessage,
}
func (r rawResponse) valueDecodeAsBase64() (raw *bytes.Buffer, err error) {
var str string
if str, err = r.valueConvertToString(); err != nil {
return nil, err
str, err := r.valueConvertToString()
if err != nil {
return nil, errors.Wrap(err, "failed to convert value to string")
}
var decodeString []byte
if decodeString, err = base64.StdEncoding.DecodeString(str); err != nil {
return nil, err
decodeString, err := base64.StdEncoding.DecodeString(str)
if err != nil {
return nil, errors.Wrap(err, "failed to decode base64 string")
}
raw = bytes.NewBuffer(decodeString)
return

View File

@@ -699,11 +699,11 @@ func (wd *wdaDriver) Screenshot() (raw *bytes.Buffer, err error) {
// [[FBRoute GET:@"/screenshot"].withoutSession respondWithTarget:self action:@selector(handleGetScreenshot:)]
var rawResp rawResponse
if rawResp, err = wd.httpGET("/session", wd.sessionId, "/screenshot"); err != nil {
return nil, err
return nil, errors.Wrap(err, "get WDA screenshot data failed")
}
if raw, err = rawResp.valueDecodeAsBase64(); err != nil {
return nil, err
return nil, errors.Wrap(err, "decode WDA screenshot data failed")
}
return
}

View File

@@ -13,6 +13,8 @@ import (
"strings"
"time"
"github.com/rs/zerolog/log"
"github.com/httprunner/httprunner/v4/hrp/internal/json"
)
@@ -21,8 +23,8 @@ var client = &http.Client{
}
type OCRResult struct {
Text string `json:"text"`
Points []Point `json:"points"`
Text string `json:"text"`
Points []PointF `json:"points"`
}
type ResponseOCR struct {
@@ -134,14 +136,15 @@ type OCRService interface {
func (dExt *DriverExt) FindTextByOCR(ocrText string) (x, y, width, height float64, err error) {
var bufSource *bytes.Buffer
if bufSource, err = dExt.takeScreenShot(); err != nil {
err = fmt.Errorf("screenshot error: %v", err)
err = fmt.Errorf("takeScreenShot error: %v", err)
return
}
service := &veDEMOCRService{}
rect, err := service.FindText(ocrText, bufSource.Bytes())
if err != nil {
err = fmt.Errorf("find text failed: %v", err)
log.Warn().Err(err).Msg("FindText failed")
err = fmt.Errorf("FindText failed: %v", err)
return
}

View File

@@ -7,7 +7,7 @@ import (
)
func TestDriverExtOCR(t *testing.T) {
driverExt, err := InitWDAClient()
driverExt, err := InitWDAClient(nil)
checkErr(t, err)
x, y, width, height, err := driverExt.FindTextByOCR("抖音")

View File

@@ -2,7 +2,6 @@ package uixt
import (
"fmt"
"time"
"github.com/rs/zerolog/log"
)
@@ -82,8 +81,6 @@ func (dExt *DriverExt) SwipeUntil(direction string, condition FindCondition, act
if err := dExt.SwipeTo(direction); err != nil {
log.Error().Err(err).Msgf("swipe %s failed", direction)
}
// wait for swipe done
time.Sleep(500 * time.Millisecond)
}
return fmt.Errorf("swipe %s %d times, match condition failed", direction, maxTimes)
}