feat: add browser driver

This commit is contained in:
huangbin.beal@163.com
2025-02-19 20:33:21 +08:00
parent 1b18976620
commit e3d4cbf281
10 changed files with 1526 additions and 2 deletions

View File

@@ -66,6 +66,12 @@ func GetDevice(c *gin.Context) (device uixt.IDevice, err error) {
RenderErrorInitDriver(c, err)
return
}
case "browser":
device, err = uixt.NewBrowserDevice(uixt.WithBrowserId(serial))
if err != nil {
RenderErrorInitDriver(c, err)
return
}
default:
err = fmt.Errorf("[%s]: invalid platform", c.HandlerName())
return

View File

@@ -88,6 +88,36 @@ func listDeviceHandler(c *gin.Context) {
RenderSuccess(c, deviceList)
}
func createBrowserHandler(c *gin.Context) {
var createBrowserReq CreateBrowserRequest
if err := c.ShouldBindJSON(&createBrowserReq); err != nil {
RenderErrorValidateRequest(c, err)
return
}
browserInfo, err := uixt.CreateBrowser(createBrowserReq.Timeout)
if err != nil {
RenderError(c, err)
return
}
RenderSuccess(c, browserInfo)
return
}
func deleteBrowserHandler(c *gin.Context) {
driver, err := GetDriver(c)
if err != nil {
RenderError(c, err)
return
}
err = driver.DeleteSession()
if err != nil {
RenderError(c, err)
return
}
RenderSuccess(c, true)
}
func pushImageHandler(c *gin.Context) {
var pushMediaReq PushMediaRequest
if err := c.ShouldBindJSON(&pushMediaReq); err != nil {

View File

@@ -13,6 +13,7 @@ import (
func GetDriver(c *gin.Context) (driverExt *driver_ext.XTDriver, err error) {
platform := c.Param("platform")
serial := c.Param("serial")
deviceObj, exists := c.Get("device")
var device uixt.IDevice
var driver uixt.IDriver
@@ -29,6 +30,8 @@ func GetDriver(c *gin.Context) (driverExt *driver_ext.XTDriver, err error) {
driver, err = driver_ext.NewStubAndroidDriver(device.(*uixt.AndroidDevice))
case "ios":
driver, err = driver_ext.NewStubIOSDriver(device.(*uixt.IOSDevice))
case "browser":
driver, err = driver_ext.NewStubBrowserDriver(serial)
}
if err != nil {
server.RenderErrorInitDriver(c, err)

View File

@@ -9,7 +9,7 @@ type AppInstallRequest struct {
type LoginRequest struct {
PackageName string `json:"packageName"`
PhoneNumber string `json:"phoneNumber" binding:"required"`
PhoneNumber string `json:"phoneNumber"`
Captcha string `json:"captcha" binding:"required_without=Password"`
Password string `json:"password" binding:"required_without=Captcha"`
}

View File

@@ -27,6 +27,7 @@ func (r *Router) Init() {
r.Engine.GET("/", pingHandler)
r.Engine.POST("/", pingHandler)
r.Engine.GET("/api/v1/devices", listDeviceHandler)
r.Engine.POST("/api/v1/browser/create_browser", createBrowserHandler)
apiV1PlatformSerial := r.Group("/api/v1").Group("/:platform").Group("/:serial")
@@ -36,6 +37,9 @@ func (r *Router) Init() {
apiV1PlatformSerial.POST("/ui/drag", dragHandler)
apiV1PlatformSerial.POST("/ui/input", inputHandler)
apiV1PlatformSerial.POST("/ui/home", homeHandler)
apiV1PlatformSerial.POST("/ui/upload", uploadHandler)
apiV1PlatformSerial.POST("/ui/hover", hoverHandler)
apiV1PlatformSerial.POST("/ui/scroll", scrollHandler)
// Key operations
apiV1PlatformSerial.POST("/key/unlock", unlockHandler)
@@ -53,6 +57,7 @@ func (r *Router) Init() {
// Device operations
apiV1PlatformSerial.GET("/screenshot", screenshotHandler)
apiV1PlatformSerial.DELETE("/close_browser", deleteBrowserHandler)
apiV1PlatformSerial.GET("/video", videoHandler)
apiV1PlatformSerial.POST("/device/push_image", pushImageHandler)
apiV1PlatformSerial.POST("/device/clear_image", clearImageHandler)

View File

@@ -10,7 +10,12 @@ type TapRequest struct {
Duration float64 `json:"duration"`
Options *option.ActionOptions `json:"options,omitempty"`
}
type uploadRequest struct {
X float64 `json:"x"`
Y float64 `json:"y"`
FileUrl string `json:"file_url"`
FileFormat string `json:"file_format"`
}
type DragRequest struct {
FromX float64 `json:"from_x" binding:"required"`
FromY float64 `json:"from_y" binding:"required"`

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"
)
@@ -29,6 +30,69 @@ func tapHandler(c *gin.Context) {
RenderSuccess(c, true)
}
func uploadHandler(c *gin.Context) {
var uploadRequest uploadRequest
if err := c.ShouldBindJSON(&uploadRequest); err != nil {
RenderErrorValidateRequest(c, err)
return
}
driver, err := GetDriver(c)
if err != nil {
RenderError(c, err)
return
}
err = driver.IDriver.(*uixt.BrowserWebDriver).UploadFile(uploadRequest.X, uploadRequest.Y, uploadRequest.FileUrl, uploadRequest.FileFormat)
if err != nil {
c.Abort()
return
}
RenderSuccess(c, true)
}
func hoverHandler(c *gin.Context) {
var hoverReq HoverRequest
if err := c.ShouldBindJSON(&hoverReq); err != nil {
RenderErrorValidateRequest(c, err)
return
}
driver, err := GetDriver(c)
if err != nil {
RenderError(c, err)
return
}
err = driver.IDriver.(*uixt.BrowserWebDriver).Hover(hoverReq.X, hoverReq.Y)
if err != nil {
RenderError(c, err)
return
}
RenderSuccess(c, true)
}
func scrollHandler(c *gin.Context) {
var scrollReq ScrollRequest
if err := c.ShouldBindJSON(&scrollReq); err != nil {
RenderErrorValidateRequest(c, err)
return
}
driver, err := GetDriver(c)
if err != nil {
RenderError(c, err)
return
}
err = driver.IDriver.(*uixt.BrowserWebDriver).Scroll(scrollReq.Delta)
if err != nil {
RenderError(c, err)
return
}
RenderSuccess(c, true)
}
func doubleTapHandler(c *gin.Context) {
var tapReq TapRequest
if err := c.ShouldBindJSON(&tapReq); err != nil {