mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-09 06:23:52 +08:00
feat: tap random point in ocr text rect
This commit is contained in:
@@ -1 +1 @@
|
|||||||
v5.0.0-beta-2503171509
|
v5.0.0-beta-2503171536
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand/v2"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@@ -96,6 +97,17 @@ func (t OCRText) Center() PointF {
|
|||||||
return point
|
return point
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t OCRText) RandomPoint() PointF {
|
||||||
|
rect := t.Rect
|
||||||
|
x, y := float64(rect.Min.X), float64(rect.Min.Y)
|
||||||
|
width, height := float64(rect.Dx()), float64(rect.Dy())
|
||||||
|
point := PointF{
|
||||||
|
X: x + width*rand.Float64(),
|
||||||
|
Y: y + height*rand.Float64(),
|
||||||
|
}
|
||||||
|
return point
|
||||||
|
}
|
||||||
|
|
||||||
type OCRTexts []OCRText
|
type OCRTexts []OCRText
|
||||||
|
|
||||||
func (t OCRTexts) texts() (texts []string) {
|
func (t OCRTexts) texts() (texts []string) {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package uixt
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/httprunner/httprunner/v5/uixt/ai"
|
||||||
"github.com/httprunner/httprunner/v5/uixt/option"
|
"github.com/httprunner/httprunner/v5/uixt/option"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,7 +20,13 @@ func (dExt *XTDriver) TapByOCR(text string, opts ...option.ActionOption) error {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
point := textRect.Center()
|
|
||||||
|
var point ai.PointF
|
||||||
|
if actionOptions.TapRandom {
|
||||||
|
point = textRect.RandomPoint()
|
||||||
|
} else {
|
||||||
|
point = textRect.Center()
|
||||||
|
}
|
||||||
|
|
||||||
return dExt.TapAbsXY(point.X, point.Y, opts...)
|
return dExt.TapAbsXY(point.X, point.Y, opts...)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,5 +182,6 @@ func TestDriverExt_Action_Risk(t *testing.T) {
|
|||||||
option.WithSwipeOffset(-50, 50, -50, 50))
|
option.WithSwipeOffset(-50, 50, -50, 50))
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
|
||||||
err = driver.TapByOCR("首页", option.WithTapOffset(-10, 10))
|
// tap random point in ocr text rect
|
||||||
|
err = driver.TapByOCR("首页", option.WithTapRandom(true))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,6 +99,10 @@ func (o *ActionOptions) Options() []ActionOption {
|
|||||||
// for tap [x,y] offset
|
// for tap [x,y] offset
|
||||||
options = append(options, WithTapOffset(o.TapOffset[0], o.TapOffset[1]))
|
options = append(options, WithTapOffset(o.TapOffset[0], o.TapOffset[1]))
|
||||||
}
|
}
|
||||||
|
if o.TapRandom {
|
||||||
|
// tap random point in OCR/CV rectangle
|
||||||
|
options = append(options, WithTapRandom(true))
|
||||||
|
}
|
||||||
if len(o.SwipeOffset) == 4 {
|
if len(o.SwipeOffset) == 4 {
|
||||||
// for swipe [fromX, fromY, toX, toY] offset
|
// for swipe [fromX, fromY, toX, toY] offset
|
||||||
options = append(options, WithSwipeOffset(
|
options = append(options, WithSwipeOffset(
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ type ScreenFilterOptions struct {
|
|||||||
|
|
||||||
Regex bool `json:"regex,omitempty" yaml:"regex,omitempty"` // use regex to match text
|
Regex bool `json:"regex,omitempty" yaml:"regex,omitempty"` // use regex to match text
|
||||||
TapOffset []int `json:"tap_offset,omitempty" yaml:"tap_offset,omitempty"` // tap with point offset
|
TapOffset []int `json:"tap_offset,omitempty" yaml:"tap_offset,omitempty"` // tap with point offset
|
||||||
|
TapRandom bool `json:"tap_random,omitempty" yaml:"tap_random,omitempty"` // tap random point in text/image rectangle
|
||||||
SwipeOffset []int `json:"swipe_offset,omitempty" yaml:"swipe_offset,omitempty"` // swipe with direction offset
|
SwipeOffset []int `json:"swipe_offset,omitempty" yaml:"swipe_offset,omitempty"` // swipe with direction offset
|
||||||
OffsetRandomRange []int `json:"offset_random_range,omitempty" yaml:"offset_random_range,omitempty"` // set random range [min, max] for tap/swipe points
|
OffsetRandomRange []int `json:"offset_random_range,omitempty" yaml:"offset_random_range,omitempty"` // set random range [min, max] for tap/swipe points
|
||||||
Index int `json:"index,omitempty" yaml:"index,omitempty"` // index of the target element
|
Index int `json:"index,omitempty" yaml:"index,omitempty"` // index of the target element
|
||||||
@@ -247,6 +248,14 @@ func WithTapOffset(offsetX, offsetY int) ActionOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithTapRandom is used with TapByOCR and TapByCV
|
||||||
|
// when set true, tap random point in text/image rectangle
|
||||||
|
func WithTapRandom(tapRandom bool) ActionOption {
|
||||||
|
return func(o *ActionOptions) {
|
||||||
|
o.TapRandom = tapRandom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func WithRegex(regex bool) ActionOption {
|
func WithRegex(regex bool) ActionOption {
|
||||||
return func(o *ActionOptions) {
|
return func(o *ActionOptions) {
|
||||||
o.Regex = regex
|
o.Regex = regex
|
||||||
|
|||||||
Reference in New Issue
Block a user