Files
httprunner/hrp/pkg/uixt/android_elment.go
2022-11-23 23:36:52 +08:00

307 lines
8.4 KiB
Go

package uixt
import (
"bytes"
"encoding/base64"
"encoding/json"
"github.com/pkg/errors"
"github.com/rs/zerolog/log"
)
var errElementNotImplemented = errors.New("element method not implemented")
type uiaElement struct {
parent *uiaDriver
id string
}
func (ue uiaElement) Click() (err error) {
// register(postHandler, new Click("/wd/hub/session/:sessionId/element/:id/click"))
_, err = ue.parent.httpPOST(nil, "/session", ue.parent.sessionId, "/element", ue.id, "/click")
return
}
func (ue uiaElement) SendKeys(text string, options ...DataOption) (err error) {
// register(postHandler, new SendKeysToElement("/wd/hub/session/:sessionId/element/:id/value"))
// https://github.com/appium/appium-uiutomator2-server/blob/master/app/src/main/java/io/appium/uiutomator2/handler/SendKeysToElement.java#L76-L85
data := map[string]interface{}{
"text": text,
}
// new data options in post data for extra uiautomator configurations
newData := NewData(data, options...)
_, err = ue.parent.httpPOST(newData, "/session", ue.parent.sessionId, "/element", ue.id, "/value")
return
}
func (ue uiaElement) Clear() (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) Tap(x, y int) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) TapFloat(x, y float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) DoubleTap() (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) TouchAndHold(second ...float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) TwoFingerTap() (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) TapWithNumberOfTaps(numberOfTaps, numberOfTouches int) (err error) {
// Todo: implement
log.Fatal().Msg("not support")
return
}
func (ue uiaElement) ForceTouch(pressure float64, second ...float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) ForceTouchFloat(x, y, pressure float64, second ...float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) Drag(fromX, fromY, toX, toY int, steps ...float64) (err error) {
return ue.DragFloat(float64(fromX), float64(fromY), float64(toX), float64(toY), steps...)
}
func (ue uiaElement) DragFloat(fromX, fromY, toX, toY float64, steps ...float64) (err error) {
if len(steps) == 0 {
steps = []float64{12 * 10}
} else {
steps[0] = 12 * 10
}
data := map[string]interface{}{
"elementId": ue.id,
"endX": toX,
"endY": toY,
"steps": steps[0],
}
return ue.parent._drag(data)
}
func (ue uiaElement) Swipe(fromX, fromY, toX, toY int) error {
return ue.SwipeFloat(float64(fromX), float64(fromY), float64(toX), float64(toY))
}
func (ue uiaElement) SwipeFloat(fromX, fromY, toX, toY float64) error {
options := []DataOption{
WithDataSteps(12),
WithCustomOption("elementId", ue.id),
}
return ue.parent._swipe(fromX, fromY, toX, toY, options...)
}
func (ue uiaElement) SwipeDirection(direction Direction, velocity ...float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) Pinch(scale, velocity float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) PinchToZoomOutByW3CAction(scale ...float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) Rotate(rotation float64, velocity ...float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) PickerWheelSelect(order PickerWheelOrder, offset ...int) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) scroll(data interface{}) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) ScrollElementByName(name string) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) ScrollElementByPredicate(predicate string) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) ScrollToVisible() (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) ScrollDirection(direction Direction, distance ...float64) (err error) {
// TODO
return errElementNotImplemented
}
func (ue uiaElement) FindElement(by BySelector) (element WebElement, err error) {
method, selector := by.getMethodAndSelector()
return ue.parent._findElement(method, selector, ue.id)
}
func (ue uiaElement) FindElements(by BySelector) (elements []WebElement, err error) {
method, selector := by.getMethodAndSelector()
return ue.parent._findElements(method, selector, ue.id)
}
func (ue uiaElement) FindVisibleCells() (elements []WebElement, err error) {
// TODO
return elements, errElementNotImplemented
}
func (ue uiaElement) Rect() (rect Rect, err error) {
// register(getHandler, new GetRect("/wd/hub/session/:sessionId/element/:id/rect"))
var rawResp rawResponse
if rawResp, err = ue.parent.httpGET("/session", ue.parent.sessionId, "/element", ue.id, "/rect"); err != nil {
return Rect{}, err
}
reply := new(struct{ Value Rect })
if err = json.Unmarshal(rawResp, reply); err != nil {
return Rect{}, err
}
rect = reply.Value
return
}
func (ue uiaElement) Location() (point Point, err error) {
// register(getHandler, new Location("/wd/hub/session/:sessionId/element/:id/location"))
var rawResp rawResponse
if rawResp, err = ue.parent.httpGET("/session", ue.parent.sessionId, "/element", ue.id, "/location"); err != nil {
return Point{-1, -1}, err
}
reply := new(struct{ Value Point })
if err = json.Unmarshal(rawResp, reply); err != nil {
return Point{-1, -1}, err
}
point = reply.Value
return
}
func (ue uiaElement) Size() (size Size, err error) {
// register(getHandler, new GetSize("/wd/hub/session/:sessionId/element/:id/size"))
var rawResp rawResponse
if rawResp, err = ue.parent.httpGET("/session", ue.parent.sessionId, "/element", ue.id, "/size"); err != nil {
return Size{-1, -1}, err
}
reply := new(struct{ Value Size })
if err = json.Unmarshal(rawResp, reply); err != nil {
return Size{-1, -1}, err
}
size = reply.Value
return
}
func (ue uiaElement) Text() (text string, err error) {
// register(getHandler, new GetText("/wd/hub/session/:sessionId/element/:id/text"))
var rawResp rawResponse
if rawResp, err = ue.parent.httpGET("/session", ue.parent.sessionId, "/element", ue.id, "/text"); err != nil {
return "", err
}
reply := new(struct{ Value string })
if err = json.Unmarshal(rawResp, reply); err != nil {
return "", err
}
text = reply.Value
return
}
func (ue uiaElement) Type() (elemType string, err error) {
// TODO
return elemType, errElementNotImplemented
}
func (ue uiaElement) IsEnabled() (enabled bool, err error) {
// TODO
return enabled, errElementNotImplemented
}
func (ue uiaElement) IsDisplayed() (displayed bool, err error) {
// TODO
return displayed, errElementNotImplemented
}
func (ue uiaElement) IsSelected() (selected bool, err error) {
// TODO
return selected, errElementNotImplemented
}
func (ue uiaElement) IsAccessible() (accessible bool, err error) {
// TODO
return accessible, errElementNotImplemented
}
func (ue uiaElement) IsAccessibilityContainer() (isAccessibilityContainer bool, err error) {
// TODO
return isAccessibilityContainer, errElementNotImplemented
}
func (ue uiaElement) GetAttribute(attr ElementAttribute) (value string, err error) {
// register(getHandler, new GetElementAttribute("/wd/hub/session/:sessionId/element/:id/attribute/:name"))
var rawResp rawResponse
if rawResp, err = ue.parent.httpGET("/session", ue.parent.sessionId, "/element", ue.id, "/attribute", attr.getAttributeName()); err != nil {
return "", err
}
reply := new(struct{ Value string })
if err = json.Unmarshal(rawResp, reply); err != nil {
return "", err
}
value = reply.Value
return
}
func (ue uiaElement) UID() (uid string) {
return ue.id
}
func (ue uiaElement) Screenshot() (raw *bytes.Buffer, err error) {
// W3C endpoint
// register(getHandler, new GetElementScreenshot("/wd/hub/session/:sessionId/element/:id/screenshot"))
// JSONWP endpoint
// register(getHandler, new GetElementScreenshot("/wd/hub/session/:sessionId/screenshot/:id"))
var rawResp rawResponse
if rawResp, err = ue.parent.httpGET("/session", ue.parent.sessionId, "/element", ue.id, "/screenshot"); err != nil {
return nil, 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, err
}
raw = bytes.NewBuffer(decodeStr)
return
}