From 7f837c9e36048b88d4ab83dab07bcfe43e4dfad8 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Tue, 4 Mar 2025 17:26:55 +0800 Subject: [PATCH] refactor & fix: stub driver and server --- cmd/server.go | 1 + internal/version/VERSION | 2 +- pkg/uixt/driver.go | 26 +----------------- pkg/uixt/driver_ext/android_stub_driver.go | 4 +++ pkg/uixt/driver_ext/browser_sub_driver.go | 4 +++ pkg/uixt/driver_ext/ext.go | 32 ++++++++++++---------- pkg/uixt/driver_ext/ios_stub_driver.go | 4 +++ server/app.go | 2 +- server/context.go | 13 ++++++--- server/ext/app.go | 3 +- server/ext/context.go | 14 +++++++--- server/ext/handler.go | 15 +++++----- server/ext/main.go | 11 +------- server/key.go | 2 +- server/main.go | 16 ++--------- server/ui.go | 14 +++++++--- 16 files changed, 75 insertions(+), 88 deletions(-) diff --git a/cmd/server.go b/cmd/server.go index 053fd3c8..052e3739 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -14,6 +14,7 @@ var serverCmd = &cobra.Command{ Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { return server_ext.NewExtRouter().Run(port) + // return server.NewRouter().Run(port) }, } diff --git a/internal/version/VERSION b/internal/version/VERSION index d535e8f1..c9cf3bd5 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0+2503041108 +v5.0.0+2503041726 diff --git a/pkg/uixt/driver.go b/pkg/uixt/driver.go index 6bec377e..66b5cae2 100644 --- a/pkg/uixt/driver.go +++ b/pkg/uixt/driver.go @@ -16,6 +16,7 @@ var ( _ IDriver = (*UIA2Driver)(nil) _ IDriver = (*WDADriver)(nil) _ IDriver = (*HDCDriver)(nil) + _ IDriver = (*BrowserDriver)(nil) ) // current implemeted driver: ADBDriver, UIA2Driver, WDADriver, HDCDriver @@ -96,28 +97,3 @@ type XTDriver struct { // cache screenshot results screenResults []*ScreenResult } - -func (dExt *XTDriver) GetIDriver() IDriver { - return dExt.IDriver -} - -func (dExt *XTDriver) GetWebDriver() IBrowserWebDriver { - return dExt.GetIDriver().(*BrowserDriver) -} - -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 float64) (err error) - Scroll(delta int) (err error) - // TODO: move x,y parameters to option - UploadFile(x, y float64, FileUrl, FileFormat string) (err error) -} diff --git a/pkg/uixt/driver_ext/android_stub_driver.go b/pkg/uixt/driver_ext/android_stub_driver.go index 0b9b9512..c0b2b80b 100644 --- a/pkg/uixt/driver_ext/android_stub_driver.go +++ b/pkg/uixt/driver_ext/android_stub_driver.go @@ -53,6 +53,10 @@ func NewStubAndroidDriver(dev *uixt.AndroidDevice) (*StubAndroidDriver, error) { return driver, nil } +func (sad *StubAndroidDriver) GetDriver() uixt.IDriver { + return sad.ADBDriver +} + func (sad *StubAndroidDriver) Setup() error { socketLocalPort, err := sad.Device.Forward(StubSocketName) if err != nil { diff --git a/pkg/uixt/driver_ext/browser_sub_driver.go b/pkg/uixt/driver_ext/browser_sub_driver.go index f2c47f7f..55c43119 100644 --- a/pkg/uixt/driver_ext/browser_sub_driver.go +++ b/pkg/uixt/driver_ext/browser_sub_driver.go @@ -27,6 +27,10 @@ func NewStubBrowserDriver(device *uixt.BrowserDevice) (driver *StubBrowserDriver return driver, nil } +func (wd *StubBrowserDriver) GetDriver() uixt.IDriver { + return wd.BrowserDriver +} + // Source Return application elements tree func (wd *StubBrowserDriver) Source(srcOpt ...option.SourceOption) (string, error) { resp, err := wd.BrowserDriver.HttpGet(http.MethodGet, wd.sessionId, "stub/source") diff --git a/pkg/uixt/driver_ext/ext.go b/pkg/uixt/driver_ext/ext.go index 5473394a..0c81f006 100644 --- a/pkg/uixt/driver_ext/ext.go +++ b/pkg/uixt/driver_ext/ext.go @@ -1,40 +1,46 @@ package driver_ext import ( - "github.com/rs/zerolog/log" "time" + "github.com/rs/zerolog/log" + "github.com/httprunner/httprunner/v5/pkg/uixt" "github.com/httprunner/httprunner/v5/pkg/uixt/ai" "github.com/httprunner/httprunner/v5/pkg/uixt/option" ) -type IStubDriver interface { - uixt.IDriver +var ( + _ IStubDriver = (*StubAndroidDriver)(nil) + _ IStubDriver = (*StubIOSDriver)(nil) + _ IStubDriver = (*StubBrowserDriver)(nil) +) +type IStubDriver interface { + GetDriver() uixt.IDriver LoginNoneUI(packageName, phoneNumber, captcha, password string) (info AppLoginInfo, err error) LogoutNoneUI(packageName string) error } -func NewXTDriver(driver IStubDriver, opts ...ai.AIServiceOption) *XTDriver { +func NewStubXTDriver(stubDriver IStubDriver, opts ...ai.AIServiceOption) *StubXTDriver { services := ai.NewAIService(opts...) - driverExt := &XTDriver{ + driverExt := &StubXTDriver{ XTDriver: &uixt.XTDriver{ - IDriver: driver, + IDriver: stubDriver.GetDriver(), CVService: services.ICVService, LLMService: services.ILLMService, }, - IStubDriver: driver, + IStubDriver: stubDriver, } return driverExt } -type XTDriver struct { - IStubDriver +type StubXTDriver struct { *uixt.XTDriver + IStubDriver } -func (dExt *XTDriver) InstallByUrl(url string, opts ...option.InstallOption) error { +func (dExt *StubXTDriver) InstallByUrl(url string, opts ...option.InstallOption) error { appPath, err := uixt.DownloadFileByUrl(url) if err != nil { return err @@ -46,7 +52,7 @@ func (dExt *XTDriver) InstallByUrl(url string, opts ...option.InstallOption) err return nil } -func (dExt *XTDriver) Install(filePath string, opts ...option.InstallOption) error { +func (dExt *StubXTDriver) Install(filePath string, opts ...option.InstallOption) error { if _, ok := dExt.GetDevice().(*uixt.AndroidDevice); ok { stopChan := make(chan struct{}) go func() { @@ -73,7 +79,3 @@ 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/pkg/uixt/driver_ext/ios_stub_driver.go b/pkg/uixt/driver_ext/ios_stub_driver.go index 8ea346ab..f93c7fa7 100644 --- a/pkg/uixt/driver_ext/ios_stub_driver.go +++ b/pkg/uixt/driver_ext/ios_stub_driver.go @@ -56,6 +56,10 @@ func (s *StubIOSDriver) SetupWda() (err error) { return err } +func (s *StubIOSDriver) GetDriver() uixt.IDriver { + return s.WDADriver +} + func (s *StubIOSDriver) Setup() error { localPort, err := s.getLocalPort() if err != nil { diff --git a/server/app.go b/server/app.go index 889eada9..d6036d50 100644 --- a/server/app.go +++ b/server/app.go @@ -60,7 +60,7 @@ func (r *Router) clearAppHandler(c *gin.Context) { if err != nil { return } - err = driver.GetIDriver().AppClear(appClearReq.PackageName) + err = driver.AppClear(appClearReq.PackageName) if err != nil { RenderError(c, err) return diff --git a/server/context.go b/server/context.go index 92bdb9f3..c9528b78 100644 --- a/server/context.go +++ b/server/context.go @@ -14,12 +14,17 @@ import ( "github.com/httprunner/httprunner/v5/pkg/uixt/option" ) -func (p RouterBaseMethod) GetDriver(c *gin.Context) (driverExt uixt.IXTDriver, err error) { +func (r *Router) GetDriver(c *gin.Context) (driverExt *uixt.XTDriver, err error) { + driverObj, exists := c.Get("driver") + if exists { + return driverObj.(*uixt.XTDriver), nil + } + deviceObj, exists := c.Get("device") var device uixt.IDevice var driver uixt.IDriver if !exists { - device, err = p.GetDevice(c) + device, err = r.GetDevice(c) if err != nil { return nil, err } @@ -32,14 +37,14 @@ func (p RouterBaseMethod) GetDriver(c *gin.Context) (driverExt uixt.IXTDriver, e RenderErrorInitDriver(c, err) return } - c.Set("driver", driver) driverExt = uixt.NewXTDriver(driver, ai.WithCVService(ai.CVServiceTypeVEDEM)) + c.Set("driver", driverExt) return driverExt, nil } -func (p RouterBaseMethod) GetDevice(c *gin.Context) (device uixt.IDevice, err error) { +func (r *Router) GetDevice(c *gin.Context) (device uixt.IDevice, err error) { platform := c.Param("platform") serial := c.Param("serial") if serial == "" { diff --git a/server/ext/app.go b/server/ext/app.go index 9b6f9a87..b890880e 100644 --- a/server/ext/app.go +++ b/server/ext/app.go @@ -7,7 +7,6 @@ import ( "github.com/gin-gonic/gin" "github.com/httprunner/httprunner/v5/pkg/uixt" - "github.com/httprunner/httprunner/v5/pkg/uixt/driver_ext" "github.com/httprunner/httprunner/v5/server" ) @@ -21,7 +20,7 @@ func (r *RouterExt) installAppHandler(c *gin.Context) { if err != nil { return } - err = driver.(*driver_ext.XTDriver).InstallByUrl(appInstallReq.AppUrl) + err = driver.InstallByUrl(appInstallReq.AppUrl) if err != nil { server.RenderError(c, err) return diff --git a/server/ext/context.go b/server/ext/context.go index 21ff0337..0b860ace 100644 --- a/server/ext/context.go +++ b/server/ext/context.go @@ -11,19 +11,24 @@ import ( "github.com/httprunner/httprunner/v5/server" ) -func (p RouterBaseMethodExt) GetDriver(c *gin.Context) (driverExt uixt.IXTDriver, err error) { - platform := c.Param("platform") +func (r *RouterExt) GetDriver(c *gin.Context) (driverExt *driver_ext.StubXTDriver, err error) { + driverObj, exists := c.Get("driver") + if exists { + return driverObj.(*driver_ext.StubXTDriver), nil + } + deviceObj, exists := c.Get("device") var device uixt.IDevice var driver driver_ext.IStubDriver if !exists { - device, err = p.GetDevice(c) + device, err = r.GetDevice(c) if err != nil { return nil, err } } else { device = deviceObj.(uixt.IDevice) } + platform := c.Param("platform") switch strings.ToLower(platform) { case "android": driver, err = driver_ext.NewStubAndroidDriver(device.(*uixt.AndroidDevice)) @@ -36,7 +41,8 @@ func (p RouterBaseMethodExt) GetDriver(c *gin.Context) (driverExt uixt.IXTDriver server.RenderErrorInitDriver(c, err) return } - driverExt = driver_ext.NewXTDriver(driver, + + driverExt = driver_ext.NewStubXTDriver(driver, ai.WithCVService(ai.CVServiceTypeVEDEM)) c.Set("driver", driverExt) return driverExt, nil diff --git a/server/ext/handler.go b/server/ext/handler.go index ab6f6aa1..980b89ee 100644 --- a/server/ext/handler.go +++ b/server/ext/handler.go @@ -1,11 +1,11 @@ package server_ext import ( - "github.com/gin-gonic/gin" - "github.com/rs/zerolog/log" "time" - "github.com/httprunner/httprunner/v5/pkg/uixt/driver_ext" + "github.com/gin-gonic/gin" + "github.com/rs/zerolog/log" + "github.com/httprunner/httprunner/v5/server" ) @@ -20,9 +20,9 @@ func (r *RouterExt) loginHandler(c *gin.Context) { if err != nil { return } - info, err := driver.GetIDriver().(driver_ext.IStubDriver). - LoginNoneUI(loginReq.PackageName, loginReq.PhoneNumber, - loginReq.Captcha, loginReq.Password) + info, err := driver.LoginNoneUI( + loginReq.PackageName, loginReq.PhoneNumber, + loginReq.Captcha, loginReq.Password) if err != nil { server.RenderError(c, err) return @@ -41,8 +41,7 @@ func (r *RouterExt) logoutHandler(c *gin.Context) { if err != nil { return } - err = driver.GetIDriver().(driver_ext.IStubDriver). - LogoutNoneUI(logoutReq.PackageName) + err = driver.LogoutNoneUI(logoutReq.PackageName) if err != nil { server.RenderError(c, err) return diff --git a/server/ext/main.go b/server/ext/main.go index e8855f24..e53c4cba 100644 --- a/server/ext/main.go +++ b/server/ext/main.go @@ -1,7 +1,6 @@ package server_ext import ( - "github.com/gin-gonic/gin" "github.com/httprunner/httprunner/v5/server" ) @@ -9,23 +8,15 @@ type RouterExt struct { *server.Router } -type RouterBaseMethodExt struct { - server.RouterBaseMethod -} - func NewExtRouter() *RouterExt { router := &RouterExt{ - Router: &server.Router{ - Engine: gin.Default(), - IRouterBaseMethod: &RouterBaseMethodExt{}, - }, + Router: server.NewRouter(), } router.Init() return router } func (r *RouterExt) Init() { - r.Router.Init() apiV1PlatformSerial := r.Group("/api/v1").Group("/:platform").Group("/:serial") apiV1PlatformSerial.GET("/stub/source", r.sourceHandler) diff --git a/server/key.go b/server/key.go index 5f82ee9a..d758c068 100644 --- a/server/key.go +++ b/server/key.go @@ -64,7 +64,7 @@ func (r *Router) keycodeHandler(c *gin.Context) { return } // TODO FIXME - err = driver.GetIDriver().(*uixt.ADBDriver). + err = driver.IDriver.(*uixt.ADBDriver). PressKeyCode(uixt.KeyCode(keycodeReq.Keycode), uixt.KMEmpty) if err != nil { RenderError(c, err) diff --git a/server/main.go b/server/main.go index 336c2537..f315f612 100644 --- a/server/main.go +++ b/server/main.go @@ -12,8 +12,7 @@ import ( func NewRouter() *Router { router := &Router{ - Engine: gin.Default(), - IRouterBaseMethod: &RouterBaseMethod{}, + Engine: gin.Default(), } router.Init() return router @@ -21,15 +20,6 @@ func NewRouter() *Router { type Router struct { *gin.Engine - IRouterBaseMethod -} - -type RouterBaseMethod struct { -} - -type IRouterBaseMethod interface { - GetDriver(c *gin.Context) (driver uixt.IXTDriver, err error) - GetDevice(c *gin.Context) (driver uixt.IDevice, err error) } func (r *Router) Init() { @@ -109,14 +99,14 @@ func (r *Router) teardown() gin.HandlerFunc { driverObj, exists := c.Get("driver") if exists { - if driver, ok := driverObj.(uixt.IXTDriver); ok { + if driver, ok := driverObj.(*uixt.XTDriver); ok { _ = driver.TearDown() } } deviceObj, exists := c.Get("device") if exists { - if device, ok := deviceObj.(*uixt.IOSDevice); ok { + if device, ok := deviceObj.(uixt.IDevice); ok { err := device.Teardown() if err != nil { log.Error().Err(err) diff --git a/server/ui.go b/server/ui.go index d7cf5693..38b1a8b6 100644 --- a/server/ui.go +++ b/server/ui.go @@ -2,6 +2,7 @@ package server import ( "github.com/gin-gonic/gin" + "github.com/httprunner/httprunner/v5/pkg/uixt" "github.com/httprunner/httprunner/v5/pkg/uixt/option" ) @@ -38,7 +39,8 @@ func (r *Router) rightClickHandler(c *gin.Context) { if err != nil { return } - err = driver.GetWebDriver().RightClick(rightClickReq.X, rightClickReq.Y) + err = driver.IDriver.(*uixt.BrowserDriver). + RightClick(rightClickReq.X, rightClickReq.Y) if err != nil { RenderError(c, err) return @@ -58,7 +60,9 @@ func (r *Router) uploadHandler(c *gin.Context) { RenderError(c, err) return } - err = driver.GetWebDriver().UploadFile(uploadRequest.X, uploadRequest.Y, uploadRequest.FileUrl, uploadRequest.FileFormat) + err = driver.IDriver.(*uixt.BrowserDriver). + UploadFile(uploadRequest.X, uploadRequest.Y, + uploadRequest.FileUrl, uploadRequest.FileFormat) if err != nil { c.Abort() return @@ -79,7 +83,8 @@ func (r *Router) hoverHandler(c *gin.Context) { return } - err = driver.GetWebDriver().Hover(hoverReq.X, hoverReq.Y) + err = driver.IDriver.(*uixt.BrowserDriver). + Hover(hoverReq.X, hoverReq.Y) if err != nil { RenderError(c, err) @@ -101,7 +106,8 @@ func (r *Router) scrollHandler(c *gin.Context) { return } - err = driver.GetWebDriver().Scroll(scrollReq.Delta) + err = driver.IDriver.(*uixt.BrowserDriver). + Scroll(scrollReq.Delta) if err != nil { RenderError(c, err)