fix: duplicate getting screen orientation

This commit is contained in:
lilong.129
2024-12-08 12:42:50 +08:00
parent aaf36c28ac
commit b3db26f6f9
7 changed files with 56 additions and 72 deletions

View File

@@ -1 +1 @@
v5.0.0+2412081202
v5.0.0+2412081242

View File

@@ -143,18 +143,19 @@ func (ad *adbDriver) getWindowSize() (size Size, err error) {
}
func (ad *adbDriver) WindowSize() (size Size, err error) {
if ad.windowSize != nil {
size = *ad.windowSize
} else {
size, err = ad.getWindowSize()
if err != nil {
return
}
ad.windowSize = &size
if !ad.windowSize.IsNil() {
// use cached window size
return ad.windowSize, nil
}
size, err = ad.getWindowSize()
if err != nil {
return
}
orientation, err2 := ad.Orientation()
if err2 != nil {
// Notice: do not return err if get window orientation failed
orientation = OrientationPortrait
log.Warn().Err(err2).Msgf(
"get window orientation failed, use default %s", orientation)
@@ -162,7 +163,8 @@ func (ad *adbDriver) WindowSize() (size Size, err error) {
if orientation != OrientationPortrait {
size.Width, size.Height = size.Height, size.Width
}
// Notice: do not return err if get window orientation failed
ad.windowSize = size // cache window size
return size, nil
}

View File

@@ -223,21 +223,21 @@ func (ud *uiaDriver) BatteryInfo() (batteryInfo BatteryInfo, err error) {
func (ud *uiaDriver) WindowSize() (size Size, err error) {
// register(getHandler, new GetDeviceSize("/wd/hub/session/:sessionId/window/:windowHandle/size"))
if ud.windowSize != nil {
size = *ud.windowSize
} else {
var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.session.ID, "window/:windowHandle/size"); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by UIA2 request")
}
reply := new(struct{ Value struct{ Size } })
if err = json.Unmarshal(rawResp, reply); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by UIA2 response")
}
size = reply.Value.Size
ud.windowSize = &size
if !ud.windowSize.IsNil() {
// use cached window size
return ud.windowSize, nil
}
var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.session.ID, "window/:windowHandle/size"); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by UIA2 request")
}
reply := new(struct{ Value struct{ Size } })
if err = json.Unmarshal(rawResp, reply); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by UIA2 response")
}
size = reply.Value.Size
// check orientation
orientation, err := ud.Orientation()
if err != nil {
@@ -247,7 +247,9 @@ func (ud *uiaDriver) WindowSize() (size Size, err error) {
if orientation != OrientationPortrait {
size.Width, size.Height = size.Height, size.Width
}
return
ud.windowSize = size // cache window size
return size, nil
}
// PressBack simulates a short press on the BACK button.

View File

@@ -64,7 +64,7 @@ type Driver struct {
// cache to avoid repeated query
scale float64
windowSize *Size
windowSize Size
driverResults []*DriverResult
// cache session data

View File

@@ -5,7 +5,6 @@ import (
"github.com/httprunner/httprunner/v4/hrp/code"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
)
func (dExt *DriverExt) Drag(fromX, fromY, toX, toY float64, options ...ActionOption) (err error) {
@@ -16,30 +15,15 @@ func (dExt *DriverExt) Drag(fromX, fromY, toX, toY float64, options ...ActionOpt
width := windowSize.Width
height := windowSize.Height
orientation, err := dExt.Driver.Orientation()
if err != nil {
log.Warn().Err(err).Msgf("drag from (%v, %v) to (%v, %v) get orientation failed, use default orientation",
fromX, fromY, toX, toY)
orientation = OrientationPortrait
}
if !assertRelative(fromX) || !assertRelative(fromY) ||
!assertRelative(toX) || !assertRelative(toY) {
return fmt.Errorf("fromX(%f), fromY(%f), toX(%f), toY(%f) must be less than 1",
fromX, fromY, toX, toY)
}
// 左转和右转都是"LANDSCAPE"
if orientation == OrientationPortrait {
fromX = float64(width) * fromX
fromY = float64(height) * fromY
toX = float64(width) * toX
toY = float64(height) * toY
} else {
fromX = float64(height) * fromX
fromY = float64(width) * fromY
toX = float64(height) * toX
toY = float64(width) * toY
}
fromX = float64(width) * fromX
fromY = float64(height) * fromY
toX = float64(width) * toX
toY = float64(height) * toY
return dExt.Driver.Drag(fromX, fromY, toX, toY, options...)
}

View File

@@ -244,6 +244,10 @@ type Size struct {
Height int `json:"height"`
}
func (s Size) IsNil() bool {
return s.Width == 0 && s.Height == 0
}
type Screen struct {
StatusBarSize Size `json:"statusBarSize"`
Scale float64 `json:"scale"`

View File

@@ -187,37 +187,29 @@ func (wd *wdaDriver) BatteryInfo() (batteryInfo BatteryInfo, err error) {
func (wd *wdaDriver) WindowSize() (size Size, err error) {
// [[FBRoute GET:@"/window/size"] respondWithTarget:self action:@selector(handleGetWindowSize:)]
if wd.windowSize != nil {
size = *wd.windowSize
} else {
var rawResp rawResponse
if rawResp, err = wd.httpGET("/session", wd.session.ID, "/window/size"); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by WDA request")
}
reply := new(struct{ Value struct{ Size } })
if err = json.Unmarshal(rawResp, reply); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by WDA response")
}
size = reply.Value.Size
scale, err := wd.Scale()
if err != nil {
return Size{}, errors.Wrap(err, "get window size scale failed")
}
size.Height = size.Height * int(scale)
size.Width = size.Width * int(scale)
wd.windowSize = &size
if !wd.windowSize.IsNil() {
// use cached window size
return wd.windowSize, nil
}
// check orientation
orientation, err := wd.Orientation()
var rawResp rawResponse
if rawResp, err = wd.httpGET("/session", wd.session.ID, "/window/size"); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by WDA request")
}
reply := new(struct{ Value struct{ Size } })
if err = json.Unmarshal(rawResp, reply); err != nil {
return Size{}, errors.Wrap(err, "get window size failed by WDA response")
}
size = reply.Value.Size
scale, err := wd.Scale()
if err != nil {
log.Warn().Err(err).Msgf("window size get orientation failed, use default orientation")
orientation = OrientationPortrait
return Size{}, errors.Wrap(err, "get window size scale failed")
}
if orientation != OrientationPortrait {
size.Width, size.Height = size.Height, size.Width
}
return
size.Height = size.Height * int(scale)
size.Width = size.Width * int(scale)
wd.windowSize = size // cache window size
return wd.windowSize, nil
}
func (wd *wdaDriver) Screen() (screen Screen, err error) {