From e83f7def5671a11aa09d9118020e9b55b9cf18ea Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Thu, 21 Sep 2023 16:15:57 +0800 Subject: [PATCH] change: revert local text popup handler --- hrp/pkg/uixt/popups.go | 64 ++++++++++++++++++++++++++++++ hrp/pkg/uixt/service_vedem_test.go | 22 ++++++++++ 2 files changed, 86 insertions(+) diff --git a/hrp/pkg/uixt/popups.go b/hrp/pkg/uixt/popups.go index a6546109..0821cc12 100644 --- a/hrp/pkg/uixt/popups.go +++ b/hrp/pkg/uixt/popups.go @@ -10,6 +10,70 @@ import ( "github.com/httprunner/httprunner/v4/hrp/internal/code" ) +// TODO: add more popup texts +var popups = [][]string{ + {".*青少年.*", "我知道了"}, // 青少年弹窗 + {".*个人信息保护.*", "同意"}, + {".*通讯录.*", "拒绝"}, + {".*更新.*", "以后再说|稍后|取消"}, + {".*升级.*", "以后再说|稍后|取消"}, + {".*定位.*", "仅.*允许"}, + {".*拍照.*", "仅.*允许"}, + {".*录音.*", "仅.*允许"}, + {".*位置.*", "仅.*允许"}, + {".*权限.*", "仅.*允许|始终允许"}, + {".*允许.*", "仅.*允许|始终允许"}, + {".*风险.*", "继续使用"}, + {"管理使用时间", ".*忽略.*"}, +} + +func findTextPopup(screenTexts OCRTexts) (closePoint *OCRText) { + for _, popup := range popups { + if len(popup) != 2 { + continue + } + + points, err := screenTexts.FindTexts([]string{popup[0], popup[1]}, WithRegex(true)) + if err == nil { + log.Warn().Interface("popup", popup). + Interface("texts", screenTexts).Msg("text popup found") + closePoint = &points[1] + break + } + } + return +} + +func (dExt *DriverExt) handleTextPopup(screenTexts OCRTexts) error { + closePoint := findTextPopup(screenTexts) + if closePoint == nil { + // no popup found + return nil + } + + log.Info().Str("text", closePoint.Text).Msg("close popup") + pointCenter := closePoint.Center() + if err := dExt.TapAbsXY(pointCenter.X, pointCenter.Y); err != nil { + log.Error().Err(err).Msg("tap popup failed") + return errors.Wrap(code.MobileUIPopupError, err.Error()) + } + // tap popup success + return nil +} + +func (dExt *DriverExt) AutoPopupHandler() error { + // TODO: check popup by activity type + + // check popup by screenshot + screenResult, err := dExt.GetScreenResult( + WithScreenShotOCR(true), WithScreenShotUpload(true)) + if err != nil { + return errors.Wrap(err, "get screen result failed for popup handler") + } + + return dExt.handleTextPopup(screenResult.Texts) +} + const ( CloseStatusFound = "found" CloseStatusSuccess = "success" diff --git a/hrp/pkg/uixt/service_vedem_test.go b/hrp/pkg/uixt/service_vedem_test.go index 730c22a9..bc215bee 100644 --- a/hrp/pkg/uixt/service_vedem_test.go +++ b/hrp/pkg/uixt/service_vedem_test.go @@ -6,6 +6,7 @@ import ( "bytes" "fmt" "os" + "regexp" "testing" ) @@ -51,6 +52,27 @@ func TestOCRWithLocalFile(t *testing.T) { } } +func matchPopup(text string) bool { + for _, popup := range popups { + if regexp.MustCompile(popup[1]).MatchString(text) { + return true + } + } + return false +} + +func TestMatchRegex(t *testing.T) { + testData := []string{ + "以后再说", "我知道了", "同意", "拒绝", "稍后", + "始终允许", "继续使用", "仅在使用中允许", + } + for _, text := range testData { + if !matchPopup(text) { + t.Fatal(text) + } + } +} + func TestTapUIWithScreenshot(t *testing.T) { serialNumber := os.Getenv("SERIAL_NUMBER") device, _ := NewAndroidDevice(WithSerialNumber(serialNumber))