From b3db26f6f96b2fadbc1d8e8972bb293e8d2de49e Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Sun, 8 Dec 2024 12:42:50 +0800 Subject: [PATCH] fix: duplicate getting screen orientation --- hrp/internal/version/VERSION | 2 +- hrp/pkg/uixt/android_adb_driver.go | 20 +++++++------ hrp/pkg/uixt/android_uia2_driver.go | 30 ++++++++++--------- hrp/pkg/uixt/client.go | 2 +- hrp/pkg/uixt/drag.go | 24 +++------------ hrp/pkg/uixt/interface.go | 4 +++ hrp/pkg/uixt/ios_wda_driver.go | 46 ++++++++++++----------------- 7 files changed, 56 insertions(+), 72 deletions(-) diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 8f10fb09..0f09526c 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1 +1 @@ -v5.0.0+2412081202 +v5.0.0+2412081242 diff --git a/hrp/pkg/uixt/android_adb_driver.go b/hrp/pkg/uixt/android_adb_driver.go index 849cd3eb..50a5cdc2 100644 --- a/hrp/pkg/uixt/android_adb_driver.go +++ b/hrp/pkg/uixt/android_adb_driver.go @@ -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 } diff --git a/hrp/pkg/uixt/android_uia2_driver.go b/hrp/pkg/uixt/android_uia2_driver.go index 5d76558c..b66bc20e 100644 --- a/hrp/pkg/uixt/android_uia2_driver.go +++ b/hrp/pkg/uixt/android_uia2_driver.go @@ -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. diff --git a/hrp/pkg/uixt/client.go b/hrp/pkg/uixt/client.go index 9af75c1c..5fd2fe16 100644 --- a/hrp/pkg/uixt/client.go +++ b/hrp/pkg/uixt/client.go @@ -64,7 +64,7 @@ type Driver struct { // cache to avoid repeated query scale float64 - windowSize *Size + windowSize Size driverResults []*DriverResult // cache session data diff --git a/hrp/pkg/uixt/drag.go b/hrp/pkg/uixt/drag.go index 48243450..2d7603bc 100644 --- a/hrp/pkg/uixt/drag.go +++ b/hrp/pkg/uixt/drag.go @@ -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...) } diff --git a/hrp/pkg/uixt/interface.go b/hrp/pkg/uixt/interface.go index 6c0afec5..ea491e1d 100644 --- a/hrp/pkg/uixt/interface.go +++ b/hrp/pkg/uixt/interface.go @@ -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"` diff --git a/hrp/pkg/uixt/ios_wda_driver.go b/hrp/pkg/uixt/ios_wda_driver.go index 9a98f0d3..f6b32a0f 100644 --- a/hrp/pkg/uixt/ios_wda_driver.go +++ b/hrp/pkg/uixt/ios_wda_driver.go @@ -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) {