feat: specify screenshot filename

This commit is contained in:
debugtalk
2022-08-25 22:34:08 +08:00
parent e491f3c08d
commit 04c0b24601
+41 -8
View File
@@ -5,6 +5,7 @@ import (
"image" "image"
"image/jpeg" "image/jpeg"
"image/png" "image/png"
"net/http"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
@@ -408,16 +409,20 @@ func (r *HRPRunner) InitWDAClient(device WDADevice) (client *wdaClient, err erro
// cache wda client // cache wda client
r.wdaClients = make(map[string]*wdaClient) r.wdaClients = make(map[string]*wdaClient)
client = &wdaClient{ client = &wdaClient{
ID: time.Now().Unix(),
Device: targetDevice, Device: targetDevice,
Driver: driver, Driver: driver,
WindowSize: windowSize, WindowSize: windowSize,
httpClient: &http.Client{
Timeout: 10 * time.Second,
},
} }
r.wdaClients[targetDevice.SerialNumber()] = client r.wdaClients[targetDevice.SerialNumber()] = client
return client, nil return client, nil
} }
func runStepIOS(r *SessionRunner, step *TStep) (stepResult *StepResult, err error) { func runStepIOS(s *SessionRunner, step *TStep) (stepResult *StepResult, err error) {
stepResult = &StepResult{ stepResult = &StepResult{
Name: step.Name, Name: step.Name,
StepType: stepTypeIOS, StepType: stepTypeIOS,
@@ -426,7 +431,7 @@ func runStepIOS(r *SessionRunner, step *TStep) (stepResult *StepResult, err erro
} }
// init wdaClient driver // init wdaClient driver
wdaClient, err := r.hrpRunner.InitWDAClient(step.IOS.WDADevice) wdaClient, err := s.hrpRunner.InitWDAClient(step.IOS.WDADevice)
if err != nil { if err != nil {
return return
} }
@@ -453,7 +458,7 @@ func runStepIOS(r *SessionRunner, step *TStep) (stepResult *StepResult, err erro
// take snapshot // take snapshot
log.Info().Str("name", step.Name).Msg("take snapshot before validation") log.Info().Str("name", step.Name).Msg("take snapshot before validation")
err = wdaClient.screenShot() err = wdaClient.screenShot(fmt.Sprintf("validate_%s", step.Name))
if err != nil { if err != nil {
log.Warn().Err(err).Str("step", step.Name).Msg("take screenshot failed") log.Warn().Err(err).Str("step", step.Name).Msg("take screenshot failed")
} }
@@ -473,13 +478,15 @@ func runStepIOS(r *SessionRunner, step *TStep) (stepResult *StepResult, err erro
var errActionNotImplemented = errors.New("UI action not implemented") var errActionNotImplemented = errors.New("UI action not implemented")
type wdaClient struct { type wdaClient struct {
ID int64
Device *gwda.Device Device *gwda.Device
Driver gwda.WebDriver Driver gwda.WebDriver
WindowSize gwda.Size WindowSize gwda.Size
httpClient *http.Client
} }
// screenShot takes screenshot and saves image file to $CWD/screenshots/ folder // screenShot takes screenshot and saves image file to $CWD/screenshots/ folder
func (w *wdaClient) screenShot() error { func (w *wdaClient) screenShot(path ...string) error {
// gidevice 和 gwda 均可实现截图功能,但 gidevice 的截图性能更优 // gidevice 和 gwda 均可实现截图功能,但 gidevice 的截图性能更优
// gwda 通过 wda 请求获取(分辨率、响应时间均由 wda 决定) // gwda 通过 wda 请求获取(分辨率、响应时间均由 wda 决定)
// gidevice 直接通过 Apple 允许的底层通信获取 // gidevice 直接通过 Apple 允许的底层通信获取
@@ -497,10 +504,19 @@ func (w *wdaClient) screenShot() error {
dir, _ := os.Getwd() dir, _ := os.Getwd()
screenshotsDir := filepath.Join(dir, "screenshots") screenshotsDir := filepath.Join(dir, "screenshots")
if err := builtin.EnsureFolderExists(screenshotsDir); err != nil { if err := builtin.EnsureFolderExists(screenshotsDir); err != nil {
return errors.Wrap(err, "create screenshots failed") return errors.Wrap(err, "create screenshots directory failed")
} }
path := filepath.Join(screenshotsDir, fmt.Sprintf("%d", time.Now().Unix())+"."+format)
file, err := os.Create(path) var filaName string
if len(path) > 0 && path[0] != "" {
filaName = fmt.Sprintf("%d_%s", time.Now().Unix(), path[0])
} else {
filaName = fmt.Sprintf("%d", time.Now().Unix())
}
screenshotPath := filepath.Join(screenshotsDir,
fmt.Sprintf("%d_%s.%s", w.ID, filaName, format))
file, err := os.Create(screenshotPath)
if err != nil { if err != nil {
return errors.Wrap(err, "create screenshot image file failed") return errors.Wrap(err, "create screenshot image file failed")
} }
@@ -520,7 +536,7 @@ func (w *wdaClient) screenShot() error {
return errors.Wrap(err, "encode screenshot image failed") return errors.Wrap(err, "encode screenshot image failed")
} }
log.Info().Str("path", path).Msg("screenshot generated") log.Info().Str("path", screenshotPath).Msg("screenshot generated")
return nil return nil
} }
@@ -642,6 +658,9 @@ func (w *wdaClient) doAction(action MobileAction) error {
case ctlScreenShot: case ctlScreenShot:
// take snapshot // take snapshot
log.Info().Msg("take snapshot for current screen") log.Info().Msg("take snapshot for current screen")
if param, ok := action.Params.(string); ok {
return w.screenShot(fmt.Sprintf("screenshot_%s", param))
}
return w.screenShot() return w.screenShot()
case ctlStartCamera: case ctlStartCamera:
// start camera, alias for app_launch com.apple.camera // start camera, alias for app_launch com.apple.camera
@@ -736,6 +755,20 @@ func (w *wdaClient) findElement(param string) (ele gwda.WebElement, err error) {
return w.Driver.FindElement(selector) return w.Driver.FindElement(selector)
} }
func (w *wdaClient) locateByOCR(text string) (point gwda.Point, err error) {
// raw, err := w.Device.GIDevice().Screenshot()
// if err != nil {
// return errors.Wrap(err, "screenshot by WDA failed")
// }
// url := "https://hubble.bytedance.net/video/api/v1/algorithm/ocr"
// req, err := http.NewRequest("POST", url, strings.NewReader(form.Encode()))
// w.httpClient.Do(req)
return
}
func (w *wdaClient) assertName(name string, exists bool) bool { func (w *wdaClient) assertName(name string, exists bool) bool {
selector := gwda.BySelector{ selector := gwda.BySelector{
LinkText: gwda.NewElementAttribute().WithName(name), LinkText: gwda.NewElementAttribute().WithName(name),