fix: screenshot

This commit is contained in:
debugtalk
2022-09-26 16:01:03 +08:00
parent 58289557b6
commit 1ecea74214
7 changed files with 35 additions and 31 deletions
+6 -6
View File
@@ -101,7 +101,7 @@ func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, er
} }
device.SerialNumber = dev.Serial() device.SerialNumber = dev.Serial()
device.Device = dev device.d = dev
return device, nil return device, nil
} }
@@ -109,7 +109,7 @@ func NewAndroidDevice(options ...AndroidDeviceOption) (device *AndroidDevice, er
} }
type AndroidDevice struct { type AndroidDevice struct {
gadb.Device d gadb.Device
SerialNumber string `json:"serial,omitempty" yaml:"serial,omitempty"` SerialNumber string `json:"serial,omitempty" yaml:"serial,omitempty"`
IP string `json:"ip,omitempty" yaml:"ip,omitempty"` IP string `json:"ip,omitempty" yaml:"ip,omitempty"`
Port int `json:"port,omitempty" yaml:"port,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 { if localPort, err = getFreePort(); err != nil {
return nil, err return nil, err
} }
if err = dev.Forward(localPort, UIA2ServerPort); err != nil { if err = dev.d.Forward(localPort, UIA2ServerPort); err != nil {
return nil, err return nil, err
} }
rawURL := fmt.Sprintf("http://%s%d:6790/wd/hub", forwardToPrefix, localPort) rawURL := fmt.Sprintf("http://%s%d:6790/wd/hub", forwardToPrefix, localPort)
driver, err = NewUIADriver(capabilities, rawURL) driver, err = NewUIADriver(capabilities, rawURL)
if err != nil { if err != nil {
_ = dev.ForwardKill(localPort) _ = dev.d.ForwardKill(localPort)
return nil, err return nil, err
} }
driver.adbDevice = dev.Device driver.adbDevice = dev.d
driver.localPort = localPort driver.localPort = localPort
conn, err := net.Dial("tcp", fmt.Sprintf(":%d", 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 { if driver, err = NewUIADriver(capabilities, rawURL); err != nil {
return nil, err return nil, err
} }
driver.adbDevice = dev.Device driver.adbDevice = dev.d
return driver, nil return driver, nil
} }
+7 -3
View File
@@ -152,10 +152,10 @@ func (dExt *DriverExt) takeScreenShot() (raw *bytes.Buffer, err error) {
return dExt.frame, nil return dExt.frame, nil
} }
if raw, err = dExt.Driver.Screenshot(); err != 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 nil, err
} }
return return raw, nil
} }
// saveScreenShot saves image file to $CWD/screenshots/ folder // 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 "", 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 // isPathExists returns true if path exists, whether path is file or dir
+12 -12
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 // aviod getting stuck when some super app is activate such as douyin or wexin
log.Info().Msg("switch to iOS springboard") log.Info().Msg("switch to iOS springboard")
bundleID := "com.apple.springboard" bundleID := "com.apple.springboard"
_, err = iosDevice.AppLaunch(bundleID) _, err = iosDevice.d.AppLaunch(bundleID)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "launch springboard failed") 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.UDID = dev.Properties().SerialNumber
device.Device = dev device.d = dev
return device, nil return device, nil
} }
@@ -161,7 +161,7 @@ func NewIOSDevice(options ...IOSDeviceOption) (device *IOSDevice, err error) {
} }
type IOSDevice struct { type IOSDevice struct {
giDevice.Device d giDevice.Device
UDID string `json:"udid,omitempty" yaml:"udid,omitempty"` UDID string `json:"udid,omitempty" yaml:"udid,omitempty"`
Port int `json:"port,omitempty" yaml:"port,omitempty"` Port int `json:"port,omitempty" yaml:"port,omitempty"`
MjpegPort int `json:"mjpeg_port,omitempty" yaml:"mjpeg_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) { func (dev *IOSDevice) NewUSBDriver(capabilities Capabilities) (driver WebDriver, err error) {
wd := new(wdaDriver) 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) return nil, fmt.Errorf("create connection: %w", err)
} }
wd.client = convertToHTTPClient(wd.defaultConn.RawConn()) 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) return nil, fmt.Errorf("create connection MJPEG: %w", err)
} }
wd.mjpegClient = convertToHTTPClient(wd.mjpegUSBConn.RawConn()) wd.mjpegClient = convertToHTTPClient(wd.mjpegUSBConn.RawConn())
@@ -377,7 +377,7 @@ func (r rawResponse) checkErr() (err error) {
func (r rawResponse) valueConvertToString() (s string, err error) { func (r rawResponse) valueConvertToString() (s string, err error) {
reply := new(struct{ Value string }) reply := new(struct{ Value string })
if err = json.Unmarshal(r, reply); err != nil { if err = json.Unmarshal(r, reply); err != nil {
return "", err return "", errors.Wrapf(err, "json.Unmarshal failed, rawResponse: %s", string(r))
} }
s = reply.Value s = reply.Value
return return
@@ -411,13 +411,13 @@ func (r rawResponse) valueConvertToJsonRawMessage() (raw builtinJSON.RawMessage,
} }
func (r rawResponse) valueDecodeAsBase64() (raw *bytes.Buffer, err error) { func (r rawResponse) valueDecodeAsBase64() (raw *bytes.Buffer, err error) {
var str string str, err := r.valueConvertToString()
if str, err = r.valueConvertToString(); err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "failed to convert value to string")
} }
var decodeString []byte decodeString, err := base64.StdEncoding.DecodeString(str)
if decodeString, err = base64.StdEncoding.DecodeString(str); err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "failed to decode base64 string")
} }
raw = bytes.NewBuffer(decodeString) raw = bytes.NewBuffer(decodeString)
return return
+2 -2
View File
@@ -699,11 +699,11 @@ func (wd *wdaDriver) Screenshot() (raw *bytes.Buffer, err error) {
// [[FBRoute GET:@"/screenshot"].withoutSession respondWithTarget:self action:@selector(handleGetScreenshot:)] // [[FBRoute GET:@"/screenshot"].withoutSession respondWithTarget:self action:@selector(handleGetScreenshot:)]
var rawResp rawResponse var rawResp rawResponse
if rawResp, err = wd.httpGET("/session", wd.sessionId, "/screenshot"); err != nil { 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 { if raw, err = rawResp.valueDecodeAsBase64(); err != nil {
return nil, err return nil, errors.Wrap(err, "decode WDA screenshot data failed")
} }
return return
} }
+7 -4
View File
@@ -13,6 +13,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/rs/zerolog/log"
"github.com/httprunner/httprunner/v4/hrp/internal/json" "github.com/httprunner/httprunner/v4/hrp/internal/json"
) )
@@ -21,8 +23,8 @@ var client = &http.Client{
} }
type OCRResult struct { type OCRResult struct {
Text string `json:"text"` Text string `json:"text"`
Points []Point `json:"points"` Points []PointF `json:"points"`
} }
type ResponseOCR struct { type ResponseOCR struct {
@@ -134,14 +136,15 @@ type OCRService interface {
func (dExt *DriverExt) FindTextByOCR(ocrText string) (x, y, width, height float64, err error) { func (dExt *DriverExt) FindTextByOCR(ocrText string) (x, y, width, height float64, err error) {
var bufSource *bytes.Buffer var bufSource *bytes.Buffer
if bufSource, err = dExt.takeScreenShot(); err != nil { if bufSource, err = dExt.takeScreenShot(); err != nil {
err = fmt.Errorf("screenshot error: %v", err) err = fmt.Errorf("takeScreenShot error: %v", err)
return return
} }
service := &veDEMOCRService{} service := &veDEMOCRService{}
rect, err := service.FindText(ocrText, bufSource.Bytes()) rect, err := service.FindText(ocrText, bufSource.Bytes())
if err != nil { 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 return
} }
+1 -1
View File
@@ -7,7 +7,7 @@ import (
) )
func TestDriverExtOCR(t *testing.T) { func TestDriverExtOCR(t *testing.T) {
driverExt, err := InitWDAClient() driverExt, err := InitWDAClient(nil)
checkErr(t, err) checkErr(t, err)
x, y, width, height, err := driverExt.FindTextByOCR("抖音") x, y, width, height, err := driverExt.FindTextByOCR("抖音")
-3
View File
@@ -2,7 +2,6 @@ package uixt
import ( import (
"fmt" "fmt"
"time"
"github.com/rs/zerolog/log" "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 { if err := dExt.SwipeTo(direction); err != nil {
log.Error().Err(err).Msgf("swipe %s failed", direction) 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) return fmt.Errorf("swipe %s %d times, match condition failed", direction, maxTimes)
} }