refactor & fix: stub driver and server

This commit is contained in:
lilong.129
2025-03-04 17:26:55 +08:00
parent b195760ed9
commit 7f837c9e36
16 changed files with 75 additions and 88 deletions

View File

@@ -14,6 +14,7 @@ var serverCmd = &cobra.Command{
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
return server_ext.NewExtRouter().Run(port) return server_ext.NewExtRouter().Run(port)
// return server.NewRouter().Run(port)
}, },
} }

View File

@@ -1 +1 @@
v5.0.0+2503041108 v5.0.0+2503041726

View File

@@ -16,6 +16,7 @@ var (
_ IDriver = (*UIA2Driver)(nil) _ IDriver = (*UIA2Driver)(nil)
_ IDriver = (*WDADriver)(nil) _ IDriver = (*WDADriver)(nil)
_ IDriver = (*HDCDriver)(nil) _ IDriver = (*HDCDriver)(nil)
_ IDriver = (*BrowserDriver)(nil)
) )
// current implemeted driver: ADBDriver, UIA2Driver, WDADriver, HDCDriver // current implemeted driver: ADBDriver, UIA2Driver, WDADriver, HDCDriver
@@ -96,28 +97,3 @@ type XTDriver struct {
// cache screenshot results // cache screenshot results
screenResults []*ScreenResult 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)
}

View File

@@ -53,6 +53,10 @@ func NewStubAndroidDriver(dev *uixt.AndroidDevice) (*StubAndroidDriver, error) {
return driver, nil return driver, nil
} }
func (sad *StubAndroidDriver) GetDriver() uixt.IDriver {
return sad.ADBDriver
}
func (sad *StubAndroidDriver) Setup() error { func (sad *StubAndroidDriver) Setup() error {
socketLocalPort, err := sad.Device.Forward(StubSocketName) socketLocalPort, err := sad.Device.Forward(StubSocketName)
if err != nil { if err != nil {

View File

@@ -27,6 +27,10 @@ func NewStubBrowserDriver(device *uixt.BrowserDevice) (driver *StubBrowserDriver
return driver, nil return driver, nil
} }
func (wd *StubBrowserDriver) GetDriver() uixt.IDriver {
return wd.BrowserDriver
}
// Source Return application elements tree // Source Return application elements tree
func (wd *StubBrowserDriver) Source(srcOpt ...option.SourceOption) (string, error) { func (wd *StubBrowserDriver) Source(srcOpt ...option.SourceOption) (string, error) {
resp, err := wd.BrowserDriver.HttpGet(http.MethodGet, wd.sessionId, "stub/source") resp, err := wd.BrowserDriver.HttpGet(http.MethodGet, wd.sessionId, "stub/source")

View File

@@ -1,40 +1,46 @@
package driver_ext package driver_ext
import ( import (
"github.com/rs/zerolog/log"
"time" "time"
"github.com/rs/zerolog/log"
"github.com/httprunner/httprunner/v5/pkg/uixt" "github.com/httprunner/httprunner/v5/pkg/uixt"
"github.com/httprunner/httprunner/v5/pkg/uixt/ai" "github.com/httprunner/httprunner/v5/pkg/uixt/ai"
"github.com/httprunner/httprunner/v5/pkg/uixt/option" "github.com/httprunner/httprunner/v5/pkg/uixt/option"
) )
type IStubDriver interface { var (
uixt.IDriver _ 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) LoginNoneUI(packageName, phoneNumber, captcha, password string) (info AppLoginInfo, err error)
LogoutNoneUI(packageName string) 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...) services := ai.NewAIService(opts...)
driverExt := &XTDriver{ driverExt := &StubXTDriver{
XTDriver: &uixt.XTDriver{ XTDriver: &uixt.XTDriver{
IDriver: driver, IDriver: stubDriver.GetDriver(),
CVService: services.ICVService, CVService: services.ICVService,
LLMService: services.ILLMService, LLMService: services.ILLMService,
}, },
IStubDriver: driver, IStubDriver: stubDriver,
} }
return driverExt return driverExt
} }
type XTDriver struct { type StubXTDriver struct {
IStubDriver
*uixt.XTDriver *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) appPath, err := uixt.DownloadFileByUrl(url)
if err != nil { if err != nil {
return err return err
@@ -46,7 +52,7 @@ func (dExt *XTDriver) InstallByUrl(url string, opts ...option.InstallOption) err
return nil 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 { if _, ok := dExt.GetDevice().(*uixt.AndroidDevice); ok {
stopChan := make(chan struct{}) stopChan := make(chan struct{})
go func() { go func() {
@@ -73,7 +79,3 @@ func (dExt *XTDriver) Install(filePath string, opts ...option.InstallOption) err
return dExt.GetDevice().Install(filePath, opts...) return dExt.GetDevice().Install(filePath, opts...)
} }
func (dExt *XTDriver) GetWebDriver() uixt.IBrowserWebDriver {
return dExt.GetIDriver().(*StubBrowserDriver)
}

View File

@@ -56,6 +56,10 @@ func (s *StubIOSDriver) SetupWda() (err error) {
return err return err
} }
func (s *StubIOSDriver) GetDriver() uixt.IDriver {
return s.WDADriver
}
func (s *StubIOSDriver) Setup() error { func (s *StubIOSDriver) Setup() error {
localPort, err := s.getLocalPort() localPort, err := s.getLocalPort()
if err != nil { if err != nil {

View File

@@ -60,7 +60,7 @@ func (r *Router) clearAppHandler(c *gin.Context) {
if err != nil { if err != nil {
return return
} }
err = driver.GetIDriver().AppClear(appClearReq.PackageName) err = driver.AppClear(appClearReq.PackageName)
if err != nil { if err != nil {
RenderError(c, err) RenderError(c, err)
return return

View File

@@ -14,12 +14,17 @@ import (
"github.com/httprunner/httprunner/v5/pkg/uixt/option" "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") deviceObj, exists := c.Get("device")
var device uixt.IDevice var device uixt.IDevice
var driver uixt.IDriver var driver uixt.IDriver
if !exists { if !exists {
device, err = p.GetDevice(c) device, err = r.GetDevice(c)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -32,14 +37,14 @@ func (p RouterBaseMethod) GetDriver(c *gin.Context) (driverExt uixt.IXTDriver, e
RenderErrorInitDriver(c, err) RenderErrorInitDriver(c, err)
return return
} }
c.Set("driver", driver)
driverExt = uixt.NewXTDriver(driver, driverExt = uixt.NewXTDriver(driver,
ai.WithCVService(ai.CVServiceTypeVEDEM)) ai.WithCVService(ai.CVServiceTypeVEDEM))
c.Set("driver", driverExt)
return driverExt, nil 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") platform := c.Param("platform")
serial := c.Param("serial") serial := c.Param("serial")
if serial == "" { if serial == "" {

View File

@@ -7,7 +7,6 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/httprunner/httprunner/v5/pkg/uixt" "github.com/httprunner/httprunner/v5/pkg/uixt"
"github.com/httprunner/httprunner/v5/pkg/uixt/driver_ext"
"github.com/httprunner/httprunner/v5/server" "github.com/httprunner/httprunner/v5/server"
) )
@@ -21,7 +20,7 @@ func (r *RouterExt) installAppHandler(c *gin.Context) {
if err != nil { if err != nil {
return return
} }
err = driver.(*driver_ext.XTDriver).InstallByUrl(appInstallReq.AppUrl) err = driver.InstallByUrl(appInstallReq.AppUrl)
if err != nil { if err != nil {
server.RenderError(c, err) server.RenderError(c, err)
return return

View File

@@ -11,19 +11,24 @@ import (
"github.com/httprunner/httprunner/v5/server" "github.com/httprunner/httprunner/v5/server"
) )
func (p RouterBaseMethodExt) GetDriver(c *gin.Context) (driverExt uixt.IXTDriver, err error) { func (r *RouterExt) GetDriver(c *gin.Context) (driverExt *driver_ext.StubXTDriver, err error) {
platform := c.Param("platform") driverObj, exists := c.Get("driver")
if exists {
return driverObj.(*driver_ext.StubXTDriver), nil
}
deviceObj, exists := c.Get("device") deviceObj, exists := c.Get("device")
var device uixt.IDevice var device uixt.IDevice
var driver driver_ext.IStubDriver var driver driver_ext.IStubDriver
if !exists { if !exists {
device, err = p.GetDevice(c) device, err = r.GetDevice(c)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} else { } else {
device = deviceObj.(uixt.IDevice) device = deviceObj.(uixt.IDevice)
} }
platform := c.Param("platform")
switch strings.ToLower(platform) { switch strings.ToLower(platform) {
case "android": case "android":
driver, err = driver_ext.NewStubAndroidDriver(device.(*uixt.AndroidDevice)) 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) server.RenderErrorInitDriver(c, err)
return return
} }
driverExt = driver_ext.NewXTDriver(driver,
driverExt = driver_ext.NewStubXTDriver(driver,
ai.WithCVService(ai.CVServiceTypeVEDEM)) ai.WithCVService(ai.CVServiceTypeVEDEM))
c.Set("driver", driverExt) c.Set("driver", driverExt)
return driverExt, nil return driverExt, nil

View File

@@ -1,11 +1,11 @@
package server_ext package server_ext
import ( import (
"github.com/gin-gonic/gin"
"github.com/rs/zerolog/log"
"time" "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" "github.com/httprunner/httprunner/v5/server"
) )
@@ -20,9 +20,9 @@ func (r *RouterExt) loginHandler(c *gin.Context) {
if err != nil { if err != nil {
return return
} }
info, err := driver.GetIDriver().(driver_ext.IStubDriver). info, err := driver.LoginNoneUI(
LoginNoneUI(loginReq.PackageName, loginReq.PhoneNumber, loginReq.PackageName, loginReq.PhoneNumber,
loginReq.Captcha, loginReq.Password) loginReq.Captcha, loginReq.Password)
if err != nil { if err != nil {
server.RenderError(c, err) server.RenderError(c, err)
return return
@@ -41,8 +41,7 @@ func (r *RouterExt) logoutHandler(c *gin.Context) {
if err != nil { if err != nil {
return return
} }
err = driver.GetIDriver().(driver_ext.IStubDriver). err = driver.LogoutNoneUI(logoutReq.PackageName)
LogoutNoneUI(logoutReq.PackageName)
if err != nil { if err != nil {
server.RenderError(c, err) server.RenderError(c, err)
return return

View File

@@ -1,7 +1,6 @@
package server_ext package server_ext
import ( import (
"github.com/gin-gonic/gin"
"github.com/httprunner/httprunner/v5/server" "github.com/httprunner/httprunner/v5/server"
) )
@@ -9,23 +8,15 @@ type RouterExt struct {
*server.Router *server.Router
} }
type RouterBaseMethodExt struct {
server.RouterBaseMethod
}
func NewExtRouter() *RouterExt { func NewExtRouter() *RouterExt {
router := &RouterExt{ router := &RouterExt{
Router: &server.Router{ Router: server.NewRouter(),
Engine: gin.Default(),
IRouterBaseMethod: &RouterBaseMethodExt{},
},
} }
router.Init() router.Init()
return router return router
} }
func (r *RouterExt) Init() { func (r *RouterExt) Init() {
r.Router.Init()
apiV1PlatformSerial := r.Group("/api/v1").Group("/:platform").Group("/:serial") apiV1PlatformSerial := r.Group("/api/v1").Group("/:platform").Group("/:serial")
apiV1PlatformSerial.GET("/stub/source", r.sourceHandler) apiV1PlatformSerial.GET("/stub/source", r.sourceHandler)

View File

@@ -64,7 +64,7 @@ func (r *Router) keycodeHandler(c *gin.Context) {
return return
} }
// TODO FIXME // TODO FIXME
err = driver.GetIDriver().(*uixt.ADBDriver). err = driver.IDriver.(*uixt.ADBDriver).
PressKeyCode(uixt.KeyCode(keycodeReq.Keycode), uixt.KMEmpty) PressKeyCode(uixt.KeyCode(keycodeReq.Keycode), uixt.KMEmpty)
if err != nil { if err != nil {
RenderError(c, err) RenderError(c, err)

View File

@@ -12,8 +12,7 @@ import (
func NewRouter() *Router { func NewRouter() *Router {
router := &Router{ router := &Router{
Engine: gin.Default(), Engine: gin.Default(),
IRouterBaseMethod: &RouterBaseMethod{},
} }
router.Init() router.Init()
return router return router
@@ -21,15 +20,6 @@ func NewRouter() *Router {
type Router struct { type Router struct {
*gin.Engine *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() { func (r *Router) Init() {
@@ -109,14 +99,14 @@ func (r *Router) teardown() gin.HandlerFunc {
driverObj, exists := c.Get("driver") driverObj, exists := c.Get("driver")
if exists { if exists {
if driver, ok := driverObj.(uixt.IXTDriver); ok { if driver, ok := driverObj.(*uixt.XTDriver); ok {
_ = driver.TearDown() _ = driver.TearDown()
} }
} }
deviceObj, exists := c.Get("device") deviceObj, exists := c.Get("device")
if exists { if exists {
if device, ok := deviceObj.(*uixt.IOSDevice); ok { if device, ok := deviceObj.(uixt.IDevice); ok {
err := device.Teardown() err := device.Teardown()
if err != nil { if err != nil {
log.Error().Err(err) log.Error().Err(err)

View File

@@ -2,6 +2,7 @@ package server
import ( import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/httprunner/httprunner/v5/pkg/uixt"
"github.com/httprunner/httprunner/v5/pkg/uixt/option" "github.com/httprunner/httprunner/v5/pkg/uixt/option"
) )
@@ -38,7 +39,8 @@ func (r *Router) rightClickHandler(c *gin.Context) {
if err != nil { if err != nil {
return return
} }
err = driver.GetWebDriver().RightClick(rightClickReq.X, rightClickReq.Y) err = driver.IDriver.(*uixt.BrowserDriver).
RightClick(rightClickReq.X, rightClickReq.Y)
if err != nil { if err != nil {
RenderError(c, err) RenderError(c, err)
return return
@@ -58,7 +60,9 @@ func (r *Router) uploadHandler(c *gin.Context) {
RenderError(c, err) RenderError(c, err)
return 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 { if err != nil {
c.Abort() c.Abort()
return return
@@ -79,7 +83,8 @@ func (r *Router) hoverHandler(c *gin.Context) {
return return
} }
err = driver.GetWebDriver().Hover(hoverReq.X, hoverReq.Y) err = driver.IDriver.(*uixt.BrowserDriver).
Hover(hoverReq.X, hoverReq.Y)
if err != nil { if err != nil {
RenderError(c, err) RenderError(c, err)
@@ -101,7 +106,8 @@ func (r *Router) scrollHandler(c *gin.Context) {
return return
} }
err = driver.GetWebDriver().Scroll(scrollReq.Delta) err = driver.IDriver.(*uixt.BrowserDriver).
Scroll(scrollReq.Delta)
if err != nil { if err != nil {
RenderError(c, err) RenderError(c, err)