fix: wda offset error by scale

This commit is contained in:
lilong.129
2025-07-02 22:03:40 +08:00
parent 65be9afe08
commit 7673a64184
5 changed files with 97 additions and 59 deletions
+22 -12
View File
@@ -30,7 +30,8 @@
"params": "$app_name", "params": "$app_name",
"options": { "options": {
"identifier": "启动抖音", "identifier": "启动抖音",
"max_retry_times": 5 "max_retry_times": 5,
"pre_mark_operation": true
} }
}, },
{ {
@@ -72,7 +73,8 @@
"method": "tap_ocr", "method": "tap_ocr",
"params": "商城", "params": "商城",
"options": { "options": {
"identifier": "点击商城" "identifier": "点击商城",
"pre_mark_operation": true
} }
}, },
{ {
@@ -90,11 +92,14 @@
{ {
"method": "tap_ocr", "method": "tap_ocr",
"params": "推荐", "params": "推荐",
"identifier": "点击推荐", "options": {
"offset": [ "identifier": "点击推荐",
0, "offset": [
-1 0,
] -1
],
"pre_mark_operation": true
}
}, },
{ {
"method": "sleep", "method": "sleep",
@@ -112,7 +117,8 @@
"method": "swipe_direction", "method": "swipe_direction",
"params": "up", "params": "up",
"options": { "options": {
"identifier": "第 1 次上划" "identifier": "第 1 次上划",
"pre_mark_operation": true
} }
}, },
{ {
@@ -123,7 +129,8 @@
"method": "swipe_direction", "method": "swipe_direction",
"params": "up", "params": "up",
"options": { "options": {
"identifier": "第 2 次上划" "identifier": "第 2 次上划",
"pre_mark_operation": true
} }
}, },
{ {
@@ -134,7 +141,8 @@
"method": "swipe_direction", "method": "swipe_direction",
"params": "up", "params": "up",
"options": { "options": {
"identifier": "第 3 次上划" "identifier": "第 3 次上划",
"pre_mark_operation": true
} }
}, },
{ {
@@ -148,7 +156,8 @@
0.1 0.1
], ],
"options": { "options": {
"identifier": "点击进入搜索框" "identifier": "点击进入搜索框",
"pre_mark_operation": true
} }
}, },
{ {
@@ -159,7 +168,8 @@
"method": "input", "method": "input",
"params": "httprunner 发版记录", "params": "httprunner 发版记录",
"options": { "options": {
"identifier": "输入搜索关键词" "identifier": "输入搜索关键词",
"pre_mark_operation": true
} }
}, },
{ {
+16 -9
View File
@@ -27,23 +27,30 @@ func TestWDALog(t *testing.T) {
AppTerminate("com.ss.iphone.ugc.Aweme"). // 关闭已运行的抖音 AppTerminate("com.ss.iphone.ugc.Aweme"). // 关闭已运行的抖音
SwipeToTapApp("$app_name", SwipeToTapApp("$app_name",
option.WithMaxRetryTimes(5), option.WithMaxRetryTimes(5),
option.WithIdentifier("启动抖音")).Sleep(5). option.WithIdentifier("启动抖音"),
option.WithPreMarkOperation(true)).Sleep(5).
Validate(). Validate().
AssertOCRExists("推荐", "抖音启动失败,「推荐」不存在"), AssertOCRExists("推荐", "抖音启动失败,「推荐」不存在"),
hrp.NewStep("处理青少年弹窗"). hrp.NewStep("处理青少年弹窗").
IOS(). IOS().
TapByOCR("我知道了", option.WithIgnoreNotFoundError(true)), TapByOCR("我知道了",
option.WithIgnoreNotFoundError(true)),
hrp.NewStep("进入购物页"). hrp.NewStep("进入购物页").
IOS().TapByOCR("商城", option.WithIdentifier("点击商城")).Sleep(5), IOS().TapByOCR("商城",
option.WithIdentifier("点击商城"),
option.WithPreMarkOperation(true)).Sleep(5),
hrp.NewStep("进入推荐页"). hrp.NewStep("进入推荐页").
IOS().TapByOCR("推荐", option.WithIdentifier("点击推荐")).Sleep(5), IOS().TapByOCR("推荐",
option.WithIdentifier("点击推荐"),
option.WithPreMarkOperation(true),
option.WithTapOffset(0, -1)).Sleep(5),
hrp.NewStep("向上滑动 2 次"). hrp.NewStep("向上滑动 2 次").
IOS(). IOS().
SwipeUp(option.WithIdentifier("第 1 次上划")).Sleep(2). SwipeUp(option.WithIdentifier("第 1 次上划"), option.WithPreMarkOperation(true)).Sleep(2).
SwipeUp(option.WithIdentifier("第 2 次上划")).Sleep(2). SwipeUp(option.WithIdentifier("第 2 次上划"), option.WithPreMarkOperation(true)).Sleep(2).
SwipeUp(option.WithIdentifier("第 3 次上划")).Sleep(2). SwipeUp(option.WithIdentifier("第 3 次上划"), option.WithPreMarkOperation(true)).Sleep(2).
TapXY(0.9, 0.1, option.WithIdentifier("点击进入搜索框")).Sleep(2). TapXY(0.9, 0.1, option.WithIdentifier("点击进入搜索框"), option.WithPreMarkOperation(true)).Sleep(2).
Input("httprunner 发版记录", option.WithIdentifier("输入搜索关键词")). Input("httprunner 发版记录", option.WithIdentifier("输入搜索关键词"), option.WithPreMarkOperation(true)).
TapByOCR("搜索", option.WithIdentifier("点击搜索")), TapByOCR("搜索", option.WithIdentifier("点击搜索")),
}, },
} }
+2 -2
View File
@@ -75,6 +75,6 @@ func TestLoadCaseWithTapOffset(t *testing.T) {
action := tc.Steps[3].IOS.Actions[0] action := tc.Steps[3].IOS.Actions[0]
assert.Equal(t, option.ACTION_TapByOCR, action.Method) assert.Equal(t, option.ACTION_TapByOCR, action.Method)
assert.Equal(t, "推荐", action.Params) assert.Equal(t, "推荐", action.Params)
assert.Equal(t, "点击推荐", action.ActionOptions.Identifier) assert.Equal(t, "点击推荐", action.Options.Identifier)
assert.Equal(t, []int{0, -1}, action.ActionOptions.ScreenFilterOptions.TapOffset) assert.Equal(t, []int{0, -1}, action.Options.ScreenFilterOptions.TapOffset)
} }
+20 -22
View File
@@ -538,13 +538,6 @@ func (wd *WDADriver) TapAbsXY(x, y float64, opts ...option.ActionOption) error {
// [[FBRoute POST:@"/wda/tap/:uuid"] respondWithTarget:self action:@selector(handleTap:)] // [[FBRoute POST:@"/wda/tap/:uuid"] respondWithTarget:self action:@selector(handleTap:)]
var err error var err error
if x, err = wd.toScale(x); err != nil {
return err
}
if y, err = wd.toScale(y); err != nil {
return err
}
actionOptions := option.NewActionOptions(opts...) actionOptions := option.NewActionOptions(opts...)
x, y, err = preHandler_TapAbsXY(wd, actionOptions, x, y) x, y, err = preHandler_TapAbsXY(wd, actionOptions, x, y)
if err != nil { if err != nil {
@@ -552,6 +545,13 @@ func (wd *WDADriver) TapAbsXY(x, y float64, opts ...option.ActionOption) error {
} }
defer postHandler(wd, option.ACTION_TapAbsXY, actionOptions) defer postHandler(wd, option.ACTION_TapAbsXY, actionOptions)
if x, err = wd.toScale(x); err != nil {
return err
}
if y, err = wd.toScale(y); err != nil {
return err
}
data := map[string]interface{}{ data := map[string]interface{}{
"x": x, "x": x,
"y": y, "y": y,
@@ -567,13 +567,6 @@ func (wd *WDADriver) DoubleTap(x, y float64, opts ...option.ActionOption) error
// [[FBRoute POST:@"/wda/doubleTap"] respondWithTarget:self action:@selector(handleDoubleTapCoordinate:)] // [[FBRoute POST:@"/wda/doubleTap"] respondWithTarget:self action:@selector(handleDoubleTapCoordinate:)]
var err error var err error
if x, err = wd.toScale(x); err != nil {
return err
}
if y, err = wd.toScale(y); err != nil {
return err
}
actionOptions := option.NewActionOptions(opts...) actionOptions := option.NewActionOptions(opts...)
x, y, err = preHandler_DoubleTap(wd, actionOptions, x, y) x, y, err = preHandler_DoubleTap(wd, actionOptions, x, y)
if err != nil { if err != nil {
@@ -581,6 +574,12 @@ func (wd *WDADriver) DoubleTap(x, y float64, opts ...option.ActionOption) error
} }
defer postHandler(wd, option.ACTION_DoubleTapXY, actionOptions) defer postHandler(wd, option.ACTION_DoubleTapXY, actionOptions)
if x, err = wd.toScale(x); err != nil {
return err
}
if y, err = wd.toScale(y); err != nil {
return err
}
data := map[string]interface{}{ data := map[string]interface{}{
"x": x, "x": x,
"y": y, "y": y,
@@ -606,6 +605,13 @@ func (wd *WDADriver) Drag(fromX, fromY, toX, toY float64, opts ...option.ActionO
// [[FBRoute POST:@"/wda/dragfromtoforduration"] respondWithTarget:self action:@selector(handleDragCoordinate:)] // [[FBRoute POST:@"/wda/dragfromtoforduration"] respondWithTarget:self action:@selector(handleDragCoordinate:)]
var err error var err error
actionOptions := option.NewActionOptions(opts...)
fromX, fromY, toX, toY, err = preHandler_Drag(wd, actionOptions, fromX, fromY, toX, toY)
if err != nil {
return err
}
defer postHandler(wd, option.ACTION_Drag, actionOptions)
if fromX, err = wd.toScale(fromX); err != nil { if fromX, err = wd.toScale(fromX); err != nil {
return err return err
} }
@@ -618,14 +624,6 @@ func (wd *WDADriver) Drag(fromX, fromY, toX, toY float64, opts ...option.ActionO
if toY, err = wd.toScale(toY); err != nil { if toY, err = wd.toScale(toY); err != nil {
return err return err
} }
actionOptions := option.NewActionOptions(opts...)
fromX, fromY, toX, toY, err = preHandler_Drag(wd, actionOptions, fromX, fromY, toX, toY)
if err != nil {
return err
}
defer postHandler(wd, option.ACTION_Drag, actionOptions)
data := map[string]interface{}{ data := map[string]interface{}{
"fromX": builtin.RoundToOneDecimal(fromX), "fromX": builtin.RoundToOneDecimal(fromX),
"fromY": builtin.RoundToOneDecimal(fromY), "fromY": builtin.RoundToOneDecimal(fromY),
+37 -14
View File
@@ -354,29 +354,52 @@ func (o *ActionOptions) ToMap() map[string]interface{} {
} }
func (o *ActionOptions) ApplyTapOffset(absX, absY float64) (float64, float64) { func (o *ActionOptions) ApplyTapOffset(absX, absY float64) (float64, float64) {
xOffset := 0.0
yOffset := 0.0
if len(o.TapOffset) == 2 { if len(o.TapOffset) == 2 {
absX += float64(o.TapOffset[0]) xOffset += float64(o.TapOffset[0])
absY += float64(o.TapOffset[1]) yOffset += float64(o.TapOffset[1])
} }
absX += o.generateRandomOffset() xOffset += o.generateRandomOffset()
absY += o.generateRandomOffset() yOffset += o.generateRandomOffset()
return absX, absY
if xOffset != 0.0 || yOffset != 0.0 {
log.Debug().
Float64("x_offset", xOffset).
Float64("y_offset", yOffset).
Msg("ApplyTapOffset")
}
return absX + xOffset, absY + yOffset
} }
func (o *ActionOptions) ApplySwipeOffset(absFromX, absFromY, absToX, absToY float64) ( func (o *ActionOptions) ApplySwipeOffset(absFromX, absFromY, absToX, absToY float64) (
float64, float64, float64, float64, float64, float64, float64, float64,
) { ) {
fromXOffset := 0.0
fromYOffset := 0.0
toXOffset := 0.0
toYOffset := 0.0
if len(o.SwipeOffset) == 4 { if len(o.SwipeOffset) == 4 {
absFromX += float64(o.SwipeOffset[0]) fromXOffset += float64(o.SwipeOffset[0])
absFromY += float64(o.SwipeOffset[1]) fromYOffset += float64(o.SwipeOffset[1])
absToX += float64(o.SwipeOffset[2]) toXOffset += float64(o.SwipeOffset[2])
absToY += float64(o.SwipeOffset[3]) toYOffset += float64(o.SwipeOffset[3])
} }
absFromX += o.generateRandomOffset() fromXOffset += o.generateRandomOffset()
absFromY += o.generateRandomOffset() fromYOffset += o.generateRandomOffset()
absToX += o.generateRandomOffset() toXOffset += o.generateRandomOffset()
absToY += o.generateRandomOffset() toYOffset += o.generateRandomOffset()
return absFromX, absFromY, absToX, absToY
if fromXOffset != 0.0 || fromYOffset != 0.0 || toXOffset != 0.0 || toYOffset != 0.0 {
log.Debug().
Float64("from_x_offset", fromXOffset).
Float64("from_y_offset", fromYOffset).
Float64("to_x_offset", toXOffset).
Float64("to_y_offset", toYOffset).
Msg("ApplySwipeOffset")
}
return absFromX + fromXOffset, absFromY + fromYOffset,
absToX + toXOffset, absToY + toYOffset
} }
func (o *ActionOptions) generateRandomOffset() float64 { func (o *ActionOptions) generateRandomOffset() float64 {