From 3bd10484e55cfd8ff8f8d4976dc27c6b9a00ccf2 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Tue, 19 Sep 2023 16:41:01 +0800 Subject: [PATCH 1/2] feat: add WithSwipeOffset to set offset for swipe start/end point --- docs/CHANGELOG.md | 2 + examples/uitest/expert_test.go | 4 +- hrp/pkg/uixt/action.go | 63 +++++++++++++++++++++++++++--- hrp/pkg/uixt/android_adb_driver.go | 9 +++++ hrp/pkg/uixt/swipe.go | 2 +- 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index eba1a6e0..189b2e94 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -9,6 +9,8 @@ plugin related: - feat: add hrp executable directory for searching plugin - feat: init device driver with plugin options, `WithDriverCapabilities` and `WithDriverPlugin` - feat: support printing stderr output in myexec.RunCommand +- feat: add `WithSwipeOffset` to set offset for swipe start/end point +- change: set `WithOffset` deprecated, replace with `WithTapOffset` - change: upgrade funplugin to 0.5.3 - refactor: move internal myexec to funplugin/myexec - change: create python3 plugin venv with latest funppy/httprunner diff --git a/examples/uitest/expert_test.go b/examples/uitest/expert_test.go index 07871184..7ced56e3 100644 --- a/examples/uitest/expert_test.go +++ b/examples/uitest/expert_test.go @@ -111,7 +111,7 @@ func TestAndroidExpertTest(t *testing.T) { hrp.NewStep("home 以及 swipe_to_tap_app 自定义配置"). Android(). Home(). - SwipeToTapApp("$app_name", uixt.WithMaxRetryTimes(5), uixt.WithInterval(1), uixt.WithOffset(0, -50)). + SwipeToTapApp("$app_name", uixt.WithMaxRetryTimes(5), uixt.WithInterval(1), uixt.WithTapOffset(0, -50)). Sleep(10), hrp.NewStep("处理弹窗 close_popups 自定义配置 以及 ui_ocr exists 断言"). Android(). @@ -265,7 +265,7 @@ func TestIOSExpertTest(t *testing.T) { hrp.NewStep("home 以及 swipe_to_tap_app 自定义配置"). IOS(). Home(). - SwipeToTapApp("$app_name", uixt.WithMaxRetryTimes(5), uixt.WithInterval(1), uixt.WithOffset(0, -50)). + SwipeToTapApp("$app_name", uixt.WithMaxRetryTimes(5), uixt.WithInterval(1), uixt.WithTapOffset(0, -50)). Sleep(10), hrp.NewStep("处理弹窗 close_popups 自定义配置 以及 ui_ocr exists 断言"). IOS(). diff --git a/hrp/pkg/uixt/action.go b/hrp/pkg/uixt/action.go index 1a813f3b..0433bfbd 100644 --- a/hrp/pkg/uixt/action.go +++ b/hrp/pkg/uixt/action.go @@ -106,10 +106,11 @@ type ActionOptions struct { Scope Scope `json:"scope,omitempty" yaml:"scope,omitempty"` AbsScope AbsScope `json:"abs_scope,omitempty" yaml:"abs_scope,omitempty"` - Regex bool `json:"regex,omitempty" yaml:"regex,omitempty"` // use regex to match text - Offset []int `json:"offset,omitempty" yaml:"offset,omitempty"` // used to tap offset of point - Index int `json:"index,omitempty" yaml:"index,omitempty"` // index of the target element - MatchOne bool `json:"match_one,omitempty" yaml:"match_one,omitempty"` // match one of the targets if existed + Regex bool `json:"regex,omitempty" yaml:"regex,omitempty"` // use regex to match text + Offset []int `json:"offset,omitempty" yaml:"offset,omitempty"` // used to tap offset of point + OffsetRandomScale float64 `json:"offset_random_scale,omitempty" yaml:"offset_random_scale,omitempty"` // used with Offset, set random scale for point + Index int `json:"index,omitempty" yaml:"index,omitempty"` // index of the target element + MatchOne bool `json:"match_one,omitempty" yaml:"match_one,omitempty"` // match one of the targets if existed // set custiom options such as textview, id, description Custom map[string]interface{} `json:"custom,omitempty" yaml:"custom,omitempty"` @@ -181,7 +182,12 @@ func (o *ActionOptions) Options() []ActionOption { o.AbsScope[0], o.AbsScope[1], o.AbsScope[2], o.AbsScope[3])) } if len(o.Offset) == 2 { - options = append(options, WithOffset(o.Offset[0], o.Offset[1])) + // for tap [x,y] offset + options = append(options, WithTapOffset(o.Offset[0], o.Offset[1])) + } else if len(o.Offset) == 4 { + // for swipe [fromX, fromY, toX, toY] offset + options = append(options, WithSwipeOffset( + o.Offset[0], o.Offset[1], o.Offset[2], o.Offset[3])) } if o.Regex { options = append(options, WithRegex(true)) @@ -266,6 +272,42 @@ func mergeDataWithOptions(data map[string]interface{}, options ...ActionOption) yf, _ := builtin.Interface2Float64(y) data["y"] = yf + float64(actionOptions.Offset[1]) } + } else if len(actionOptions.Offset) == 4 { + // Android uia2: [startX, startY, endX, endY] + if startX, ok := data["startX"]; ok { + vf, _ := builtin.Interface2Float64(startX) + data["startX"] = vf + float64(actionOptions.Offset[0]) + } + if startY, ok := data["startY"]; ok { + vf, _ := builtin.Interface2Float64(startY) + data["startY"] = vf + float64(actionOptions.Offset[1]) + } + if endX, ok := data["endX"]; ok { + vf, _ := builtin.Interface2Float64(endX) + data["endX"] = vf + float64(actionOptions.Offset[2]) + } + if endY, ok := data["endY"]; ok { + vf, _ := builtin.Interface2Float64(endY) + data["endY"] = vf + float64(actionOptions.Offset[3]) + } + + // iOS WDA: [fromX, fromY, toX, toY] + if fromX, ok := data["fromX"]; ok { + vf, _ := builtin.Interface2Float64(fromX) + data["fromX"] = vf + float64(actionOptions.Offset[0]) + } + if fromY, ok := data["fromY"]; ok { + vf, _ := builtin.Interface2Float64(fromY) + data["fromY"] = vf + float64(actionOptions.Offset[1]) + } + if toX, ok := data["toX"]; ok { + vf, _ := builtin.Interface2Float64(toX) + data["toX"] = vf + float64(actionOptions.Offset[2]) + } + if toY, ok := data["toY"]; ok { + vf, _ := builtin.Interface2Float64(toY) + data["toY"] = vf + float64(actionOptions.Offset[3]) + } } if actionOptions.Steps > 0 { @@ -377,12 +419,23 @@ func WithAbsScope(x1, y1, x2, y2 int) ActionOption { } } +// Deprecated: use WithTapOffset instead func WithOffset(offsetX, offsetY int) ActionOption { return func(o *ActionOptions) { o.Offset = []int{offsetX, offsetY} } } +// tap [x, y] with offset [offsetX, offsetY] +var WithTapOffset = WithOffset + +// swipe [fromX, fromY, toX, toY] with offset [offsetFromX, offsetFromY, offsetToX, offsetToY] +func WithSwipeOffset(offsetFromX, offsetFromY, offsetToX, offsetToY int) ActionOption { + return func(o *ActionOptions) { + o.Offset = []int{offsetFromX, offsetFromY, offsetToX, offsetToY} + } +} + func WithRegex(regex bool) ActionOption { return func(o *ActionOptions) { o.Regex = regex diff --git a/hrp/pkg/uixt/android_adb_driver.go b/hrp/pkg/uixt/android_adb_driver.go index 4577c104..c0e64cf5 100644 --- a/hrp/pkg/uixt/android_adb_driver.go +++ b/hrp/pkg/uixt/android_adb_driver.go @@ -272,6 +272,15 @@ func (ad *adbDriver) Swipe(fromX, fromY, toX, toY int, options ...ActionOption) } func (ad *adbDriver) SwipeFloat(fromX, fromY, toX, toY float64, options ...ActionOption) error { + actionOptions := NewActionOptions(options...) + + if len(actionOptions.Offset) == 4 { + fromX += float64(actionOptions.Offset[0]) + fromY += float64(actionOptions.Offset[1]) + toX += float64(actionOptions.Offset[2]) + toY += float64(actionOptions.Offset[3]) + } + // adb shell input swipe fromX fromY toX toY _, err := ad.adbClient.RunShellCommand( "input", "swipe", diff --git a/hrp/pkg/uixt/swipe.go b/hrp/pkg/uixt/swipe.go index 9ed9d926..0e34e23b 100644 --- a/hrp/pkg/uixt/swipe.go +++ b/hrp/pkg/uixt/swipe.go @@ -192,7 +192,7 @@ func (dExt *DriverExt) swipeToTapApp(appName string, options ...ActionOption) er } // tap app icon above the text if len(actionOptions.Offset) == 0 { - options = append(options, WithOffset(0, -25)) + options = append(options, WithTapOffset(0, -25)) } // set default swipe interval to 1 second if builtin.IsZeroFloat64(actionOptions.Interval) { From 68051b317c760982d5d4417e1cb903d091ff1ab3 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Tue, 19 Sep 2023 16:55:44 +0800 Subject: [PATCH 2/2] feat: add WithSwipeOffset to set offset for swipe start/end point --- docs/CHANGELOG.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 9db4cce3..83b51648 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,12 @@ # Release History +## v4.3.7 (2023-09-19) + +**go version** + +- feat: add `WithSwipeOffset` to set offset for swipe start/end point +- change: set `WithOffset` deprecated, replace with `WithTapOffset` + ## v4.3.6 (2023-09-07) **go version** @@ -9,8 +16,6 @@ plugin related: - feat: add hrp executable directory for searching plugin - feat: init device driver with plugin options, `WithDriverCapabilities` and `WithDriverPlugin` - feat: support printing stderr output in myexec.RunCommand -- feat: add `WithSwipeOffset` to set offset for swipe start/end point -- change: set `WithOffset` deprecated, replace with `WithTapOffset` - change: upgrade funplugin to 0.5.3 - refactor: move internal myexec to funplugin/myexec - change: create python3 plugin venv with latest funppy/httprunner