refactor UIA2 / WDA driver request

This commit is contained in:
buyuxiang
2023-07-24 17:43:36 +08:00
parent 0cbc5eec5a
commit c91be64240
5 changed files with 120 additions and 144 deletions
+57 -1
View File
@@ -6,9 +6,11 @@ import (
"encoding/json"
"fmt"
"net"
"net/http"
"net/url"
"strconv"
"strings"
"time"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
@@ -81,11 +83,65 @@ func (bs BatteryStatus) String() string {
}
}
func (ud *uiaDriver) resetUIA2Driver() error {
newUIADriver, err := NewUIADriver(NewCapabilities(), ud.urlPrefix.String())
if err != nil {
return err
}
ud.client = newUIADriver.client
ud.sessionId = newUIADriver.sessionId
return nil
}
func (ud *uiaDriver) uia2HttpRequest(method string, rawURL string, rawBody []byte, disableRetry ...bool) (rawResp rawResponse, err error) {
disableRetryBool := len(disableRetry) > 0 && disableRetry[0]
for retryCount := 1; retryCount <= 5; retryCount++ {
rawResp, err = ud.httpRequest(method, rawURL, rawBody)
if err == nil || disableRetryBool {
return
}
// wait for UIA2 server to resume automatically
time.Sleep(3 * time.Second)
oldSessionID := ud.sessionId
if err = ud.resetUIA2Driver(); err != nil {
log.Err(err).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)
if oldSessionID != "" {
rawURL = strings.Replace(rawURL, oldSessionID, ud.sessionId, 1)
}
}
return
}
func (ud *uiaDriver) uia2HttpGET(pathElem ...string) (rawResp rawResponse, err error) {
return ud.uia2HttpRequest(http.MethodGet, ud.concatURL(nil, pathElem...), nil)
}
func (ud *uiaDriver) uia2HttpGETWithRetry(pathElem ...string) (rawResp rawResponse, err error) {
return ud.uia2HttpRequest(http.MethodGet, ud.concatURL(nil, pathElem...), nil, true)
}
func (ud *uiaDriver) uia2HttpPOST(data interface{}, pathElem ...string) (rawResp rawResponse, err error) {
var bsJSON []byte = nil
if data != nil {
if bsJSON, err = json.Marshal(data); err != nil {
return nil, err
}
}
return ud.uia2HttpRequest(http.MethodPost, ud.concatURL(nil, pathElem...), bsJSON)
}
func (ud *uiaDriver) uia2HttpDELETE(pathElem ...string) (rawResp rawResponse, err error) {
return ud.uia2HttpRequest(http.MethodDelete, ud.concatURL(nil, pathElem...), nil)
}
func (ud *uiaDriver) NewSession(capabilities Capabilities) (sessionInfo SessionInfo, err error) {
// register(postHandler, new NewSession("/wd/hub/session"))
var rawResp rawResponse
data := map[string]interface{}{"capabilities": capabilities}
if rawResp, err = ud.uia2HttpPOST(data, "/session"); err != nil {
if rawResp, err = ud.httpPOST(data, "/session"); err != nil {
return SessionInfo{SessionId: ""}, err
}
reply := new(struct{ Value struct{ SessionId string } })