From 118f9cc1faa6d32902fff38e214482746980ce4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E6=B3=93=E9=93=AE?= Date: Mon, 20 May 2024 14:33:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dforward=E4=B8=8D?= =?UTF-8?q?=E9=87=8A=E6=94=BE=EF=BC=8C=E4=B8=80=E7=9B=B4=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=96=B0=E7=9A=84forward=EF=BC=8C=E8=80=97=E5=B0=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8F=A5=E6=9F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hrp/internal/builtin/utils.go | 15 +++++++++++++++ hrp/internal/version/VERSION | 3 +-- hrp/pkg/gadb/device.go | 25 +++++++++++++++++++++---- hrp/pkg/gadb/device_test.go | 3 +-- hrp/pkg/uixt/android_device.go | 23 ++--------------------- hrp/pkg/uixt/android_test.go | 18 ++++++++++-------- hrp/pkg/uixt/android_uia2_driver.go | 23 +++-------------------- hrp/pkg/uixt/ios_device.go | 5 +++-- 8 files changed, 56 insertions(+), 59 deletions(-) diff --git a/hrp/internal/builtin/utils.go b/hrp/internal/builtin/utils.go index 9f1b24d5..ba1c47dd 100644 --- a/hrp/internal/builtin/utils.go +++ b/hrp/internal/builtin/utils.go @@ -10,6 +10,7 @@ import ( "fmt" "math" "math/rand" + "net" "os" "path/filepath" "reflect" @@ -484,6 +485,20 @@ func ConvertToStringSlice(val interface{}) ([]string, error) { return nil, fmt.Errorf("invalid type for conversion to []string") } +func GetFreePort() (int, error) { + addr, err := net.ResolveTCPAddr("tcp", "localhost:0") + if err != nil { + return 0, errors.Wrap(err, "resolve tcp addr failed") + } + + l, err := net.ListenTCP("tcp", addr) + if err != nil { + return 0, errors.Wrap(err, "listen tcp addr failed") + } + defer func() { _ = l.Close() }() + return l.Addr().(*net.TCPAddr).Port, nil +} + func GetCurrentDay() string { now := time.Now() // 格式化日期为 yyyyMMdd diff --git a/hrp/internal/version/VERSION b/hrp/internal/version/VERSION index 42cdebb8..7422eeba 100644 --- a/hrp/internal/version/VERSION +++ b/hrp/internal/version/VERSION @@ -1,2 +1 @@ -v4.5.0 - +v4.5.0 \ No newline at end of file diff --git a/hrp/pkg/gadb/device.go b/hrp/pkg/gadb/device.go index ead9227d..d388ad55 100644 --- a/hrp/pkg/gadb/device.go +++ b/hrp/pkg/gadb/device.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "os" + "strconv" "strings" "time" @@ -181,10 +182,8 @@ func (d *Device) DevicePath() (string, error) { return resp, err } -func (d *Device) Forward(localPort int, remoteInterface interface{}, noRebind ...bool) (err error) { - command := "" +func (d *Device) Forward(remoteInterface interface{}, noRebind ...bool) (port int, err error) { var remote string - local := fmt.Sprintf("tcp:%d", localPort) switch r := remoteInterface.(type) { // for unix sockets case string: @@ -193,6 +192,24 @@ func (d *Device) Forward(localPort int, remoteInterface interface{}, noRebind .. remote = fmt.Sprintf("tcp:%d", r) } + forwardList, err := d.ForwardList() + if err != nil { + return + } + for _, forwardItem := range forwardList { + if forwardItem.Remote == remote { + return strconv.Atoi(forwardItem.Local[4:]) + } + } + localPort, err := builtin.GetFreePort() + if err != nil { + return + } + + command := "" + + local := fmt.Sprintf("tcp:%d", localPort) + if len(noRebind) != 0 && noRebind[0] { command = fmt.Sprintf("host-serial:%s:forward:norebind:%s;%s", d.serial, local, remote) } else { @@ -200,7 +217,7 @@ func (d *Device) Forward(localPort int, remoteInterface interface{}, noRebind .. } _, err = d.adbClient.executeCommand(command, true) - return + return localPort, nil } func (d *Device) ForwardList() (deviceForwardList []DeviceForward, err error) { diff --git a/hrp/pkg/gadb/device_test.go b/hrp/pkg/gadb/device_test.go index e1279051..d6ff7d2e 100644 --- a/hrp/pkg/gadb/device_test.go +++ b/hrp/pkg/gadb/device_test.go @@ -124,8 +124,7 @@ func TestDevice_Forward(t *testing.T) { setupDevices(t) for _, device := range devices { - localPort := 61000 - err := device.Forward(localPort, 6790) + localPort, err := device.Forward(6790) if err != nil { t.Fatal(err) } diff --git a/hrp/pkg/uixt/android_device.go b/hrp/pkg/uixt/android_device.go index 34764a70..29100163 100644 --- a/hrp/pkg/uixt/android_device.go +++ b/hrp/pkg/uixt/android_device.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "fmt" - "net" "os/exec" "strings" @@ -198,12 +197,8 @@ func (dev *AndroidDevice) NewDriver(options ...DriverOption) (driverExt *DriverE // NewUSBDriver creates new client via USB connected device, this will also start a new session. func (dev *AndroidDevice) NewUSBDriver(capabilities Capabilities) (driver WebDriver, err error) { - var localPort int - if localPort, err = getFreePort(); err != nil { - return nil, errors.Wrap(code.AndroidDeviceConnectionError, - fmt.Sprintf("get free port failed: %v", err)) - } - if err = dev.d.Forward(localPort, UIA2ServerPort); err != nil { + localPort, err := dev.d.Forward(UIA2ServerPort) + if err != nil { return nil, errors.Wrap(code.AndroidDeviceConnectionError, fmt.Sprintf("forward port %d->%d failed: %v", localPort, UIA2ServerPort, err)) @@ -262,20 +257,6 @@ func (dev *AndroidDevice) StopPcap() string { return "" } -func getFreePort() (int, error) { - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - if err != nil { - return 0, errors.Wrap(err, "resolve tcp addr failed") - } - - l, err := net.ListenTCP("tcp", addr) - if err != nil { - return 0, errors.Wrap(err, "listen tcp addr failed") - } - defer func() { _ = l.Close() }() - return l.Addr().(*net.TCPAddr).Port, nil -} - type LineCallback func(string) type AdbLogcat struct { diff --git a/hrp/pkg/uixt/android_test.go b/hrp/pkg/uixt/android_test.go index 6284fb66..3c20f741 100644 --- a/hrp/pkg/uixt/android_test.go +++ b/hrp/pkg/uixt/android_test.go @@ -10,6 +10,8 @@ import ( "strings" "testing" "time" + + "github.com/httprunner/httprunner/v4/hrp/internal/builtin" ) var ( @@ -21,6 +23,7 @@ func setupAndroid(t *testing.T) { device, err := NewAndroidDevice() checkErr(t, err) device.UIA2 = false + device.LogOn = true driverExt, err = device.NewDriver() checkErr(t, err) } @@ -195,22 +198,21 @@ func TestDriver_DeviceInfo(t *testing.T) { } func TestDriver_Tap(t *testing.T) { - driver, err := NewUIADriver(nil, uiaServerURL) - if err != nil { - t.Fatal(err) - } - - err = driver.Tap(150, 340) + setupAndroid(t) + driverExt.Driver.StartCaptureLog("") + err := driverExt.Driver.Tap(150, 340, WithIdentifier("test")) if err != nil { t.Fatal(err) } time.Sleep(time.Second) - err = driver.TapFloat(60.5, 125.5) + err = driverExt.Driver.TapFloat(60.5, 125.5, WithIdentifier("test")) if err != nil { t.Fatal(err) } time.Sleep(time.Second) + result, _ := driverExt.Driver.StopCaptureLog() + t.Log(result) } func TestDriver_Swipe(t *testing.T) { @@ -333,7 +335,7 @@ func TestUiSelectorHelper_NewUiSelectorHelper(t *testing.T) { } func Test_getFreePort(t *testing.T) { - freePort, err := getFreePort() + freePort, err := builtin.GetFreePort() if err != nil { t.Fatal(err) } diff --git a/hrp/pkg/uixt/android_uia2_driver.go b/hrp/pkg/uixt/android_uia2_driver.go index acc58b35..6606cd78 100644 --- a/hrp/pkg/uixt/android_uia2_driver.go +++ b/hrp/pkg/uixt/android_uia2_driver.go @@ -16,7 +16,6 @@ import ( "github.com/pkg/errors" "github.com/rs/zerolog/log" - "github.com/httprunner/httprunner/v4/hrp/internal/code" "github.com/httprunner/httprunner/v4/hrp/pkg/utf7" ) @@ -564,25 +563,9 @@ func (ud *uiaDriver) Rotation() (rotation Rotation, err error) { } func (ud *uiaDriver) Screenshot() (raw *bytes.Buffer, err error) { - // register(getHandler, new CaptureScreenshot("/wd/hub/session/:sessionId/screenshot")) - var rawResp rawResponse - if rawResp, err = ud.httpGET("/session", ud.sessionId, "screenshot"); err != nil { - return nil, errors.Wrap(code.AndroidScreenShotError, - fmt.Sprintf("get UIA screenshot data failed: %v", err)) - } - reply := new(struct{ Value string }) - if err = json.Unmarshal(rawResp, reply); err != nil { - return nil, err - } - - var decodeStr []byte - if decodeStr, err = base64.StdEncoding.DecodeString(reply.Value); err != nil { - return nil, errors.Wrap(code.AndroidScreenShotError, - fmt.Sprintf("decode UIA screenshot data failed: %v", err)) - } - - raw = bytes.NewBuffer(decodeStr) - return + // https://bytedance.larkoffice.com/docx/C8qEdmSHnoRvMaxZauocMiYpnLh + // ui2截图受内存影响,改为adb截图 + return ud.adbDriver.Screenshot() } func (ud *uiaDriver) Source(srcOpt ...SourceOption) (source string, err error) { diff --git a/hrp/pkg/uixt/ios_device.go b/hrp/pkg/uixt/ios_device.go index b5283667..fea9f0f2 100644 --- a/hrp/pkg/uixt/ios_device.go +++ b/hrp/pkg/uixt/ios_device.go @@ -16,6 +16,7 @@ import ( "github.com/pkg/errors" "github.com/rs/zerolog/log" + "github.com/httprunner/httprunner/v4/hrp/internal/builtin" "github.com/httprunner/httprunner/v4/hrp/internal/code" "github.com/httprunner/httprunner/v4/hrp/internal/env" "github.com/httprunner/httprunner/v4/hrp/pkg/gidevice" @@ -592,7 +593,7 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities Capabilities) (driver WebDriver var localPort int localPort, err = strconv.Atoi(env.WDA_LOCAL_PORT) if err != nil { - localPort, err = getFreePort() + localPort, err = builtin.GetFreePort() if err != nil { return nil, errors.Wrap(code.IOSDeviceHTTPDriverError, fmt.Sprintf("get free port failed: %v", err)) @@ -609,7 +610,7 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities Capabilities) (driver WebDriver var localMjpegPort int localMjpegPort, err = strconv.Atoi(env.WDA_LOCAL_MJPEG_PORT) if err != nil { - localMjpegPort, err = getFreePort() + localMjpegPort, err = builtin.GetFreePort() if err != nil { return nil, errors.Wrap(code.IOSDeviceHTTPDriverError, fmt.Sprintf("get free port failed: %v", err))