mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-06 07:57:27 +08:00
fix: use ADBKeyBoard if uiautomator failed
This commit is contained in:
@@ -14,6 +14,8 @@ import (
|
|||||||
"github.com/httprunner/httprunner/v4/hrp/pkg/gadb"
|
"github.com/httprunner/httprunner/v4/hrp/pkg/gadb"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const AdbKeyBoardPackageName = "com.android.adbkeyboard/.AdbIME"
|
||||||
|
|
||||||
type adbDriver struct {
|
type adbDriver struct {
|
||||||
Driver
|
Driver
|
||||||
|
|
||||||
@@ -327,6 +329,38 @@ func (ad *adbDriver) SendKeys(text string, options ...ActionOption) (err error)
|
|||||||
return nil
|
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) {
|
func (ad *adbDriver) Input(text string, options ...ActionOption) (err error) {
|
||||||
return ad.SendKeys(text, options...)
|
return ad.SendKeys(text, options...)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,8 +103,8 @@ func (ud *uiaDriver) httpRequest(method string, rawURL string, rawBody []byte, d
|
|||||||
// wait for UIA2 server to resume automatically
|
// wait for UIA2 server to resume automatically
|
||||||
time.Sleep(3 * time.Second)
|
time.Sleep(3 * time.Second)
|
||||||
oldSessionID := ud.sessionId
|
oldSessionID := ud.sessionId
|
||||||
if err = ud.resetDriver(); err != nil {
|
if err2 := ud.resetDriver(); err2 != nil {
|
||||||
log.Err(err).Msgf("failed to reset uia2 driver, retry count: %v", retryCount)
|
log.Err(err2).Msgf("failed to reset uia2 driver, retry count: %v", retryCount)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
log.Debug().Str("new session", ud.sessionId).Str("old session", oldSessionID).Msgf("successful to reset uia2 driver, retry count: %v", retryCount)
|
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)
|
actionOptions.updateData(data)
|
||||||
|
|
||||||
_, err = ud.httpPOST(data, "/session", ud.sessionId, "keys")
|
_, 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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ func (wd *wdaDriver) httpRequest(method string, rawURL string, rawBody []byte, d
|
|||||||
// TODO: polling WDA to check if resumed automatically
|
// TODO: polling WDA to check if resumed automatically
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
oldSessionID := wd.sessionId
|
oldSessionID := wd.sessionId
|
||||||
if err = wd.resetSession(); err != nil {
|
if err2 := wd.resetSession(); err2 != nil {
|
||||||
log.Err(err).Msgf("failed to reset wda driver, retry count: %v", retryCount)
|
log.Err(err2).Msgf("failed to reset wda driver, retry count: %v", retryCount)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
log.Debug().Str("new session", wd.sessionId).Str("old session", oldSessionID).Msgf("successful to reset wda driver, retry count: %v", retryCount)
|
log.Debug().Str("new session", wd.sessionId).Str("old session", oldSessionID).Msgf("successful to reset wda driver, retry count: %v", retryCount)
|
||||||
|
|||||||
Reference in New Issue
Block a user