refactor: cache window size & scale in driver

This commit is contained in:
lilong.129
2025-02-14 10:35:22 +08:00
parent 6c3f21134b
commit c8d776009c
7 changed files with 33 additions and 27 deletions

View File

@@ -40,6 +40,9 @@ func NewADBDriver(device *AndroidDevice) (*ADBDriver, error) {
type ADBDriver struct {
Device *AndroidDevice
Session *Session
// cache to avoid repeated query
windowSize types.Size
}
func (ad *ADBDriver) runShellCommand(cmd string, args ...string) (output string, err error) {
@@ -138,9 +141,9 @@ func (ad *ADBDriver) getWindowSize() (size types.Size, err error) {
}
func (ad *ADBDriver) WindowSize() (size types.Size, err error) {
if !ad.Session.windowSize.IsNil() {
if !ad.windowSize.IsNil() {
// use cached window size
return ad.Session.windowSize, nil
return ad.windowSize, nil
}
size, err = ad.getWindowSize()
@@ -159,7 +162,7 @@ func (ad *ADBDriver) WindowSize() (size types.Size, err error) {
size.Width, size.Height = size.Height, size.Width
}
ad.Session.windowSize = size // cache window size
ad.windowSize = size // cache window size
return size, nil
}

View File

@@ -42,6 +42,9 @@ func NewUIA2Driver(device *AndroidDevice) (*UIA2Driver, error) {
type UIA2Driver struct {
*ADBDriver
// cache to avoid repeated query
windowSize types.Size
}
func (ud *UIA2Driver) resetDriver() error {
@@ -171,9 +174,9 @@ func (ud *UIA2Driver) BatteryInfo() (batteryInfo types.BatteryInfo, err error) {
func (ud *UIA2Driver) WindowSize() (size types.Size, err error) {
// register(getHandler, new GetDeviceSize("/wd/hub/session/:sessionId/window/:windowHandle/size"))
if !ud.Session.windowSize.IsNil() {
if !ud.windowSize.IsNil() {
// use cached window size
return ud.Session.windowSize, nil
return ud.windowSize, nil
}
var rawResp DriverRawResponse
@@ -196,7 +199,7 @@ func (ud *UIA2Driver) WindowSize() (size types.Size, err error) {
size.Width, size.Height = size.Height, size.Width
}
ud.Session.windowSize = size // cache window size
ud.windowSize = size // cache window size
return size, nil
}

View File

@@ -54,7 +54,6 @@ func NewShootsIOSDriver(device *uixt.IOSDevice) (driver *ShootsIOSDriver, err er
driver = &ShootsIOSDriver{
WDADriver: wdaDriver.(*uixt.WDADriver),
}
driver.device = device
driver.bightInsightPrefix = fmt.Sprintf("http://%s:%d", host, localShootsPort)
driver.serverPrefix = fmt.Sprintf("http://%s:%d", host, localServerPort)
driver.timeout = timeout
@@ -68,7 +67,6 @@ type ShootsIOSDriver struct {
bightInsightPrefix string
serverPrefix string
timeout time.Duration
device *uixt.IOSDevice
}
func (s *ShootsIOSDriver) Source(srcOpt ...option.SourceOption) (string, error) {

View File

@@ -20,7 +20,6 @@ import (
"github.com/rs/zerolog/log"
"github.com/httprunner/httprunner/v5/internal/json"
"github.com/httprunner/httprunner/v5/pkg/uixt/types"
)
type Session struct {
@@ -28,10 +27,6 @@ type Session struct {
baseURL *url.URL
client *http.Client
// cache to avoid repeated query
scale float64
windowSize types.Size
// cache uia2/wda request and response
requests []*DriverRequests
// cache screenshot ocr results
@@ -151,8 +146,8 @@ func (wd *Session) Request(method string, rawURL string, rawBody []byte) (rawRes
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
var req *http.Request
if req, err = http.NewRequestWithContext(ctx, method, rawURL, bytes.NewBuffer(rawBody)); err != nil {
req, err := http.NewRequestWithContext(ctx, method, rawURL, bytes.NewBuffer(rawBody))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json;charset=UTF-8")

View File

@@ -524,10 +524,6 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities option.Capabilities) (driver ID
}
wd.mjpegClient = NewHTTPClientWithConnection(wd.mjpegHTTPConn, 30*time.Second)
wd.mjpegUrl = fmt.Sprintf("%s:%d", host, localMjpegPort)
// init WDA scale
if wd.Session.scale, err = wd.Scale(); err != nil {
return nil, err
}
return wd, nil
}

View File

@@ -36,6 +36,13 @@ func NewWDADriver(device *IOSDevice) (*WDADriver, error) {
Session: &Session{},
}
driver.InitSession(nil)
// init WDA scale
var err error
if driver.scale, err = driver.Scale(); err != nil {
return nil, err
}
return driver, nil
}
@@ -43,6 +50,10 @@ type WDADriver struct {
Device *IOSDevice
Session *Session
// cache to avoid repeated query
windowSize types.Size
scale float64
mjpegHTTPConn net.Conn // via HTTP
mjpegClient *http.Client
mjpegUrl string
@@ -229,9 +240,9 @@ func (wd *WDADriver) BatteryInfo() (batteryInfo types.BatteryInfo, err error) {
func (wd *WDADriver) WindowSize() (size types.Size, err error) {
// [[FBRoute GET:@"/window/size"] respondWithTarget:self action:@selector(handleGetWindowSize:)]
if !wd.Session.windowSize.IsNil() {
if !wd.windowSize.IsNil() {
// use cached window size
return wd.Session.windowSize, nil
return wd.windowSize, nil
}
var rawResp DriverRawResponse
@@ -250,13 +261,13 @@ func (wd *WDADriver) WindowSize() (size types.Size, err error) {
size.Height = size.Height * int(scale)
size.Width = size.Width * int(scale)
wd.Session.windowSize = size // cache window size
return wd.Session.windowSize, nil
wd.windowSize = size // cache window size
return wd.windowSize, nil
}
func (wd *WDADriver) Scale() (float64, error) {
if !builtin.IsZeroFloat64(wd.Session.scale) {
return wd.Session.scale, nil
if !builtin.IsZeroFloat64(wd.scale) {
return wd.scale, nil
}
screen, err := wd.Screen()
if err != nil {
@@ -309,7 +320,7 @@ func (wd *WDADriver) ScreenShot(opts ...option.ActionOption) (raw *bytes.Buffer,
}
func (wd *WDADriver) toScale(x float64) float64 {
return x / wd.Session.scale
return x / wd.scale
}
func (wd *WDADriver) ActiveAppInfo() (info types.AppInfo, err error) {