mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-05 15:37:35 +08:00
Merge branch 'master' into swipe-random
This commit is contained in:
@@ -21,9 +21,9 @@ jobs:
|
|||||||
goos: windows
|
goos: windows
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
- name: Release hrp cli binaries
|
- name: Release hrp cli binaries
|
||||||
uses: wangyoucao577/go-release-action@v1.23
|
uses: wangyoucao577/go-release-action@v1
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
goos: ${{ matrix.goos }}
|
goos: ${{ matrix.goos }}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
**go version**
|
**go version**
|
||||||
|
|
||||||
- feat: add `WithSwipeOffset` to set offset for swipe start/end point
|
- feat: add `WithSwipeOffset` to set offset for swipe start/end point
|
||||||
|
- feat: set random offset for tap/swipe points with `WithOffsetRandomRange`
|
||||||
- change: set `WithOffset` deprecated, replace with `WithTapOffset`
|
- change: set `WithOffset` deprecated, replace with `WithTapOffset`
|
||||||
|
|
||||||
## v4.3.6 (2023-09-07)
|
## v4.3.6 (2023-09-07)
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ func TestIOSDouyinFollowLive(t *testing.T) {
|
|||||||
TapByOCR("关注", uixt.WithIndex(1)).Sleep(10),
|
TapByOCR("关注", uixt.WithIndex(1)).Sleep(10),
|
||||||
hrp.NewStep("向上滑动 2 次").
|
hrp.NewStep("向上滑动 2 次").
|
||||||
IOS().SwipeToTapTexts([]string{"理肤泉", "婉宝"}, uixt.WithCustomDirection(0.6, 0.2, 0.2, 0.2), uixt.WithIdentifier("click_live")).Sleep(10).
|
IOS().SwipeToTapTexts([]string{"理肤泉", "婉宝"}, uixt.WithCustomDirection(0.6, 0.2, 0.2, 0.2), uixt.WithIdentifier("click_live")).Sleep(10).
|
||||||
Swipe(0.9, 0.7, 0.9, 0.3, uixt.WithIdentifier("slide_in_live")).Sleep(10).ScreenShot(). // 上划 1 次,等待 10s,截图保存
|
Swipe(0.9, 0.7, 0.9, 0.3, uixt.WithIdentifier("slide_in_live"), uixt.WithOffsetRandomRange(-10, 10)).Sleep(10).ScreenShot(). // 上划 1 次,等待 10s,截图保存
|
||||||
Swipe(0.9, 0.7, 0.9, 0.3, uixt.WithIdentifier("slide_in_live")).Sleep(10).ScreenShot(), // 再上划 1 次,等待 10s,截图保存
|
Swipe(0.9, 0.7, 0.9, 0.3, uixt.WithIdentifier("slide_in_live"), uixt.WithOffsetRandomRange(-10, 10)).Sleep(10).ScreenShot(), // 再上划 1 次,等待 10s,截图保存
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+37
-15
@@ -106,11 +106,11 @@ type ActionOptions struct {
|
|||||||
Scope Scope `json:"scope,omitempty" yaml:"scope,omitempty"`
|
Scope Scope `json:"scope,omitempty" yaml:"scope,omitempty"`
|
||||||
AbsScope AbsScope `json:"abs_scope,omitempty" yaml:"abs_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
|
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
|
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
|
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
|
||||||
MatchOne bool `json:"match_one,omitempty" yaml:"match_one,omitempty"` // match one of the targets if existed
|
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
|
// set custiom options such as textview, id, description
|
||||||
Custom map[string]interface{} `json:"custom,omitempty" yaml:"custom,omitempty"`
|
Custom map[string]interface{} `json:"custom,omitempty" yaml:"custom,omitempty"`
|
||||||
@@ -189,6 +189,11 @@ func (o *ActionOptions) Options() []ActionOption {
|
|||||||
options = append(options, WithSwipeOffset(
|
options = append(options, WithSwipeOffset(
|
||||||
o.Offset[0], o.Offset[1], o.Offset[2], o.Offset[3]))
|
o.Offset[0], o.Offset[1], o.Offset[2], o.Offset[3]))
|
||||||
}
|
}
|
||||||
|
if len(o.OffsetRandomRange) == 2 {
|
||||||
|
options = append(options, WithOffsetRandomRange(
|
||||||
|
o.OffsetRandomRange[0], o.OffsetRandomRange[1]))
|
||||||
|
}
|
||||||
|
|
||||||
if o.Regex {
|
if o.Regex {
|
||||||
options = append(options, WithRegex(true))
|
options = append(options, WithRegex(true))
|
||||||
}
|
}
|
||||||
@@ -244,6 +249,17 @@ func (o *ActionOptions) screenshotActions() []string {
|
|||||||
return actions
|
return actions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *ActionOptions) getRandomOffset() int {
|
||||||
|
if len(o.OffsetRandomRange) != 2 {
|
||||||
|
// invalid offset random range, should be [min, max]
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
minOffset := o.OffsetRandomRange[0]
|
||||||
|
maxOffset := o.OffsetRandomRange[1]
|
||||||
|
return builtin.GetRandomNumber(minOffset, maxOffset)
|
||||||
|
}
|
||||||
|
|
||||||
func NewActionOptions(options ...ActionOption) *ActionOptions {
|
func NewActionOptions(options ...ActionOption) *ActionOptions {
|
||||||
actionOptions := &ActionOptions{}
|
actionOptions := &ActionOptions{}
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
@@ -266,47 +282,47 @@ func mergeDataWithOptions(data map[string]interface{}, options ...ActionOption)
|
|||||||
if len(actionOptions.Offset) == 2 {
|
if len(actionOptions.Offset) == 2 {
|
||||||
if x, ok := data["x"]; ok {
|
if x, ok := data["x"]; ok {
|
||||||
xf, _ := builtin.Interface2Float64(x)
|
xf, _ := builtin.Interface2Float64(x)
|
||||||
data["x"] = xf + float64(actionOptions.Offset[0])
|
data["x"] = xf + float64(actionOptions.Offset[0]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
if y, ok := data["y"]; ok {
|
if y, ok := data["y"]; ok {
|
||||||
yf, _ := builtin.Interface2Float64(y)
|
yf, _ := builtin.Interface2Float64(y)
|
||||||
data["y"] = yf + float64(actionOptions.Offset[1])
|
data["y"] = yf + float64(actionOptions.Offset[1]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
} else if len(actionOptions.Offset) == 4 {
|
} else if len(actionOptions.Offset) == 4 {
|
||||||
// Android uia2: [startX, startY, endX, endY]
|
// Android uia2: [startX, startY, endX, endY]
|
||||||
if startX, ok := data["startX"]; ok {
|
if startX, ok := data["startX"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(startX)
|
vf, _ := builtin.Interface2Float64(startX)
|
||||||
data["startX"] = vf + float64(actionOptions.Offset[0])
|
data["startX"] = vf + float64(actionOptions.Offset[0]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
if startY, ok := data["startY"]; ok {
|
if startY, ok := data["startY"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(startY)
|
vf, _ := builtin.Interface2Float64(startY)
|
||||||
data["startY"] = vf + float64(actionOptions.Offset[1])
|
data["startY"] = vf + float64(actionOptions.Offset[1]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
if endX, ok := data["endX"]; ok {
|
if endX, ok := data["endX"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(endX)
|
vf, _ := builtin.Interface2Float64(endX)
|
||||||
data["endX"] = vf + float64(actionOptions.Offset[2])
|
data["endX"] = vf + float64(actionOptions.Offset[2]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
if endY, ok := data["endY"]; ok {
|
if endY, ok := data["endY"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(endY)
|
vf, _ := builtin.Interface2Float64(endY)
|
||||||
data["endY"] = vf + float64(actionOptions.Offset[3])
|
data["endY"] = vf + float64(actionOptions.Offset[3]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
|
|
||||||
// iOS WDA: [fromX, fromY, toX, toY]
|
// iOS WDA: [fromX, fromY, toX, toY]
|
||||||
if fromX, ok := data["fromX"]; ok {
|
if fromX, ok := data["fromX"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(fromX)
|
vf, _ := builtin.Interface2Float64(fromX)
|
||||||
data["fromX"] = vf + float64(actionOptions.Offset[0])
|
data["fromX"] = vf + float64(actionOptions.Offset[0]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
if fromY, ok := data["fromY"]; ok {
|
if fromY, ok := data["fromY"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(fromY)
|
vf, _ := builtin.Interface2Float64(fromY)
|
||||||
data["fromY"] = vf + float64(actionOptions.Offset[1])
|
data["fromY"] = vf + float64(actionOptions.Offset[1]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
if toX, ok := data["toX"]; ok {
|
if toX, ok := data["toX"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(toX)
|
vf, _ := builtin.Interface2Float64(toX)
|
||||||
data["toX"] = vf + float64(actionOptions.Offset[2])
|
data["toX"] = vf + float64(actionOptions.Offset[2]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
if toY, ok := data["toY"]; ok {
|
if toY, ok := data["toY"]; ok {
|
||||||
vf, _ := builtin.Interface2Float64(toY)
|
vf, _ := builtin.Interface2Float64(toY)
|
||||||
data["toY"] = vf + float64(actionOptions.Offset[3])
|
data["toY"] = vf + float64(actionOptions.Offset[3]+actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,6 +452,12 @@ func WithSwipeOffset(offsetFromX, offsetFromY, offsetToX, offsetToY int) ActionO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WithOffsetRandomRange(min, max int) ActionOption {
|
||||||
|
return func(o *ActionOptions) {
|
||||||
|
o.OffsetRandomRange = []int{min, max}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func WithRegex(regex bool) ActionOption {
|
func WithRegex(regex bool) ActionOption {
|
||||||
return func(o *ActionOptions) {
|
return func(o *ActionOptions) {
|
||||||
o.Regex = regex
|
o.Regex = regex
|
||||||
|
|||||||
@@ -225,8 +225,8 @@ func (ad *adbDriver) TapFloat(x, y float64, options ...ActionOption) (err error)
|
|||||||
actionOptions := NewActionOptions(options...)
|
actionOptions := NewActionOptions(options...)
|
||||||
|
|
||||||
if len(actionOptions.Offset) == 2 {
|
if len(actionOptions.Offset) == 2 {
|
||||||
x += float64(actionOptions.Offset[0])
|
x += float64(actionOptions.Offset[0] + actionOptions.getRandomOffset())
|
||||||
y += float64(actionOptions.Offset[1])
|
y += float64(actionOptions.Offset[1] + actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
|
|
||||||
// adb shell input tap x y
|
// adb shell input tap x y
|
||||||
@@ -275,10 +275,10 @@ func (ad *adbDriver) SwipeFloat(fromX, fromY, toX, toY float64, options ...Actio
|
|||||||
actionOptions := NewActionOptions(options...)
|
actionOptions := NewActionOptions(options...)
|
||||||
|
|
||||||
if len(actionOptions.Offset) == 4 {
|
if len(actionOptions.Offset) == 4 {
|
||||||
fromX += float64(actionOptions.Offset[0])
|
fromX += float64(actionOptions.Offset[0] + actionOptions.getRandomOffset())
|
||||||
fromY += float64(actionOptions.Offset[1])
|
fromY += float64(actionOptions.Offset[1] + actionOptions.getRandomOffset())
|
||||||
toX += float64(actionOptions.Offset[2])
|
toX += float64(actionOptions.Offset[2] + actionOptions.getRandomOffset())
|
||||||
toY += float64(actionOptions.Offset[3])
|
toY += float64(actionOptions.Offset[3] + actionOptions.getRandomOffset())
|
||||||
}
|
}
|
||||||
|
|
||||||
// adb shell input swipe fromX fromY toX toY
|
// adb shell input swipe fromX fromY toX toY
|
||||||
|
|||||||
Reference in New Issue
Block a user