refactor: enhance screenshot functionality with session saving and optional CV processing

This commit is contained in:
lilong.129
2025-06-18 16:13:45 +08:00
parent 780870ffd9
commit 6965cf9fe9
2 changed files with 54 additions and 35 deletions
+1 -1
View File
@@ -1 +1 @@
v5.0.0-beta-2506181352 v5.0.0-beta-2506181613
+35 -16
View File
@@ -50,27 +50,25 @@ func (s *ScreenResult) FilterTextsByScope(x1, y1, x2, y2 float64) ai.OCRTexts {
} }
// GetScreenshotBase64WithSize takes a screenshot, returns the compressed image buffer in base64 format and screen size // GetScreenshotBase64WithSize takes a screenshot, returns the compressed image buffer in base64 format and screen size
// Also saves the screenshot to session for report display
func (dExt *XTDriver) GetScreenshotBase64WithSize() (compressedBufBase64 string, size types.Size, err error) { func (dExt *XTDriver) GetScreenshotBase64WithSize() (compressedBufBase64 string, size types.Size, err error) {
compressBufSource, err := getScreenShotBuffer(dExt) // Create screenshot with session saving, minimal CV processing for AI operations
screenResult, err := dExt.createScreenshotWithSession(
option.WithScreenShotFileName("screenshot_base64"),
)
if err != nil { if err != nil {
return "", types.Size{}, err return "", types.Size{}, err
} }
// convert buffer to base64 string // convert buffer to base64 string
screenShotBase64 := "data:image/jpeg;base64," + screenShotBase64 := "data:image/jpeg;base64," +
base64.StdEncoding.EncodeToString(compressBufSource.Bytes()) base64.StdEncoding.EncodeToString(screenResult.bufSource.Bytes())
// get screen size return screenShotBase64, screenResult.Resolution, nil
size, err = dExt.IDriver.WindowSize()
if err != nil {
return "", types.Size{}, errors.Wrap(err, "get window size failed")
} }
return screenShotBase64, size, nil // createScreenshotWithSession creates a screenshot with optional OCR processing and saves to session
} func (dExt *XTDriver) createScreenshotWithSession(opts ...option.ActionOption) (screenResult *ScreenResult, err error) {
// GetScreenResult takes a screenshot, returns the image recognition result
func (dExt *XTDriver) GetScreenResult(opts ...option.ActionOption) (screenResult *ScreenResult, err error) {
// get compressed screenshot buffer // get compressed screenshot buffer
compressBufSource, err := getScreenShotBuffer(dExt.IDriver) compressBufSource, err := getScreenShotBuffer(dExt.IDriver)
if err != nil { if err != nil {
@@ -105,13 +103,17 @@ func (dExt *XTDriver) GetScreenResult(opts ...option.ActionOption) (screenResult
return nil, errors.Wrap(code.DeviceGetInfoError, err.Error()) return nil, errors.Wrap(code.DeviceGetInfoError, err.Error())
} }
// read image from buffer with CV // create basic screen result
screenResult = &ScreenResult{ screenResult = &ScreenResult{
bufSource: compressBufSource, bufSource: compressBufSource,
ImagePath: imagePath, ImagePath: imagePath,
Tags: nil, Tags: nil,
Resolution: windowSize, Resolution: windowSize,
} }
logger := log.Debug().Str("imagePath", imagePath)
// perform CV processing if any CV-related option is enabled
if needsCVProcessing(screenshotOptions) {
imageResult, err := dExt.CVService.ReadFromBuffer(compressBufSource, opts...) imageResult, err := dExt.CVService.ReadFromBuffer(compressBufSource, opts...)
if err != nil { if err != nil {
log.Error().Err(err).Msg("ReadFromBuffer from ImageService failed") log.Error().Err(err).Msg("ReadFromBuffer from ImageService failed")
@@ -134,19 +136,36 @@ func (dExt *XTDriver) GetScreenResult(opts ...option.ActionOption) (screenResult
screenResult.Popup.ClosePoints = append(screenResult.Popup.ClosePoints, closeArea.Center()) screenResult.Popup.ClosePoints = append(screenResult.Popup.ClosePoints, closeArea.Center())
} }
} }
logger.Str("imageUrl", screenResult.UploadedURL)
}
} }
// save screen result to session // save screen result to session
session := dExt.GetSession() session := dExt.GetSession()
session.screenResults = append(session.screenResults, screenResult) session.screenResults = append(session.screenResults, screenResult)
log.Debug(). logger.Msg("log screenshot")
Str("imagePath", imagePath).
Str("imageUrl", screenResult.UploadedURL).
Msg("log screenshot")
return screenResult, nil return screenResult, nil
} }
// needsCVProcessing determines if CV service processing is required based on screenshot options
func needsCVProcessing(options *option.ActionOptions) bool {
return options.ScreenShotWithOCR ||
options.ScreenShotWithUpload ||
options.ScreenShotWithLiveType ||
options.ScreenShotWithLivePopularity ||
len(options.ScreenShotWithUITypes) > 0 ||
options.ScreenShotWithClosePopups ||
options.ScreenShotWithOCRCluster != ""
}
// GetScreenResult takes a screenshot, returns the image recognition result
func (dExt *XTDriver) GetScreenResult(opts ...option.ActionOption) (screenResult *ScreenResult, err error) {
// Enable OCR processing for GetScreenResult
opts = append(opts, option.WithScreenShotOCR(true))
return dExt.createScreenshotWithSession(opts...)
}
func (dExt *XTDriver) GetScreenTexts(opts ...option.ActionOption) (ocrTexts ai.OCRTexts, err error) { func (dExt *XTDriver) GetScreenTexts(opts ...option.ActionOption) (ocrTexts ai.OCRTexts, err error) {
options := option.NewActionOptions(opts...) options := option.NewActionOptions(opts...)
if options.ScreenShotFileName == "" { if options.ScreenShotFileName == "" {