From 1087b1fe42c10256c6ac7bbdc6738076e5585304 Mon Sep 17 00:00:00 2001 From: "huangbin.beal@163.com" Date: Thu, 20 Feb 2025 10:36:36 +0800 Subject: [PATCH 1/3] fix: sub driver --- pkg/uixt/browser_device.go | 2 +- pkg/uixt/browser_web_driver.go | 4 +- pkg/uixt/driver_ext/browser_sub_driver.go | 68 +++++++++++------------ 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/pkg/uixt/browser_device.go b/pkg/uixt/browser_device.go index 4dca01bf..5dd6e440 100644 --- a/pkg/uixt/browser_device.go +++ b/pkg/uixt/browser_device.go @@ -67,7 +67,7 @@ func (dev *BrowserDevice) GetPackageInfo(packageName string) (types.AppInfo, err func (dev *BrowserDevice) NewDriver() (driver IDriver, err error) { // var driver WebDriver - driver, err = newBrowserWebDriver(dev.UUID()) + driver, err = NewBrowserWebDriver(dev.UUID()) if err != nil { return nil, err } diff --git a/pkg/uixt/browser_web_driver.go b/pkg/uixt/browser_web_driver.go index 35446f51..9690843a 100644 --- a/pkg/uixt/browser_web_driver.go +++ b/pkg/uixt/browser_web_driver.go @@ -90,8 +90,8 @@ func CreateBrowser(timeout int) (browserInfo *BrowserInfo, err error) { return &result.Data, nil } -func newBrowserWebDriver(browserId string) (driver *BrowserWebDriver, err error) { - log.Info().Msg("init newBrowserWebDriver driver") +func NewBrowserWebDriver(browserId string) (driver *BrowserWebDriver, err error) { + log.Info().Msg("init NewBrowserWebDriver driver") driver = new(BrowserWebDriver) driver.urlPrefix = &url.URL{} driver.urlPrefix.Host = BROWSER_LOCAL_ADDRESS diff --git a/pkg/uixt/driver_ext/browser_sub_driver.go b/pkg/uixt/driver_ext/browser_sub_driver.go index c9fe838a..8c36af9e 100644 --- a/pkg/uixt/driver_ext/browser_sub_driver.go +++ b/pkg/uixt/driver_ext/browser_sub_driver.go @@ -34,7 +34,7 @@ type CreateBrowserResponse struct { Data BrowserInfo `json:"data"` } -type BrowserWebDriver struct { +type StubBrowserDriver struct { *uixt.BrowserWebDriver urlPrefix *url.URL sessionId string @@ -92,16 +92,14 @@ func CreateBrowser(timeout int) (browserInfo *BrowserInfo, err error) { return &result.Data, nil } -func NewStubBrowserDriver(browserId string) (driver *BrowserWebDriver, err error) { - log.Info().Msg("init NewStubBrowserDriver driver") - driver = new(BrowserWebDriver) - driver.urlPrefix = &url.URL{} - driver.urlPrefix.Host = BROWSER_LOCAL_ADDRESS - driver.urlPrefix.Scheme = "http" - driver.scale = 1.0 +func NewStubBrowserDriver(browserId string) (driver *StubBrowserDriver, err error) { + BrowserWebDriver, err := uixt.NewBrowserWebDriver(browserId) if err != nil { return nil, errors.Wrap(err, "create browser session failed") } + driver = &StubBrowserDriver{ + BrowserWebDriver: BrowserWebDriver, + } driver.sessionId = browserId if err != nil { return nil, fmt.Errorf("adb forward: %w", err) @@ -109,7 +107,7 @@ func NewStubBrowserDriver(browserId string) (driver *BrowserWebDriver, err error return driver, nil } -func (wd *BrowserWebDriver) Drag(fromX, fromY, toX, toY float64, options ...option.ActionOption) (err error) { +func (wd *StubBrowserDriver) Drag(fromX, fromY, toX, toY float64, options ...option.ActionOption) (err error) { data := map[string]interface{}{ "from_x": fromX, "from_y": fromY, @@ -127,7 +125,7 @@ func (wd *BrowserWebDriver) Drag(fromX, fromY, toX, toY float64, options ...opti return } -func (wd *BrowserWebDriver) AppLaunch(packageName string) (err error) { +func (wd *StubBrowserDriver) AppLaunch(packageName string) (err error) { data := map[string]interface{}{ "url": packageName, } @@ -136,7 +134,7 @@ func (wd *BrowserWebDriver) AppLaunch(packageName string) (err error) { return } -func (wd *BrowserWebDriver) DeleteSession() (err error) { +func (wd *StubBrowserDriver) DeleteSession() (err error) { url := wd.concatURL("context", wd.sessionId) @@ -170,7 +168,7 @@ func (wd *BrowserWebDriver) DeleteSession() (err error) { return nil } -func (wd *BrowserWebDriver) Scroll(delta int) (err error) { +func (wd *StubBrowserDriver) Scroll(delta int) (err error) { data := map[string]interface{}{ "delta": delta, } @@ -178,7 +176,7 @@ func (wd *BrowserWebDriver) Scroll(delta int) (err error) { return err } -func (wd *BrowserWebDriver) CreateNetListener() (*websocket.Conn, error) { +func (wd *StubBrowserDriver) CreateNetListener() (*websocket.Conn, error) { webSocketUrl := "ws://localhost:8093/websocket_net_listen" c, _, err := websocket.DefaultDialer.Dial(webSocketUrl, nil) if err != nil { @@ -193,7 +191,7 @@ func (wd *BrowserWebDriver) CreateNetListener() (*websocket.Conn, error) { return c, nil } -func (wd *BrowserWebDriver) ClosePage(pageIndex int) (err error) { +func (wd *StubBrowserDriver) ClosePage(pageIndex int) (err error) { data := map[string]interface{}{ "page_index": pageIndex, } @@ -201,7 +199,7 @@ func (wd *BrowserWebDriver) ClosePage(pageIndex int) (err error) { return err } -func (wd *BrowserWebDriver) HoverBySelector(selector string, options ...option.ActionOption) (err error) { +func (wd *StubBrowserDriver) HoverBySelector(selector string, options ...option.ActionOption) (err error) { data := map[string]interface{}{ "selector": selector, } @@ -213,7 +211,7 @@ func (wd *BrowserWebDriver) HoverBySelector(selector string, options ...option.A return err } -func (wd *BrowserWebDriver) tapBySelector(selector string, options ...option.ActionOption) (err error) { +func (wd *StubBrowserDriver) tapBySelector(selector string, options ...option.ActionOption) (err error) { data := map[string]interface{}{ "selector": selector, } @@ -225,7 +223,7 @@ func (wd *BrowserWebDriver) tapBySelector(selector string, options ...option.Act return err } -func (wd *BrowserWebDriver) RightClick(x, y int) (err error) { +func (wd *StubBrowserDriver) RightClick(x, y int) (err error) { data := map[string]interface{}{ "x": x, "y": y, @@ -234,7 +232,7 @@ func (wd *BrowserWebDriver) RightClick(x, y int) (err error) { return err } -func (wd *BrowserWebDriver) RightclickbySelector(selector string, options ...option.ActionOption) (err error) { +func (wd *StubBrowserDriver) RightclickbySelector(selector string, options ...option.ActionOption) (err error) { data := map[string]interface{}{ "selector": selector, } @@ -246,7 +244,7 @@ func (wd *BrowserWebDriver) RightclickbySelector(selector string, options ...opt return err } -func (wd *BrowserWebDriver) GetElementTextBySelector(selector string, options ...option.ActionOption) (text string, err error) { +func (wd *StubBrowserDriver) GetElementTextBySelector(selector string, options ...option.ActionOption) (text string, err error) { actionOptions := option.NewActionOptions(options...) uri := "ui/element_text?selector=" + selector if actionOptions.Index > 0 { @@ -260,7 +258,7 @@ func (wd *BrowserWebDriver) GetElementTextBySelector(selector string, options .. return data["text"].(string), nil } -func (wd *BrowserWebDriver) GetPageUrl(options ...option.ActionOption) (text string, err error) { +func (wd *StubBrowserDriver) GetPageUrl(options ...option.ActionOption) (text string, err error) { uri := "ui/page_url" actionOptions := option.NewActionOptions(options...) if actionOptions.Index > 0 { @@ -274,7 +272,7 @@ func (wd *BrowserWebDriver) GetPageUrl(options ...option.ActionOption) (text str return data["url"].(string), nil } -func (wd *BrowserWebDriver) IsElementExistBySelector(selector string) (bool, error) { +func (wd *StubBrowserDriver) IsElementExistBySelector(selector string) (bool, error) { resp, err := wd.httpGet(wd.sessionId, "ui/element_exist", "?selector=", selector) if err != nil { return false, err @@ -283,7 +281,7 @@ func (wd *BrowserWebDriver) IsElementExistBySelector(selector string) (bool, err return data["exist"].(bool), nil } -func (wd *BrowserWebDriver) Hover(x, y float64) (err error) { +func (wd *StubBrowserDriver) Hover(x, y float64) (err error) { data := map[string]interface{}{ "x": x, "y": y, @@ -292,7 +290,7 @@ func (wd *BrowserWebDriver) Hover(x, y float64) (err error) { return err } -func (wd *BrowserWebDriver) DoubleTapXY(x, y float64, option ...option.ActionOption) (err error) { +func (wd *StubBrowserDriver) DoubleTapXY(x, y float64, option ...option.ActionOption) (err error) { data := map[string]interface{}{ "x": x, "y": y, @@ -301,7 +299,7 @@ func (wd *BrowserWebDriver) DoubleTapXY(x, y float64, option ...option.ActionOpt return err } -func (wd *BrowserWebDriver) Input(text string, option ...option.ActionOption) (err error) { +func (wd *StubBrowserDriver) Input(text string, option ...option.ActionOption) (err error) { data := map[string]interface{}{ "text": text, } @@ -310,7 +308,7 @@ func (wd *BrowserWebDriver) Input(text string, option ...option.ActionOption) (e } // Source Return application elements tree -func (wd *BrowserWebDriver) Source(srcOpt ...option.SourceOption) (string, error) { +func (wd *StubBrowserDriver) Source(srcOpt ...option.SourceOption) (string, error) { resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "stub/source") if err != nil { @@ -326,7 +324,7 @@ func (wd *BrowserWebDriver) Source(srcOpt ...option.SourceOption) (string, error return string(jsonData), err } -func (wd *BrowserWebDriver) ScreenShot(options ...option.ActionOption) (*bytes.Buffer, error) { +func (wd *StubBrowserDriver) ScreenShot(options ...option.ActionOption) (*bytes.Buffer, error) { resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "screenshot") if err != nil { return nil, err @@ -339,7 +337,7 @@ func (wd *BrowserWebDriver) ScreenShot(options ...option.ActionOption) (*bytes.B return res, err } -func (wd *BrowserWebDriver) httpPOST(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { +func (wd *StubBrowserDriver) httpPOST(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { var bsJSON []byte = nil if data != nil { if bsJSON, err = json.Marshal(data); err != nil { @@ -350,19 +348,19 @@ func (wd *BrowserWebDriver) httpPOST(data interface{}, pathElem ...string) (resp return wd.httpRequest(http.MethodPost, wd.concatURL(pathElem...), bsJSON) } -func (wd *BrowserWebDriver) httpGet(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { +func (wd *StubBrowserDriver) httpGet(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { return wd.httpRequest(http.MethodGet, wd.concatURL(pathElem...), nil) } -func (wd *BrowserWebDriver) concatURL(elem ...string) string { +func (wd *StubBrowserDriver) concatURL(elem ...string) string { tmp, _ := url.Parse(wd.urlPrefix.String()) commonPath := path.Join(append([]string{wd.urlPrefix.Path}, "api/v1/")...) tmp.Path = path.Join(append([]string{commonPath}, elem...)...) return tmp.String() } -func (wd *BrowserWebDriver) httpRequest(method string, rawURL string, rawBody []byte, disableRetry ...bool) (response *WebAgentResponse, err error) { +func (wd *StubBrowserDriver) httpRequest(method string, rawURL string, rawBody []byte, disableRetry ...bool) (response *WebAgentResponse, err error) { req, err := http.NewRequest(method, rawURL, bytes.NewBuffer(rawBody)) req.Header.Set("Content-Type", "application/json") @@ -403,7 +401,7 @@ func (wd *BrowserWebDriver) httpRequest(method string, rawURL string, rawBody [] return &result, err } -func (wd *BrowserWebDriver) LoginNoneUI(packageName, phoneNumber string, captcha, password string) (info AppLoginInfo, err error) { +func (wd *StubBrowserDriver) LoginNoneUI(packageName, phoneNumber string, captcha, password string) (info AppLoginInfo, err error) { data := map[string]interface{}{ "url": packageName, "web_cookie": password, @@ -421,7 +419,7 @@ func (wd *BrowserWebDriver) LoginNoneUI(packageName, phoneNumber string, captcha return loginSuccss, err } -func (wd *BrowserWebDriver) WindowSize() (types.Size, error) { +func (wd *StubBrowserDriver) WindowSize() (types.Size, error) { resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "window_size") if err != nil { return types.Size{}, err @@ -435,7 +433,7 @@ func (wd *BrowserWebDriver) WindowSize() (types.Size, error) { }, nil } -func (wd *BrowserWebDriver) TapFloat(x, y float64, options ...option.ActionOption) error { +func (wd *StubBrowserDriver) TapFloat(x, y float64, options ...option.ActionOption) error { actionOptions := option.NewActionOptions(options...) duration := 0.1 if actionOptions.Duration > 0 { @@ -451,7 +449,7 @@ func (wd *BrowserWebDriver) TapFloat(x, y float64, options ...option.ActionOptio } // DoubleTap Sends a double tap event at the coordinate. -func (wd *BrowserWebDriver) DoubleTap(x, y float64, options ...option.ActionOption) error { +func (wd *StubBrowserDriver) DoubleTap(x, y float64, options ...option.ActionOption) error { data := map[string]interface{}{ "x": x, "y": y, @@ -459,7 +457,7 @@ func (wd *BrowserWebDriver) DoubleTap(x, y float64, options ...option.ActionOpti _, err := wd.httpPOST(data, wd.sessionId, "ui/double_tap") return err } -func (wd *BrowserWebDriver) UploadFile(x, y float64, FileUrl, FileFormat string) (err error) { +func (wd *StubBrowserDriver) UploadFile(x, y float64, FileUrl, FileFormat string) (err error) { data := map[string]interface{}{ "x": x, "y": y, From 00a6cb5312eefa97f9c8af13e4bea6f1044eeb04 Mon Sep 17 00:00:00 2001 From: "huangbin.beal@163.com" Date: Thu, 20 Feb 2025 10:53:35 +0800 Subject: [PATCH 2/3] fix: stub --- pkg/uixt/browser_web_driver.go | 46 +-- pkg/uixt/driver_ext/browser_sub_driver.go | 335 +--------------------- 2 files changed, 25 insertions(+), 356 deletions(-) diff --git a/pkg/uixt/browser_web_driver.go b/pkg/uixt/browser_web_driver.go index 9690843a..d1b33864 100644 --- a/pkg/uixt/browser_web_driver.go +++ b/pkg/uixt/browser_web_driver.go @@ -121,7 +121,7 @@ func (wd *BrowserWebDriver) Drag(fromX, fromY, toX, toY float64, options ...opti data["duration"] = actionOptions.Duration } - _, err = wd.httpPOST(data, wd.sessionId, "ui/drag") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/drag") return } @@ -130,7 +130,7 @@ func (wd *BrowserWebDriver) AppLaunch(packageName string) (err error) { "url": packageName, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/page_launch") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/page_launch") return } @@ -172,7 +172,7 @@ func (wd *BrowserWebDriver) Scroll(delta int) (err error) { data := map[string]interface{}{ "delta": delta, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/scroll") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/scroll") return err } @@ -195,7 +195,7 @@ func (wd *BrowserWebDriver) ClosePage(pageIndex int) (err error) { data := map[string]interface{}{ "page_index": pageIndex, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/page_close") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/page_close") return err } @@ -207,7 +207,7 @@ func (wd *BrowserWebDriver) HoverBySelector(selector string, options ...option.A if actionOptions.Index > 0 { data["element_index"] = actionOptions.Index } - _, err = wd.httpPOST(data, wd.sessionId, "ui/hover") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/hover") return err } @@ -219,7 +219,7 @@ func (wd *BrowserWebDriver) tapBySelector(selector string, options ...option.Act if actionOptions.Index > 0 { data["element_index"] = actionOptions.Index } - _, err = wd.httpPOST(data, wd.sessionId, "ui/tap") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/tap") return err } @@ -228,7 +228,7 @@ func (wd *BrowserWebDriver) RightClick(x, y int) (err error) { "x": x, "y": y, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/right_click") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/right_click") return err } @@ -240,7 +240,7 @@ func (wd *BrowserWebDriver) RightclickbySelector(selector string, options ...opt if actionOptions.Index > 0 { data["element_index"] = actionOptions.Index } - _, err = wd.httpPOST(data, wd.sessionId, "ui/right_click") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/right_click") return err } @@ -250,7 +250,7 @@ func (wd *BrowserWebDriver) GetElementTextBySelector(selector string, options .. if actionOptions.Index > 0 { uri = uri + "&element_index=" + fmt.Sprintf("%v", actionOptions.Index) } - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, uri) + resp, err := wd.HttpGet(http.MethodGet, wd.sessionId, uri) if err != nil { return "", err } @@ -264,7 +264,7 @@ func (wd *BrowserWebDriver) GetPageUrl(options ...option.ActionOption) (text str if actionOptions.Index > 0 { uri = uri + "?page_index=" + fmt.Sprintf("%v", actionOptions.Index) } - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, uri) + resp, err := wd.HttpGet(http.MethodGet, wd.sessionId, uri) if err != nil { return "", err } @@ -273,7 +273,7 @@ func (wd *BrowserWebDriver) GetPageUrl(options ...option.ActionOption) (text str } func (wd *BrowserWebDriver) IsElementExistBySelector(selector string) (bool, error) { - resp, err := wd.httpGet(wd.sessionId, "ui/element_exist", "?selector=", selector) + resp, err := wd.HttpGet(wd.sessionId, "ui/element_exist", "?selector=", selector) if err != nil { return false, err } @@ -286,7 +286,7 @@ func (wd *BrowserWebDriver) Hover(x, y float64) (err error) { "x": x, "y": y, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/hover") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/hover") return err } @@ -295,7 +295,7 @@ func (wd *BrowserWebDriver) DoubleTapXY(x, y float64, option ...option.ActionOpt "x": x, "y": y, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/double_tap") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/double_tap") return err } @@ -303,13 +303,13 @@ func (wd *BrowserWebDriver) Input(text string, option ...option.ActionOption) (e data := map[string]interface{}{ "text": text, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/input") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/input") return err } // Source Return application elements tree func (wd *BrowserWebDriver) Source(srcOpt ...option.SourceOption) (string, error) { - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "stub/source") + resp, err := wd.HttpGet(http.MethodGet, wd.sessionId, "stub/source") if err != nil { return "", err @@ -325,7 +325,7 @@ func (wd *BrowserWebDriver) Source(srcOpt ...option.SourceOption) (string, error } func (wd *BrowserWebDriver) ScreenShot(options ...option.ActionOption) (*bytes.Buffer, error) { - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "screenshot") + resp, err := wd.HttpGet(http.MethodGet, wd.sessionId, "screenshot") if err != nil { return nil, err } @@ -337,7 +337,7 @@ func (wd *BrowserWebDriver) ScreenShot(options ...option.ActionOption) (*bytes.B return res, err } -func (wd *BrowserWebDriver) httpPOST(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { +func (wd *BrowserWebDriver) HttpPOST(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { var bsJSON []byte = nil if data != nil { if bsJSON, err = json.Marshal(data); err != nil { @@ -348,7 +348,7 @@ func (wd *BrowserWebDriver) httpPOST(data interface{}, pathElem ...string) (resp return wd.httpRequest(http.MethodPost, wd.concatURL(pathElem...), bsJSON) } -func (wd *BrowserWebDriver) httpGet(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { +func (wd *BrowserWebDriver) HttpGet(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { return wd.httpRequest(http.MethodGet, wd.concatURL(pathElem...), nil) } @@ -417,7 +417,7 @@ func (wd *BrowserWebDriver) BatteryInfo() (batteryInfo types.BatteryInfo, err er } func (wd *BrowserWebDriver) WindowSize() (types.Size, error) { - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "window_size") + resp, err := wd.HttpGet(http.MethodGet, wd.sessionId, "window_size") if err != nil { return types.Size{}, err } @@ -498,7 +498,7 @@ func (wd *BrowserWebDriver) TapFloat(x, y float64, options ...option.ActionOptio "y": y, "duration": duration, } - _, err := wd.httpPOST(data, wd.sessionId, "ui/tap") + _, err := wd.HttpPOST(data, wd.sessionId, "ui/tap") return err } @@ -508,7 +508,7 @@ func (wd *BrowserWebDriver) DoubleTap(x, y float64, options ...option.ActionOpti "x": x, "y": y, } - _, err := wd.httpPOST(data, wd.sessionId, "ui/double_tap") + _, err := wd.HttpPOST(data, wd.sessionId, "ui/double_tap") return err } func (wd *BrowserWebDriver) UploadFile(x, y float64, FileUrl, FileFormat string) (err error) { @@ -518,7 +518,7 @@ func (wd *BrowserWebDriver) UploadFile(x, y float64, FileUrl, FileFormat string) "file_url": FileUrl, "file_format": FileFormat, } - _, err = wd.httpPOST(data, wd.sessionId, "ui/upload") + _, err = wd.HttpPOST(data, wd.sessionId, "ui/upload") return err } @@ -566,7 +566,7 @@ func (wd *BrowserWebDriver) ForegroundInfo() (app types.AppInfo, err error) { // PressBack Presses the back button func (wd *BrowserWebDriver) PressBack(options ...option.ActionOption) error { - _, err := wd.httpPOST(map[string]interface{}{}, wd.sessionId, "ui/back") + _, err := wd.HttpPOST(map[string]interface{}{}, wd.sessionId, "ui/back") return err } diff --git a/pkg/uixt/driver_ext/browser_sub_driver.go b/pkg/uixt/driver_ext/browser_sub_driver.go index 8c36af9e..8bdedef6 100644 --- a/pkg/uixt/driver_ext/browser_sub_driver.go +++ b/pkg/uixt/driver_ext/browser_sub_driver.go @@ -2,21 +2,16 @@ package driver_ext import ( "bytes" - "encoding/base64" "encoding/json" "fmt" "io" "net/http" "net/url" - "path" "time" - "github.com/gorilla/websocket" "github.com/httprunner/httprunner/v5/pkg/uixt" "github.com/httprunner/httprunner/v5/pkg/uixt/option" - "github.com/httprunner/httprunner/v5/pkg/uixt/types" "github.com/pkg/errors" - "github.com/rs/zerolog/log" ) const BROWSER_LOCAL_ADDRESS = "localhost:8093" @@ -107,209 +102,9 @@ func NewStubBrowserDriver(browserId string) (driver *StubBrowserDriver, err erro return driver, nil } -func (wd *StubBrowserDriver) Drag(fromX, fromY, toX, toY float64, options ...option.ActionOption) (err error) { - data := map[string]interface{}{ - "from_x": fromX, - "from_y": fromY, - "to_x": toX, - "to_y": toY, - } - - actionOptions := option.NewActionOptions(options...) - - if actionOptions.Duration > 0 { - data["duration"] = actionOptions.Duration - } - - _, err = wd.httpPOST(data, wd.sessionId, "ui/drag") - return -} - -func (wd *StubBrowserDriver) AppLaunch(packageName string) (err error) { - data := map[string]interface{}{ - "url": packageName, - } - - _, err = wd.httpPOST(data, wd.sessionId, "ui/page_launch") - return -} - -func (wd *StubBrowserDriver) DeleteSession() (err error) { - - url := wd.concatURL("context", wd.sessionId) - - req, err := http.NewRequest("DELETE", url, nil) - if err != nil { - panic(err) - } - client := &http.Client{ - Timeout: 60 * time.Second, // 设置超时时间为5秒 - } - resp, err := client.Do(req) - - if err != nil { - return err - } - - rawResp, err := io.ReadAll(resp.Body) - - if resp.StatusCode != http.StatusOK { - return errors.New(resp.Status) - } - - var result CreateBrowserResponse - if err = json.Unmarshal(rawResp, &result); err != nil { - return err - } - - if result.Code != 0 { - return errors.New(result.Message) - } - return nil -} - -func (wd *StubBrowserDriver) Scroll(delta int) (err error) { - data := map[string]interface{}{ - "delta": delta, - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/scroll") - return err -} - -func (wd *StubBrowserDriver) CreateNetListener() (*websocket.Conn, error) { - webSocketUrl := "ws://localhost:8093/websocket_net_listen" - c, _, err := websocket.DefaultDialer.Dial(webSocketUrl, nil) - if err != nil { - return nil, err - } - // 发送消息 - initMessage := fmt.Sprintf(`{ - "type":"create_net_listener", - "context_id":"%v" - }`, wd.sessionId) - err = c.WriteMessage(websocket.TextMessage, []byte(initMessage)) - return c, nil -} - -func (wd *StubBrowserDriver) ClosePage(pageIndex int) (err error) { - data := map[string]interface{}{ - "page_index": pageIndex, - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/page_close") - return err -} - -func (wd *StubBrowserDriver) HoverBySelector(selector string, options ...option.ActionOption) (err error) { - data := map[string]interface{}{ - "selector": selector, - } - actionOptions := option.NewActionOptions(options...) - if actionOptions.Index > 0 { - data["element_index"] = actionOptions.Index - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/hover") - return err -} - -func (wd *StubBrowserDriver) tapBySelector(selector string, options ...option.ActionOption) (err error) { - data := map[string]interface{}{ - "selector": selector, - } - actionOptions := option.NewActionOptions(options...) - if actionOptions.Index > 0 { - data["element_index"] = actionOptions.Index - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/tap") - return err -} - -func (wd *StubBrowserDriver) RightClick(x, y int) (err error) { - data := map[string]interface{}{ - "x": x, - "y": y, - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/right_click") - return err -} - -func (wd *StubBrowserDriver) RightclickbySelector(selector string, options ...option.ActionOption) (err error) { - data := map[string]interface{}{ - "selector": selector, - } - actionOptions := option.NewActionOptions(options...) - if actionOptions.Index > 0 { - data["element_index"] = actionOptions.Index - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/right_click") - return err -} - -func (wd *StubBrowserDriver) GetElementTextBySelector(selector string, options ...option.ActionOption) (text string, err error) { - actionOptions := option.NewActionOptions(options...) - uri := "ui/element_text?selector=" + selector - if actionOptions.Index > 0 { - uri = uri + "&element_index=" + fmt.Sprintf("%v", actionOptions.Index) - } - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, uri) - if err != nil { - return "", err - } - data := resp.Data.(map[string]interface{}) - return data["text"].(string), nil -} - -func (wd *StubBrowserDriver) GetPageUrl(options ...option.ActionOption) (text string, err error) { - uri := "ui/page_url" - actionOptions := option.NewActionOptions(options...) - if actionOptions.Index > 0 { - uri = uri + "?page_index=" + fmt.Sprintf("%v", actionOptions.Index) - } - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, uri) - if err != nil { - return "", err - } - data := resp.Data.(map[string]interface{}) - return data["url"].(string), nil -} - -func (wd *StubBrowserDriver) IsElementExistBySelector(selector string) (bool, error) { - resp, err := wd.httpGet(wd.sessionId, "ui/element_exist", "?selector=", selector) - if err != nil { - return false, err - } - data := resp.Data.(map[string]interface{}) - return data["exist"].(bool), nil -} - -func (wd *StubBrowserDriver) Hover(x, y float64) (err error) { - data := map[string]interface{}{ - "x": x, - "y": y, - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/hover") - return err -} - -func (wd *StubBrowserDriver) DoubleTapXY(x, y float64, option ...option.ActionOption) (err error) { - data := map[string]interface{}{ - "x": x, - "y": y, - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/double_tap") - return err -} - -func (wd *StubBrowserDriver) Input(text string, option ...option.ActionOption) (err error) { - data := map[string]interface{}{ - "text": text, - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/input") - return err -} - // Source Return application elements tree func (wd *StubBrowserDriver) Source(srcOpt ...option.SourceOption) (string, error) { - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "stub/source") + resp, err := wd.BrowserWebDriver.HttpGet(http.MethodGet, wd.sessionId, "stub/source") if err != nil { return "", err @@ -324,89 +119,12 @@ func (wd *StubBrowserDriver) Source(srcOpt ...option.SourceOption) (string, erro return string(jsonData), err } -func (wd *StubBrowserDriver) ScreenShot(options ...option.ActionOption) (*bytes.Buffer, error) { - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "screenshot") - if err != nil { - return nil, err - } - data := resp.Data.(map[string]interface{}) - screenshotBase64 := data["screenshot"].(string) - screenRaw, err := base64.StdEncoding.DecodeString(screenshotBase64) - res := bytes.NewBuffer(screenRaw) - - return res, err -} - -func (wd *StubBrowserDriver) httpPOST(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { - var bsJSON []byte = nil - if data != nil { - if bsJSON, err = json.Marshal(data); err != nil { - return nil, err - } - } - - return wd.httpRequest(http.MethodPost, wd.concatURL(pathElem...), bsJSON) -} - -func (wd *StubBrowserDriver) httpGet(data interface{}, pathElem ...string) (response *WebAgentResponse, err error) { - - return wd.httpRequest(http.MethodGet, wd.concatURL(pathElem...), nil) -} - -func (wd *StubBrowserDriver) concatURL(elem ...string) string { - tmp, _ := url.Parse(wd.urlPrefix.String()) - commonPath := path.Join(append([]string{wd.urlPrefix.Path}, "api/v1/")...) - tmp.Path = path.Join(append([]string{commonPath}, elem...)...) - return tmp.String() -} - -func (wd *StubBrowserDriver) httpRequest(method string, rawURL string, rawBody []byte, disableRetry ...bool) (response *WebAgentResponse, err error) { - req, err := http.NewRequest(method, rawURL, bytes.NewBuffer(rawBody)) - req.Header.Set("Content-Type", "application/json") - - if err != nil { - return nil, err - } - - // 新建http client - client := &http.Client{ - Timeout: 60 * time.Second, // 设置超时时间为5秒 - } - resp, err := client.Do(req) - - if err != nil { - return nil, err - } - - rawResp, err := io.ReadAll(resp.Body) - - if resp.StatusCode != http.StatusOK { - return nil, errors.New(resp.Status) - } - - // 将结果解析为 JSON - var result WebAgentResponse - if err = json.Unmarshal(rawResp, &result); err != nil { - return nil, err - } - - if result.Code != 0 { - log.Info().Msgf("%v", result.Message) - return nil, errors.New(result.Message) - } - - if err != nil { - return nil, err - } - return &result, err -} - func (wd *StubBrowserDriver) LoginNoneUI(packageName, phoneNumber string, captcha, password string) (info AppLoginInfo, err error) { data := map[string]interface{}{ "url": packageName, "web_cookie": password, } - _, err = wd.httpPOST(data, wd.sessionId, "stub/login") + _, err = wd.HttpPOST(data, wd.sessionId, "stub/login") if err != nil { return info, err @@ -418,52 +136,3 @@ func (wd *StubBrowserDriver) LoginNoneUI(packageName, phoneNumber string, captch } return loginSuccss, err } - -func (wd *StubBrowserDriver) WindowSize() (types.Size, error) { - resp, err := wd.httpGet(http.MethodGet, wd.sessionId, "window_size") - if err != nil { - return types.Size{}, err - } - data := resp.Data.(map[string]interface{}) - width := data["width"] - height := data["height"] - return types.Size{ - Width: int(width.(float64)), - Height: int(height.(float64)), - }, nil -} - -func (wd *StubBrowserDriver) TapFloat(x, y float64, options ...option.ActionOption) error { - actionOptions := option.NewActionOptions(options...) - duration := 0.1 - if actionOptions.Duration > 0 { - duration = actionOptions.Duration - } - data := map[string]interface{}{ - "x": x, - "y": y, - "duration": duration, - } - _, err := wd.httpPOST(data, wd.sessionId, "ui/tap") - return err -} - -// DoubleTap Sends a double tap event at the coordinate. -func (wd *StubBrowserDriver) DoubleTap(x, y float64, options ...option.ActionOption) error { - data := map[string]interface{}{ - "x": x, - "y": y, - } - _, err := wd.httpPOST(data, wd.sessionId, "ui/double_tap") - return err -} -func (wd *StubBrowserDriver) UploadFile(x, y float64, FileUrl, FileFormat string) (err error) { - data := map[string]interface{}{ - "x": x, - "y": y, - "file_url": FileUrl, - "file_format": FileFormat, - } - _, err = wd.httpPOST(data, wd.sessionId, "ui/upload") - return err -} From 6a6c1e09eff6b316d4f927ca54cd8ed46d66da96 Mon Sep 17 00:00:00 2001 From: "huangbin.beal@163.com" Date: Thu, 20 Feb 2025 12:22:05 +0800 Subject: [PATCH 3/3] fix: browser driver --- pkg/uixt/driver.go | 13 +++++++++++++ pkg/uixt/driver_ext/ext.go | 4 ++++ server/ui.go | 7 +++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pkg/uixt/driver.go b/pkg/uixt/driver.go index 1e063c5b..25e5b903 100644 --- a/pkg/uixt/driver.go +++ b/pkg/uixt/driver.go @@ -101,9 +101,22 @@ func (dExt *XTDriver) GetIDriver() IDriver { return dExt.IDriver } +func (dExt *XTDriver) GetWebDriver() IBrowserWebDriver { + return dExt.GetIDriver().(*BrowserWebDriver) +} + type IXTDriver interface { IDriver GetIDriver() IDriver + GetWebDriver() IBrowserWebDriver GetScreenResult(opts ...option.ActionOption) (screenResult *ScreenResult, err error) DoAction(action MobileAction) (err error) } + +type IBrowserWebDriver interface { + IDriver + Hover(x, y float64) (err error) + RightClick(x, y int) (err error) + Scroll(delta int) (err error) + UploadFile(x, y float64, FileUrl, FileFormat string) (err error) +} diff --git a/pkg/uixt/driver_ext/ext.go b/pkg/uixt/driver_ext/ext.go index b55a1f91..e49ffc76 100644 --- a/pkg/uixt/driver_ext/ext.go +++ b/pkg/uixt/driver_ext/ext.go @@ -68,3 +68,7 @@ func (dExt *XTDriver) Install(filePath string, opts ...option.InstallOption) err return dExt.GetDevice().Install(filePath, opts...) } + +func (dExt *XTDriver) GetWebDriver() uixt.IBrowserWebDriver { + return dExt.GetIDriver().(*StubBrowserDriver) +} diff --git a/server/ui.go b/server/ui.go index 0c65b9f1..77cb48de 100644 --- a/server/ui.go +++ b/server/ui.go @@ -2,7 +2,6 @@ package server import ( "github.com/gin-gonic/gin" - "github.com/httprunner/httprunner/v5/pkg/uixt" "github.com/httprunner/httprunner/v5/pkg/uixt/option" ) @@ -42,7 +41,7 @@ func (r *Router) uploadHandler(c *gin.Context) { RenderError(c, err) return } - err = driver.GetIDriver().(*uixt.BrowserWebDriver).UploadFile(uploadRequest.X, uploadRequest.Y, uploadRequest.FileUrl, uploadRequest.FileFormat) + err = driver.GetWebDriver().UploadFile(uploadRequest.X, uploadRequest.Y, uploadRequest.FileUrl, uploadRequest.FileFormat) if err != nil { c.Abort() return @@ -62,7 +61,7 @@ func (r *Router) hoverHandler(c *gin.Context) { return } - err = driver.GetIDriver().(*uixt.BrowserWebDriver).Hover(hoverReq.X, hoverReq.Y) + err = driver.GetWebDriver().Hover(hoverReq.X, hoverReq.Y) if err != nil { RenderError(c, err) @@ -84,7 +83,7 @@ func (r *Router) scrollHandler(c *gin.Context) { return } - err = driver.GetIDriver().(*uixt.BrowserWebDriver).Scroll(scrollReq.Delta) + err = driver.GetWebDriver().Scroll(scrollReq.Delta) if err != nil { RenderError(c, err)