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) { func (ad *adbDriver) WindowSize() (size Size, err error) {
if ad.windowSize != nil { if !ad.windowSize.IsNil() {
size = *ad.windowSize // use cached window size
} else { return ad.windowSize, nil
size, err = ad.getWindowSize() }
if err != nil {
return size, err = ad.getWindowSize()
} if err != nil {
ad.windowSize = &size return
} }
orientation, err2 := ad.Orientation() orientation, err2 := ad.Orientation()
if err2 != nil { if err2 != nil {
// Notice: do not return err if get window orientation failed
orientation = OrientationPortrait orientation = OrientationPortrait
log.Warn().Err(err2).Msgf( log.Warn().Err(err2).Msgf(
"get window orientation failed, use default %s", orientation) "get window orientation failed, use default %s", orientation)
@@ -162,7 +163,8 @@ func (ad *adbDriver) WindowSize() (size Size, err error) {
if orientation != OrientationPortrait { if orientation != OrientationPortrait {
size.Width, size.Height = size.Height, size.Width 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 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) { 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"))
if ud.windowSize != nil { if !ud.windowSize.IsNil() {
size = *ud.windowSize // use cached window size
} else { 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
ud.windowSize = &size
} }
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 // check orientation
orientation, err := ud.Orientation() orientation, err := ud.Orientation()
if err != nil { if err != nil {
@@ -247,7 +247,9 @@ func (ud *uiaDriver) WindowSize() (size Size, err error) {
if orientation != OrientationPortrait { if orientation != OrientationPortrait {
size.Width, size.Height = size.Height, size.Width 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. // PressBack simulates a short press on the BACK button.

View File

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

View File

@@ -5,7 +5,6 @@ import (
"github.com/httprunner/httprunner/v4/hrp/code" "github.com/httprunner/httprunner/v4/hrp/code"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/rs/zerolog/log"
) )
func (dExt *DriverExt) Drag(fromX, fromY, toX, toY float64, options ...ActionOption) (err error) { 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 width := windowSize.Width
height := windowSize.Height 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) || if !assertRelative(fromX) || !assertRelative(fromY) ||
!assertRelative(toX) || !assertRelative(toY) { !assertRelative(toX) || !assertRelative(toY) {
return fmt.Errorf("fromX(%f), fromY(%f), toX(%f), toY(%f) must be less than 1", return fmt.Errorf("fromX(%f), fromY(%f), toX(%f), toY(%f) must be less than 1",
fromX, fromY, toX, toY) fromX, fromY, toX, toY)
} }
// 左转和右转都是"LANDSCAPE" fromX = float64(width) * fromX
if orientation == OrientationPortrait { fromY = float64(height) * fromY
fromX = float64(width) * fromX toX = float64(width) * toX
fromY = float64(height) * fromY toY = float64(height) * toY
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
}
return dExt.Driver.Drag(fromX, fromY, toX, toY, options...) return dExt.Driver.Drag(fromX, fromY, toX, toY, options...)
} }

View File

@@ -244,6 +244,10 @@ type Size struct {
Height int `json:"height"` Height int `json:"height"`
} }
func (s Size) IsNil() bool {
return s.Width == 0 && s.Height == 0
}
type Screen struct { type Screen struct {
StatusBarSize Size `json:"statusBarSize"` StatusBarSize Size `json:"statusBarSize"`
Scale float64 `json:"scale"` 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) { 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:)]
if wd.windowSize != nil { if !wd.windowSize.IsNil() {
size = *wd.windowSize // use cached window size
} else { return wd.windowSize, nil
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
} }
// check orientation var rawResp rawResponse
orientation, err := wd.Orientation() 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 { if err != nil {
log.Warn().Err(err).Msgf("window size get orientation failed, use default orientation") return Size{}, errors.Wrap(err, "get window size scale failed")
orientation = OrientationPortrait
} }
if orientation != OrientationPortrait { size.Height = size.Height * int(scale)
size.Width, size.Height = size.Height, size.Width size.Width = size.Width * int(scale)
}
return wd.windowSize = size // cache window size
return wd.windowSize, nil
} }
func (wd *wdaDriver) Screen() (screen Screen, err error) { func (wd *wdaDriver) Screen() (screen Screen, err error) {