diff --git a/hrp/pkg/uixt/android_adb_driver.go b/hrp/pkg/uixt/android_adb_driver.go index b2d84652..64b4d94e 100644 --- a/hrp/pkg/uixt/android_adb_driver.go +++ b/hrp/pkg/uixt/android_adb_driver.go @@ -14,6 +14,8 @@ import ( "github.com/httprunner/httprunner/v4/hrp/pkg/gadb" ) +const AdbKeyBoardPackageName = "com.android.adbkeyboard/.AdbIME" + type adbDriver struct { Driver @@ -327,6 +329,38 @@ func (ad *adbDriver) SendKeys(text string, options ...ActionOption) (err error) return nil } +func (ad *adbDriver) IsAdbKeyBoardInstalled() bool { + output, err := ad.adbClient.RunShellCommand("ime", "list", "-a") + if err != nil { + return false + } + return strings.Contains(output, AdbKeyBoardPackageName) +} + +func (ad *adbDriver) SendKeysByAdbKeyBoard(text string) (err error) { + defer func() { + // Reset to default, don't care which keyboard was chosen before switch: + _, err = ad.adbClient.RunShellCommand("ime", "reset") + }() + + // Enable ADBKeyBoard from adb + if _, err = ad.adbClient.RunShellCommand("ime", "enable", AdbKeyBoardPackageName); err != nil { + return + } + // Switch to ADBKeyBoard from adb + if _, err = ad.adbClient.RunShellCommand("ime", "set", AdbKeyBoardPackageName); err != nil { + return + } + time.Sleep(time.Second) + // input Quoted text + text = strings.ReplaceAll(text, " ", "\\ ") + if _, err = ad.adbClient.RunShellCommand("am", "broadcast", "-a", "ADB_INPUT_TEXT", "--es", "msg", text); err != nil { + return + } + time.Sleep(time.Second) + return +} + func (ad *adbDriver) Input(text string, options ...ActionOption) (err error) { return ad.SendKeys(text, options...) } diff --git a/hrp/pkg/uixt/android_uia2_driver.go b/hrp/pkg/uixt/android_uia2_driver.go index 674b70c3..5f38556d 100644 --- a/hrp/pkg/uixt/android_uia2_driver.go +++ b/hrp/pkg/uixt/android_uia2_driver.go @@ -103,8 +103,8 @@ func (ud *uiaDriver) httpRequest(method string, rawURL string, rawBody []byte, d // wait for UIA2 server to resume automatically time.Sleep(3 * time.Second) oldSessionID := ud.sessionId - if err = ud.resetDriver(); err != nil { - log.Err(err).Msgf("failed to reset uia2 driver, retry count: %v", retryCount) + if err2 := ud.resetDriver(); err2 != nil { + log.Err(err2).Msgf("failed to reset uia2 driver, retry count: %v", retryCount) continue } log.Debug().Str("new session", ud.sessionId).Str("old session", oldSessionID).Msgf("successful to reset uia2 driver, retry count: %v", retryCount) @@ -426,6 +426,14 @@ func (ud *uiaDriver) SendKeys(text string, options ...ActionOption) (err error) actionOptions.updateData(data) _, err = ud.httpPOST(data, "/session", ud.sessionId, "keys") + if err != nil { + // use com.android.adbkeyboard if existed + if ud.IsAdbKeyBoardInstalled() { + err = ud.SendKeysByAdbKeyBoard(text) + } else { + _, err = ud.adbClient.RunShellCommand("input", "text", text) + } + } return } diff --git a/hrp/pkg/uixt/ios_driver.go b/hrp/pkg/uixt/ios_driver.go index 52390256..ea2d305f 100644 --- a/hrp/pkg/uixt/ios_driver.go +++ b/hrp/pkg/uixt/ios_driver.go @@ -55,8 +55,8 @@ func (wd *wdaDriver) httpRequest(method string, rawURL string, rawBody []byte, d // TODO: polling WDA to check if resumed automatically time.Sleep(5 * time.Second) oldSessionID := wd.sessionId - if err = wd.resetSession(); err != nil { - log.Err(err).Msgf("failed to reset wda driver, retry count: %v", retryCount) + if err2 := wd.resetSession(); err2 != nil { + log.Err(err2).Msgf("failed to reset wda driver, retry count: %v", retryCount) continue } log.Debug().Str("new session", wd.sessionId).Str("old session", oldSessionID).Msgf("successful to reset wda driver, retry count: %v", retryCount)