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),
RunE: func(cmd *cobra.Command, args []string) error {
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 = (*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)
}

View File

@ -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 {

View File

@ -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")

View File

@ -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)
}

View File

@ -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 {

View File

@ -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

View File

@ -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 == "" {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)