feat: support to reset session automatically when crashed

This commit is contained in:
buyuxiang
2023-07-20 19:52:52 +08:00
parent c3a4e18f17
commit 135e24d378
5 changed files with 190 additions and 71 deletions
+21 -23
View File
@@ -46,12 +46,10 @@ func NewUIADriver(capabilities Capabilities, urlPrefix string) (driver *uiaDrive
driver.client = convertToHTTPClient(conn)
session, err := driver.NewSession(capabilities)
if err == nil {
driver.sessionId = session.SessionId
} else {
log.Warn().Msg(
"create UIAutomator session failed, use adb driver instead")
if err != nil {
return nil, errors.Wrap(err, "create UIAutomator session failed")
}
driver.sessionId = session.SessionId
return driver, nil
}
@@ -87,7 +85,7 @@ func (ud *uiaDriver) NewSession(capabilities Capabilities) (sessionInfo SessionI
// register(postHandler, new NewSession("/wd/hub/session"))
var rawResp rawResponse
data := map[string]interface{}{"capabilities": capabilities}
if rawResp, err = ud.httpPOST(data, "/session"); err != nil {
if rawResp, err = ud.uia2HttpPOST(data, "/session"); err != nil {
return SessionInfo{SessionId: ""}, err
}
reply := new(struct{ Value struct{ SessionId string } })
@@ -103,7 +101,7 @@ func (ud *uiaDriver) DeleteSession() (err error) {
if ud.sessionId == "" {
return nil
}
if _, err = ud.httpDELETE("/session", ud.sessionId); err == nil {
if _, err = ud.uia2HttpDELETE("/session", ud.sessionId); err == nil {
ud.sessionId = ""
}
@@ -113,7 +111,7 @@ func (ud *uiaDriver) DeleteSession() (err error) {
func (ud *uiaDriver) Status() (deviceStatus DeviceStatus, err error) {
// register(getHandler, new Status("/wd/hub/status"))
var rawResp rawResponse
if rawResp, err = ud.httpGET("/status"); err != nil {
if rawResp, err = ud.uia2HttpGET("/status"); err != nil {
return DeviceStatus{Ready: false}, err
}
reply := new(struct {
@@ -131,7 +129,7 @@ func (ud *uiaDriver) Status() (deviceStatus DeviceStatus, err error) {
func (ud *uiaDriver) DeviceInfo() (deviceInfo DeviceInfo, err error) {
// register(getHandler, new GetDeviceInfo("/wd/hub/session/:sessionId/appium/device/info"))
var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.sessionId, "appium/device/info"); err != nil {
if rawResp, err = ud.uia2HttpGET("/session", ud.sessionId, "appium/device/info"); err != nil {
return DeviceInfo{}, err
}
reply := new(struct{ Value struct{ DeviceInfo } })
@@ -145,7 +143,7 @@ func (ud *uiaDriver) DeviceInfo() (deviceInfo DeviceInfo, err error) {
func (ud *uiaDriver) BatteryInfo() (batteryInfo BatteryInfo, err error) {
// register(getHandler, new GetBatteryInfo("/wd/hub/session/:sessionId/appium/device/battery_info"))
var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.sessionId, "appium/device/battery_info"); err != nil {
if rawResp, err = ud.uia2HttpGET("/session", ud.sessionId, "appium/device/battery_info"); err != nil {
return BatteryInfo{}, err
}
reply := new(struct{ Value struct{ BatteryInfo } })
@@ -162,7 +160,7 @@ func (ud *uiaDriver) BatteryInfo() (batteryInfo BatteryInfo, err error) {
func (ud *uiaDriver) WindowSize() (size Size, err error) {
// register(getHandler, new GetDeviceSize("/wd/hub/session/:sessionId/window/:windowHandle/size"))
var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.sessionId, "window/:windowHandle/size"); err != nil {
if rawResp, err = ud.uia2HttpGET("/session", ud.sessionId, "window/:windowHandle/size"); err != nil {
return Size{}, errors.Wrap(err, "get window size failed with uiautomator2")
}
reply := new(struct{ Value struct{ Size } })
@@ -176,7 +174,7 @@ func (ud *uiaDriver) WindowSize() (size Size, err error) {
// PressBack simulates a short press on the BACK button.
func (ud *uiaDriver) PressBack(options ...ActionOption) (err error) {
// register(postHandler, new PressBack("/wd/hub/session/:sessionId/back"))
_, err = ud.httpPOST(nil, "/session", ud.sessionId, "back")
_, err = ud.uia2HttpPOST(nil, "/session", ud.sessionId, "back")
return
}
@@ -195,7 +193,7 @@ func (ud *uiaDriver) PressKeyCode(keyCode KeyCode, metaState KeyMeta, flags ...K
if len(flags) != 0 {
data["flags"] = flags[0]
}
_, err = ud.httpPOST(data, "/session", ud.sessionId, "appium/device/press_keycode")
_, err = ud.uia2HttpPOST(data, "/session", ud.sessionId, "appium/device/press_keycode")
return
}
@@ -212,7 +210,7 @@ func (ud *uiaDriver) TapFloat(x, y float64, options ...ActionOption) (err error)
// new data options in post data for extra uiautomator configurations
newData := mergeDataWithOptions(data, options...)
_, err = ud.httpPOST(newData, "/session", ud.sessionId, "appium/tap")
_, err = ud.uia2HttpPOST(newData, "/session", ud.sessionId, "appium/tap")
return
}
@@ -232,7 +230,7 @@ func (ud *uiaDriver) TouchAndHoldFloat(x, y float64, second ...float64) (err err
"duration": int(second[0] * 1000),
},
}
_, err = ud.httpPOST(data, "/session", ud.sessionId, "touch/longclick")
_, err = ud.uia2HttpPOST(data, "/session", ud.sessionId, "touch/longclick")
return
}
@@ -256,7 +254,7 @@ func (ud *uiaDriver) DragFloat(fromX, fromY, toX, toY float64, options ...Action
newData := mergeDataWithOptions(data, options...)
// register(postHandler, new Drag("/wd/hub/session/:sessionId/touch/drag"))
_, err = ud.httpPOST(newData, "/session", ud.sessionId, "touch/drag")
_, err = ud.uia2HttpPOST(newData, "/session", ud.sessionId, "touch/drag")
return
}
@@ -280,7 +278,7 @@ func (ud *uiaDriver) SwipeFloat(fromX, fromY, toX, toY float64, options ...Actio
// new data options in post data for extra uiautomator configurations
newData := mergeDataWithOptions(data, options...)
_, err := ud.httpPOST(newData, "/session", ud.sessionId, "touch/perform")
_, err := ud.uia2HttpPOST(newData, "/session", ud.sessionId, "touch/perform")
return err
}
@@ -298,7 +296,7 @@ func (ud *uiaDriver) SetPasteboard(contentType PasteboardType, content string) (
"content": base64.StdEncoding.EncodeToString([]byte(content)),
}
// register(postHandler, new SetClipboard("/wd/hub/session/:sessionId/appium/device/set_clipboard"))
_, err = ud.httpPOST(data, "/session", ud.sessionId, "appium/device/set_clipboard")
_, err = ud.uia2HttpPOST(data, "/session", ud.sessionId, "appium/device/set_clipboard")
return
}
@@ -311,7 +309,7 @@ func (ud *uiaDriver) GetPasteboard(contentType PasteboardType) (raw *bytes.Buffe
"contentType": contentType[0],
}
var rawResp rawResponse
if rawResp, err = ud.httpPOST(data, "/session", ud.sessionId, "appium/device/get_clipboard"); err != nil {
if rawResp, err = ud.uia2HttpPOST(data, "/session", ud.sessionId, "appium/device/get_clipboard"); err != nil {
return
}
reply := new(struct{ Value string })
@@ -336,7 +334,7 @@ func (ud *uiaDriver) SendKeys(text string, options ...ActionOption) (err error)
// new data options in post data for extra uiautomator configurations
newData := mergeDataWithOptions(data, options...)
_, err = ud.httpPOST(newData, "/session", ud.sessionId, "keys")
_, err = ud.uia2HttpPOST(newData, "/session", ud.sessionId, "keys")
return
}
@@ -347,7 +345,7 @@ func (ud *uiaDriver) Input(text string, options ...ActionOption) (err error) {
func (ud *uiaDriver) Rotation() (rotation Rotation, err error) {
// register(getHandler, new GetRotation("/wd/hub/session/:sessionId/rotation"))
var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.sessionId, "rotation"); err != nil {
if rawResp, err = ud.uia2HttpGET("/session", ud.sessionId, "rotation"); err != nil {
return Rotation{}, err
}
reply := new(struct{ Value Rotation })
@@ -362,7 +360,7 @@ 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 {
if rawResp, err = ud.uia2HttpGET("/session", ud.sessionId, "screenshot"); err != nil {
return nil, errors.Wrap(code.AndroidScreenShotError,
fmt.Sprintf("get UIA screenshot data failed: %v", err))
}
@@ -384,7 +382,7 @@ func (ud *uiaDriver) Screenshot() (raw *bytes.Buffer, err error) {
func (ud *uiaDriver) Source(srcOpt ...SourceOption) (source string, err error) {
// register(getHandler, new Source("/wd/hub/session/:sessionId/source"))
var rawResp rawResponse
if rawResp, err = ud.httpGET("/session", ud.sessionId, "source"); err != nil {
if rawResp, err = ud.uia2HttpGET("/session", ud.sessionId, "source"); err != nil {
return "", err
}
reply := new(struct{ Value string })