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() size, err = ad.getWindowSize()
if err != nil { if err != nil {
return return
} }
ad.windowSize = &size
}
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,9 +223,11 @@ 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 var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.session.ID, "window/:windowHandle/size"); err != nil { 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") return Size{}, errors.Wrap(err, "get window size failed by UIA2 request")
@@ -235,8 +237,6 @@ func (ud *uiaDriver) WindowSize() (size Size, err error) {
return Size{}, errors.Wrap(err, "get window size failed by UIA2 response") return Size{}, errors.Wrap(err, "get window size failed by UIA2 response")
} }
size = reply.Value.Size size = reply.Value.Size
ud.windowSize = &size
}
// check orientation // check orientation
orientation, err := ud.Orientation() orientation, err := ud.Orientation()
@@ -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"
if orientation == OrientationPortrait {
fromX = float64(width) * fromX fromX = float64(width) * fromX
fromY = float64(height) * fromY fromY = float64(height) * fromY
toX = float64(width) * toX toX = float64(width) * toX
toY = float64(height) * toY 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,9 +187,11 @@ 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 var rawResp rawResponse
if rawResp, err = wd.httpGET("/session", wd.session.ID, "/window/size"); err != nil { 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") return Size{}, errors.Wrap(err, "get window size failed by WDA request")
@@ -205,19 +207,9 @@ func (wd *wdaDriver) WindowSize() (size Size, err error) {
} }
size.Height = size.Height * int(scale) size.Height = size.Height * int(scale)
size.Width = size.Width * int(scale) size.Width = size.Width * int(scale)
wd.windowSize = &size
}
// check orientation wd.windowSize = size // cache window size
orientation, err := wd.Orientation() return wd.windowSize, nil
if err != nil {
log.Warn().Err(err).Msgf("window size get orientation failed, use default orientation")
orientation = OrientationPortrait
}
if orientation != OrientationPortrait {
size.Width, size.Height = size.Height, size.Width
}
return
} }
func (wd *wdaDriver) Screen() (screen Screen, err error) { func (wd *wdaDriver) Screen() (screen Screen, err error) {