mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-25 18:30:04 +08:00
refactor: move files
This commit is contained in:
@@ -79,7 +79,7 @@ func NewAndroidDevice(opts ...option.AndroidDeviceOption) (device *AndroidDevice
|
||||
device = &AndroidDevice{
|
||||
AndroidDeviceConfig: androidOptions,
|
||||
d: dev,
|
||||
logcat: NewAdbLogcat(androidOptions.SerialNumber),
|
||||
logcat: NewAdbLogcat(device.SerialNumber),
|
||||
}
|
||||
|
||||
evalToolRaw, err := evalite.ReadFile("evalite")
|
||||
|
||||
@@ -656,7 +656,7 @@ func (ad *adbDriver) Screenshot() (raw *bytes.Buffer, err error) {
|
||||
return bytes.NewBuffer([]byte(resp)), nil
|
||||
}
|
||||
|
||||
func (ad *adbDriver) Source(srcOpt ...SourceOption) (source string, err error) {
|
||||
func (ad *adbDriver) Source(srcOpt ...option.SourceOption) (source string, err error) {
|
||||
_, err = ad.runShellCommand("rm", "-rf", "/sdcard/window_dump.xml")
|
||||
if err != nil {
|
||||
return
|
||||
@@ -681,7 +681,7 @@ func (ad *adbDriver) LogoutNoneUI(packageName string) error {
|
||||
return errDriverNotImplemented
|
||||
}
|
||||
|
||||
func (ad *adbDriver) sourceTree(srcOpt ...SourceOption) (sourceTree *Hierarchy, err error) {
|
||||
func (ad *adbDriver) sourceTree(srcOpt ...option.SourceOption) (sourceTree *Hierarchy, err error) {
|
||||
source, err := ad.Source()
|
||||
if err != nil {
|
||||
return
|
||||
|
||||
@@ -163,7 +163,7 @@ func (sad *stubAndroidDriver) Status() (DeviceStatus, error) {
|
||||
return DeviceStatus{}, nil
|
||||
}
|
||||
|
||||
func (sad *stubAndroidDriver) Source(srcOpt ...SourceOption) (source string, err error) {
|
||||
func (sad *stubAndroidDriver) Source(srcOpt ...option.SourceOption) (source string, err error) {
|
||||
app, err := sad.GetForegroundApp()
|
||||
if err != nil {
|
||||
return "", err
|
||||
|
||||
@@ -597,7 +597,7 @@ func (ud *uiaDriver) Screenshot() (raw *bytes.Buffer, err error) {
|
||||
return ud.adbDriver.Screenshot()
|
||||
}
|
||||
|
||||
func (ud *uiaDriver) Source(srcOpt ...SourceOption) (source string, err error) {
|
||||
func (ud *uiaDriver) Source(srcOpt ...option.SourceOption) (source string, err error) {
|
||||
// register(getHandler, new Source("/wd/hub/session/:sessionId/source"))
|
||||
var rawResp rawResponse
|
||||
if rawResp, err = ud.httpGET("/session", ud.session.ID, "source"); err != nil {
|
||||
@@ -612,7 +612,7 @@ func (ud *uiaDriver) Source(srcOpt ...SourceOption) (source string, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (ud *uiaDriver) sourceTree(srcOpt ...SourceOption) (sourceTree *Hierarchy, err error) {
|
||||
func (ud *uiaDriver) sourceTree(srcOpt ...option.SourceOption) (sourceTree *Hierarchy, err error) {
|
||||
source, err := ud.Source()
|
||||
if err != nil {
|
||||
return
|
||||
|
||||
@@ -1,320 +1,9 @@
|
||||
package uixt
|
||||
|
||||
import (
|
||||
"math"
|
||||
"strings"
|
||||
|
||||
"github.com/httprunner/httprunner/v5/pkg/uixt/option"
|
||||
)
|
||||
|
||||
type DeviceStatus struct {
|
||||
Message string `json:"message"`
|
||||
State string `json:"state"`
|
||||
OS struct {
|
||||
TestmanagerdVersion int `json:"testmanagerdVersion"`
|
||||
Name string `json:"name"`
|
||||
SdkVersion string `json:"sdkVersion"`
|
||||
Version string `json:"version"`
|
||||
} `json:"os"`
|
||||
IOS struct {
|
||||
IP string `json:"ip"`
|
||||
SimulatorVersion string `json:"simulatorVersion"`
|
||||
} `json:"ios"`
|
||||
Ready bool `json:"ready"`
|
||||
Build struct {
|
||||
Time string `json:"time"`
|
||||
ProductBundleIdentifier string `json:"productBundleIdentifier"`
|
||||
} `json:"build"`
|
||||
}
|
||||
|
||||
type DeviceInfo struct {
|
||||
TimeZone string `json:"timeZone"`
|
||||
CurrentLocale string `json:"currentLocale"`
|
||||
Model string `json:"model"`
|
||||
UUID string `json:"uuid"`
|
||||
UserInterfaceIdiom int `json:"userInterfaceIdiom"`
|
||||
UserInterfaceStyle string `json:"userInterfaceStyle"`
|
||||
Name string `json:"name"`
|
||||
IsSimulator bool `json:"isSimulator"`
|
||||
ThermalState int `json:"thermalState"`
|
||||
// ANDROID_ID A 64-bit number (as a hex string) that is uniquely generated when the user
|
||||
// first sets up the device and should remain constant for the lifetime of the user's device. The value
|
||||
// may change if a factory reset is performed on the device.
|
||||
AndroidID string `json:"androidId"`
|
||||
// Build.MANUFACTURER value
|
||||
Manufacturer string `json:"manufacturer"`
|
||||
// Build.BRAND value
|
||||
Brand string `json:"brand"`
|
||||
// Current running OS's API VERSION
|
||||
APIVersion string `json:"apiVersion"`
|
||||
// The current version string, for example "1.0" or "3.4b5"
|
||||
PlatformVersion string `json:"platformVersion"`
|
||||
// the name of the current celluar network carrier
|
||||
CarrierName string `json:"carrierName"`
|
||||
// the real size of the default display
|
||||
RealDisplaySize string `json:"realDisplaySize"`
|
||||
// The logical density of the display in Density Independent Pixel units.
|
||||
DisplayDensity int `json:"displayDensity"`
|
||||
// available networks
|
||||
Networks []networkInfo `json:"networks"`
|
||||
// current system locale
|
||||
Locale string `json:"locale"`
|
||||
Bluetooth struct {
|
||||
State string `json:"state"`
|
||||
} `json:"bluetooth"`
|
||||
}
|
||||
|
||||
type networkCapabilities struct {
|
||||
TransportTypes string `json:"transportTypes"`
|
||||
NetworkCapabilities string `json:"networkCapabilities"`
|
||||
LinkUpstreamBandwidthKbps int `json:"linkUpstreamBandwidthKbps"`
|
||||
LinkDownBandwidthKbps int `json:"linkDownBandwidthKbps"`
|
||||
SignalStrength int `json:"signalStrength"`
|
||||
SSID string `json:"SSID"`
|
||||
}
|
||||
|
||||
type networkInfo struct {
|
||||
Type int `json:"type"`
|
||||
TypeName string `json:"typeName"`
|
||||
Subtype int `json:"subtype"`
|
||||
SubtypeName string `json:"subtypeName"`
|
||||
IsConnected bool `json:"isConnected"`
|
||||
DetailedState string `json:"detailedState"`
|
||||
State string `json:"state"`
|
||||
ExtraInfo string `json:"extraInfo"`
|
||||
IsAvailable bool `json:"isAvailable"`
|
||||
IsRoaming bool `json:"isRoaming"`
|
||||
IsFailover bool `json:"isFailover"`
|
||||
Capabilities networkCapabilities `json:"capabilities"`
|
||||
}
|
||||
|
||||
type Location struct {
|
||||
AuthorizationStatus int `json:"authorizationStatus"`
|
||||
Longitude float64 `json:"longitude"`
|
||||
Latitude float64 `json:"latitude"`
|
||||
Altitude float64 `json:"altitude"`
|
||||
}
|
||||
|
||||
type BatteryInfo struct {
|
||||
// Battery level in range [0.0, 1.0], where 1.0 means 100% charge.
|
||||
Level float64 `json:"level"`
|
||||
|
||||
// Battery state ( 1: on battery, discharging; 2: plugged in, less than 100%, 3: plugged in, at 100% )
|
||||
State BatteryState `json:"state"`
|
||||
|
||||
Status BatteryStatus `json:"status"`
|
||||
}
|
||||
|
||||
type BatteryState int
|
||||
|
||||
const (
|
||||
_ = iota
|
||||
BatteryStateUnplugged BatteryState = iota // on battery, discharging
|
||||
BatteryStateCharging // plugged in, less than 100%
|
||||
BatteryStateFull // plugged in, at 100%
|
||||
)
|
||||
|
||||
func (v BatteryState) String() string {
|
||||
switch v {
|
||||
case BatteryStateUnplugged:
|
||||
return "On battery, discharging"
|
||||
case BatteryStateCharging:
|
||||
return "Plugged in, less than 100%"
|
||||
case BatteryStateFull:
|
||||
return "Plugged in, at 100%"
|
||||
default:
|
||||
return "UNKNOWN"
|
||||
}
|
||||
}
|
||||
|
||||
type Size struct {
|
||||
Width int `json:"width"`
|
||||
Height int `json:"height"`
|
||||
}
|
||||
|
||||
func (s Size) IsNil() bool {
|
||||
return s.Width == 0 && s.Height == 0
|
||||
}
|
||||
|
||||
type Screen struct {
|
||||
StatusBarSize Size `json:"statusBarSize"`
|
||||
Scale float64 `json:"scale"`
|
||||
}
|
||||
|
||||
type AppInfo struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
AppBaseInfo
|
||||
}
|
||||
|
||||
type WindowInfo struct {
|
||||
PackageName string `json:"packageName,omitempty"`
|
||||
Activity string `json:"activity,omitempty"`
|
||||
}
|
||||
|
||||
type AppBaseInfo struct {
|
||||
Pid int `json:"pid,omitempty"`
|
||||
BundleId string `json:"bundleId,omitempty"` // ios package name
|
||||
ViewController string `json:"viewController,omitempty"` // ios view controller
|
||||
PackageName string `json:"packageName,omitempty"` // android package name
|
||||
Activity string `json:"activity,omitempty"` // android activity
|
||||
VersionName string `json:"versionName,omitempty"`
|
||||
VersionCode interface{} `json:"versionCode,omitempty"` // int or string
|
||||
AppName string `json:"appName,omitempty"`
|
||||
AppPath string `json:"appPath,omitempty"`
|
||||
AppMD5 string `json:"appMD5,omitempty"`
|
||||
// AppIcon string `json:"appIcon,omitempty"`
|
||||
}
|
||||
|
||||
type AppState int
|
||||
|
||||
const (
|
||||
AppStateNotRunning AppState = 1 << iota
|
||||
AppStateRunningBack
|
||||
AppStateRunningFront
|
||||
)
|
||||
|
||||
func (v AppState) String() string {
|
||||
switch v {
|
||||
case AppStateNotRunning:
|
||||
return "Not Running"
|
||||
case AppStateRunningBack:
|
||||
return "Running (Back)"
|
||||
case AppStateRunningFront:
|
||||
return "Running (Front)"
|
||||
default:
|
||||
return "UNKNOWN"
|
||||
}
|
||||
}
|
||||
|
||||
// PasteboardType The type of the item on the pasteboard.
|
||||
type PasteboardType string
|
||||
|
||||
const (
|
||||
PasteboardTypePlaintext PasteboardType = "plaintext"
|
||||
PasteboardTypeImage PasteboardType = "image"
|
||||
PasteboardTypeUrl PasteboardType = "url"
|
||||
)
|
||||
|
||||
const (
|
||||
TextBackspace string = "\u0008"
|
||||
TextDelete string = "\u007F"
|
||||
)
|
||||
|
||||
// DeviceButton A physical button on an iOS device.
|
||||
type DeviceButton string
|
||||
|
||||
const (
|
||||
DeviceButtonHome DeviceButton = "home"
|
||||
DeviceButtonVolumeUp DeviceButton = "volumeUp"
|
||||
DeviceButtonVolumeDown DeviceButton = "volumeDown"
|
||||
)
|
||||
|
||||
type NotificationType string
|
||||
|
||||
const (
|
||||
NotificationTypePlain NotificationType = "plain"
|
||||
NotificationTypeDarwin NotificationType = "darwin"
|
||||
)
|
||||
|
||||
type Orientation string
|
||||
|
||||
const (
|
||||
// OrientationPortrait Device oriented vertically, home button on the bottom
|
||||
OrientationPortrait Orientation = "PORTRAIT"
|
||||
|
||||
// OrientationPortraitUpsideDown Device oriented vertically, home button on the top
|
||||
OrientationPortraitUpsideDown Orientation = "UIA_DEVICE_ORIENTATION_PORTRAIT_UPSIDEDOWN"
|
||||
|
||||
// OrientationLandscapeLeft Device oriented horizontally, home button on the right
|
||||
OrientationLandscapeLeft Orientation = "LANDSCAPE"
|
||||
|
||||
// OrientationLandscapeRight Device oriented horizontally, home button on the left
|
||||
OrientationLandscapeRight Orientation = "UIA_DEVICE_ORIENTATION_LANDSCAPERIGHT"
|
||||
)
|
||||
|
||||
type Rotation struct {
|
||||
X int `json:"x"`
|
||||
Y int `json:"y"`
|
||||
Z int `json:"z"`
|
||||
}
|
||||
|
||||
// SourceOption Configure the format or attribute of the Source
|
||||
type SourceOption map[string]interface{}
|
||||
|
||||
func NewSourceOption() SourceOption {
|
||||
return make(SourceOption)
|
||||
}
|
||||
|
||||
// WithFormatAsJson Application elements tree in form of json string
|
||||
func (opt SourceOption) WithFormatAsJson() SourceOption {
|
||||
opt["format"] = "json"
|
||||
return opt
|
||||
}
|
||||
|
||||
func (opt SourceOption) WithProcessName(processName string) SourceOption {
|
||||
opt["processName"] = processName
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithFormatAsXml Application elements tree in form of xml string
|
||||
func (opt SourceOption) WithFormatAsXml() SourceOption {
|
||||
opt["format"] = "xml"
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithFormatAsDescription Application elements tree in form of internal XCTest debugDescription string
|
||||
func (opt SourceOption) WithFormatAsDescription() SourceOption {
|
||||
opt["format"] = "description"
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithScope Allows to provide XML scope.
|
||||
//
|
||||
// only `xml` is supported.
|
||||
func (opt SourceOption) WithScope(scope string) SourceOption {
|
||||
if vFormat, ok := opt["format"]; ok && vFormat != "xml" {
|
||||
return opt
|
||||
}
|
||||
opt["scope"] = scope
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithExcludedAttributes Excludes the given attribute names.
|
||||
// only `xml` is supported.
|
||||
func (opt SourceOption) WithExcludedAttributes(attributes []string) SourceOption {
|
||||
if vFormat, ok := opt["format"]; ok && vFormat != "xml" {
|
||||
return opt
|
||||
}
|
||||
opt["excluded_attributes"] = strings.Join(attributes, ",")
|
||||
return opt
|
||||
}
|
||||
|
||||
type Condition func(wd IWebDriver) (bool, error)
|
||||
|
||||
type Direction string
|
||||
|
||||
const (
|
||||
DirectionUp Direction = "up"
|
||||
DirectionDown Direction = "down"
|
||||
DirectionLeft Direction = "left"
|
||||
DirectionRight Direction = "right"
|
||||
)
|
||||
|
||||
type Point struct {
|
||||
X int `json:"x"` // upper left X coordinate of selected element
|
||||
Y int `json:"y"` // upper left Y coordinate of selected element
|
||||
}
|
||||
|
||||
type PointF struct {
|
||||
X float64 `json:"x"`
|
||||
Y float64 `json:"y"`
|
||||
}
|
||||
|
||||
func (p PointF) IsIdentical(p2 PointF) bool {
|
||||
// set the coordinate precision to 1 pixel
|
||||
return math.Abs(p.X-p2.X) < 1 && math.Abs(p.Y-p2.Y) < 1
|
||||
}
|
||||
|
||||
// current implemeted device: IOSDevice, AndroidDevice, HarmonyDevice
|
||||
type IDevice interface {
|
||||
Init() error // init android device
|
||||
|
||||
@@ -137,7 +137,7 @@ type IWebDriver interface {
|
||||
Screenshot() (*bytes.Buffer, error)
|
||||
|
||||
// Source Return application elements tree
|
||||
Source(srcOpt ...SourceOption) (string, error)
|
||||
Source(srcOpt ...option.SourceOption) (string, error)
|
||||
|
||||
LoginNoneUI(packageName, phoneNumber string, captcha, password string) (info AppLoginInfo, err error)
|
||||
LogoutNoneUI(packageName string) error
|
||||
|
||||
@@ -220,7 +220,7 @@ func (dExt *DriverExt) DoAction(action MobileAction) (err error) {
|
||||
}
|
||||
case ACTION_GetSource:
|
||||
if packageName, ok := action.Params.(string); ok {
|
||||
source := NewSourceOption().WithProcessName(packageName)
|
||||
source := option.NewSourceOption().WithProcessName(packageName)
|
||||
_, err = dExt.Driver.Source(source)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to set ime")
|
||||
|
||||
@@ -274,7 +274,7 @@ func (hd *hdcDriver) Screenshot() (*bytes.Buffer, error) {
|
||||
return bytes.NewBuffer(raw), nil
|
||||
}
|
||||
|
||||
func (hd *hdcDriver) Source(srcOpt ...SourceOption) (string, error) {
|
||||
func (hd *hdcDriver) Source(srcOpt ...option.SourceOption) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
|
||||
@@ -450,7 +450,7 @@ func (s *stubIOSDriver) GetDriverResults() []*DriverResult {
|
||||
return s.wdaDriver.GetDriverResults()
|
||||
}
|
||||
|
||||
func (s *stubIOSDriver) Source(srcOpt ...SourceOption) (string, error) {
|
||||
func (s *stubIOSDriver) Source(srcOpt ...option.SourceOption) (string, error) {
|
||||
resp, err := s.DriverClient.Request(http.MethodGet, fmt.Sprintf("%s/source?format=json&onlyWeb=false", s.bightInsightPrefix), []byte{})
|
||||
if err != nil {
|
||||
return "", err
|
||||
|
||||
@@ -792,7 +792,7 @@ func (wd *wdaDriver) Screenshot() (raw *bytes.Buffer, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (wd *wdaDriver) Source(srcOpt ...SourceOption) (source string, err error) {
|
||||
func (wd *wdaDriver) Source(srcOpt ...option.SourceOption) (source string, err error) {
|
||||
// [[FBRoute GET:@"/source"] respondWithTarget:self action:@selector(handleGetSourceCommand:)]
|
||||
// [[FBRoute GET:@"/source"].withoutSession
|
||||
tmp, _ := url.Parse(wd.concatURL(nil, "/session", wd.session.ID))
|
||||
|
||||
54
pkg/uixt/option/source.go
Normal file
54
pkg/uixt/option/source.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package option
|
||||
|
||||
import "strings"
|
||||
|
||||
// SourceOption Configure the format or attribute of the Source
|
||||
type SourceOption map[string]interface{}
|
||||
|
||||
func NewSourceOption() SourceOption {
|
||||
return make(SourceOption)
|
||||
}
|
||||
|
||||
// WithFormatAsJson Application elements tree in form of json string
|
||||
func (opt SourceOption) WithFormatAsJson() SourceOption {
|
||||
opt["format"] = "json"
|
||||
return opt
|
||||
}
|
||||
|
||||
func (opt SourceOption) WithProcessName(processName string) SourceOption {
|
||||
opt["processName"] = processName
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithFormatAsXml Application elements tree in form of xml string
|
||||
func (opt SourceOption) WithFormatAsXml() SourceOption {
|
||||
opt["format"] = "xml"
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithFormatAsDescription Application elements tree in form of internal XCTest debugDescription string
|
||||
func (opt SourceOption) WithFormatAsDescription() SourceOption {
|
||||
opt["format"] = "description"
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithScope Allows to provide XML scope.
|
||||
//
|
||||
// only `xml` is supported.
|
||||
func (opt SourceOption) WithScope(scope string) SourceOption {
|
||||
if vFormat, ok := opt["format"]; ok && vFormat != "xml" {
|
||||
return opt
|
||||
}
|
||||
opt["scope"] = scope
|
||||
return opt
|
||||
}
|
||||
|
||||
// WithExcludedAttributes Excludes the given attribute names.
|
||||
// only `xml` is supported.
|
||||
func (opt SourceOption) WithExcludedAttributes(attributes []string) SourceOption {
|
||||
if vFormat, ok := opt["format"]; ok && vFormat != "xml" {
|
||||
return opt
|
||||
}
|
||||
opt["excluded_attributes"] = strings.Join(attributes, ",")
|
||||
return opt
|
||||
}
|
||||
260
pkg/uixt/types.go
Normal file
260
pkg/uixt/types.go
Normal file
@@ -0,0 +1,260 @@
|
||||
package uixt
|
||||
|
||||
import "math"
|
||||
|
||||
type DeviceStatus struct {
|
||||
Message string `json:"message"`
|
||||
State string `json:"state"`
|
||||
OS struct {
|
||||
TestmanagerdVersion int `json:"testmanagerdVersion"`
|
||||
Name string `json:"name"`
|
||||
SdkVersion string `json:"sdkVersion"`
|
||||
Version string `json:"version"`
|
||||
} `json:"os"`
|
||||
IOS struct {
|
||||
IP string `json:"ip"`
|
||||
SimulatorVersion string `json:"simulatorVersion"`
|
||||
} `json:"ios"`
|
||||
Ready bool `json:"ready"`
|
||||
Build struct {
|
||||
Time string `json:"time"`
|
||||
ProductBundleIdentifier string `json:"productBundleIdentifier"`
|
||||
} `json:"build"`
|
||||
}
|
||||
|
||||
type DeviceInfo struct {
|
||||
TimeZone string `json:"timeZone"`
|
||||
CurrentLocale string `json:"currentLocale"`
|
||||
Model string `json:"model"`
|
||||
UUID string `json:"uuid"`
|
||||
UserInterfaceIdiom int `json:"userInterfaceIdiom"`
|
||||
UserInterfaceStyle string `json:"userInterfaceStyle"`
|
||||
Name string `json:"name"`
|
||||
IsSimulator bool `json:"isSimulator"`
|
||||
ThermalState int `json:"thermalState"`
|
||||
// ANDROID_ID A 64-bit number (as a hex string) that is uniquely generated when the user
|
||||
// first sets up the device and should remain constant for the lifetime of the user's device. The value
|
||||
// may change if a factory reset is performed on the device.
|
||||
AndroidID string `json:"androidId"`
|
||||
// Build.MANUFACTURER value
|
||||
Manufacturer string `json:"manufacturer"`
|
||||
// Build.BRAND value
|
||||
Brand string `json:"brand"`
|
||||
// Current running OS's API VERSION
|
||||
APIVersion string `json:"apiVersion"`
|
||||
// The current version string, for example "1.0" or "3.4b5"
|
||||
PlatformVersion string `json:"platformVersion"`
|
||||
// the name of the current celluar network carrier
|
||||
CarrierName string `json:"carrierName"`
|
||||
// the real size of the default display
|
||||
RealDisplaySize string `json:"realDisplaySize"`
|
||||
// The logical density of the display in Density Independent Pixel units.
|
||||
DisplayDensity int `json:"displayDensity"`
|
||||
// available networks
|
||||
Networks []networkInfo `json:"networks"`
|
||||
// current system locale
|
||||
Locale string `json:"locale"`
|
||||
Bluetooth struct {
|
||||
State string `json:"state"`
|
||||
} `json:"bluetooth"`
|
||||
}
|
||||
|
||||
type networkCapabilities struct {
|
||||
TransportTypes string `json:"transportTypes"`
|
||||
NetworkCapabilities string `json:"networkCapabilities"`
|
||||
LinkUpstreamBandwidthKbps int `json:"linkUpstreamBandwidthKbps"`
|
||||
LinkDownBandwidthKbps int `json:"linkDownBandwidthKbps"`
|
||||
SignalStrength int `json:"signalStrength"`
|
||||
SSID string `json:"SSID"`
|
||||
}
|
||||
|
||||
type networkInfo struct {
|
||||
Type int `json:"type"`
|
||||
TypeName string `json:"typeName"`
|
||||
Subtype int `json:"subtype"`
|
||||
SubtypeName string `json:"subtypeName"`
|
||||
IsConnected bool `json:"isConnected"`
|
||||
DetailedState string `json:"detailedState"`
|
||||
State string `json:"state"`
|
||||
ExtraInfo string `json:"extraInfo"`
|
||||
IsAvailable bool `json:"isAvailable"`
|
||||
IsRoaming bool `json:"isRoaming"`
|
||||
IsFailover bool `json:"isFailover"`
|
||||
Capabilities networkCapabilities `json:"capabilities"`
|
||||
}
|
||||
|
||||
type Location struct {
|
||||
AuthorizationStatus int `json:"authorizationStatus"`
|
||||
Longitude float64 `json:"longitude"`
|
||||
Latitude float64 `json:"latitude"`
|
||||
Altitude float64 `json:"altitude"`
|
||||
}
|
||||
|
||||
type BatteryInfo struct {
|
||||
// Battery level in range [0.0, 1.0], where 1.0 means 100% charge.
|
||||
Level float64 `json:"level"`
|
||||
|
||||
// Battery state ( 1: on battery, discharging; 2: plugged in, less than 100%, 3: plugged in, at 100% )
|
||||
State BatteryState `json:"state"`
|
||||
|
||||
Status BatteryStatus `json:"status"`
|
||||
}
|
||||
|
||||
type BatteryState int
|
||||
|
||||
const (
|
||||
_ = iota
|
||||
BatteryStateUnplugged BatteryState = iota // on battery, discharging
|
||||
BatteryStateCharging // plugged in, less than 100%
|
||||
BatteryStateFull // plugged in, at 100%
|
||||
)
|
||||
|
||||
func (v BatteryState) String() string {
|
||||
switch v {
|
||||
case BatteryStateUnplugged:
|
||||
return "On battery, discharging"
|
||||
case BatteryStateCharging:
|
||||
return "Plugged in, less than 100%"
|
||||
case BatteryStateFull:
|
||||
return "Plugged in, at 100%"
|
||||
default:
|
||||
return "UNKNOWN"
|
||||
}
|
||||
}
|
||||
|
||||
type Size struct {
|
||||
Width int `json:"width"`
|
||||
Height int `json:"height"`
|
||||
}
|
||||
|
||||
func (s Size) IsNil() bool {
|
||||
return s.Width == 0 && s.Height == 0
|
||||
}
|
||||
|
||||
type Screen struct {
|
||||
StatusBarSize Size `json:"statusBarSize"`
|
||||
Scale float64 `json:"scale"`
|
||||
}
|
||||
|
||||
type AppInfo struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
AppBaseInfo
|
||||
}
|
||||
|
||||
type WindowInfo struct {
|
||||
PackageName string `json:"packageName,omitempty"`
|
||||
Activity string `json:"activity,omitempty"`
|
||||
}
|
||||
|
||||
type AppBaseInfo struct {
|
||||
Pid int `json:"pid,omitempty"`
|
||||
BundleId string `json:"bundleId,omitempty"` // ios package name
|
||||
ViewController string `json:"viewController,omitempty"` // ios view controller
|
||||
PackageName string `json:"packageName,omitempty"` // android package name
|
||||
Activity string `json:"activity,omitempty"` // android activity
|
||||
VersionName string `json:"versionName,omitempty"`
|
||||
VersionCode interface{} `json:"versionCode,omitempty"` // int or string
|
||||
AppName string `json:"appName,omitempty"`
|
||||
AppPath string `json:"appPath,omitempty"`
|
||||
AppMD5 string `json:"appMD5,omitempty"`
|
||||
// AppIcon string `json:"appIcon,omitempty"`
|
||||
}
|
||||
|
||||
type AppState int
|
||||
|
||||
const (
|
||||
AppStateNotRunning AppState = 1 << iota
|
||||
AppStateRunningBack
|
||||
AppStateRunningFront
|
||||
)
|
||||
|
||||
func (v AppState) String() string {
|
||||
switch v {
|
||||
case AppStateNotRunning:
|
||||
return "Not Running"
|
||||
case AppStateRunningBack:
|
||||
return "Running (Back)"
|
||||
case AppStateRunningFront:
|
||||
return "Running (Front)"
|
||||
default:
|
||||
return "UNKNOWN"
|
||||
}
|
||||
}
|
||||
|
||||
// PasteboardType The type of the item on the pasteboard.
|
||||
type PasteboardType string
|
||||
|
||||
const (
|
||||
PasteboardTypePlaintext PasteboardType = "plaintext"
|
||||
PasteboardTypeImage PasteboardType = "image"
|
||||
PasteboardTypeUrl PasteboardType = "url"
|
||||
)
|
||||
|
||||
const (
|
||||
TextBackspace string = "\u0008"
|
||||
TextDelete string = "\u007F"
|
||||
)
|
||||
|
||||
// DeviceButton A physical button on an iOS device.
|
||||
type DeviceButton string
|
||||
|
||||
const (
|
||||
DeviceButtonHome DeviceButton = "home"
|
||||
DeviceButtonVolumeUp DeviceButton = "volumeUp"
|
||||
DeviceButtonVolumeDown DeviceButton = "volumeDown"
|
||||
)
|
||||
|
||||
type NotificationType string
|
||||
|
||||
const (
|
||||
NotificationTypePlain NotificationType = "plain"
|
||||
NotificationTypeDarwin NotificationType = "darwin"
|
||||
)
|
||||
|
||||
type Orientation string
|
||||
|
||||
const (
|
||||
// OrientationPortrait Device oriented vertically, home button on the bottom
|
||||
OrientationPortrait Orientation = "PORTRAIT"
|
||||
|
||||
// OrientationPortraitUpsideDown Device oriented vertically, home button on the top
|
||||
OrientationPortraitUpsideDown Orientation = "UIA_DEVICE_ORIENTATION_PORTRAIT_UPSIDEDOWN"
|
||||
|
||||
// OrientationLandscapeLeft Device oriented horizontally, home button on the right
|
||||
OrientationLandscapeLeft Orientation = "LANDSCAPE"
|
||||
|
||||
// OrientationLandscapeRight Device oriented horizontally, home button on the left
|
||||
OrientationLandscapeRight Orientation = "UIA_DEVICE_ORIENTATION_LANDSCAPERIGHT"
|
||||
)
|
||||
|
||||
type Rotation struct {
|
||||
X int `json:"x"`
|
||||
Y int `json:"y"`
|
||||
Z int `json:"z"`
|
||||
}
|
||||
|
||||
type Condition func(wd IWebDriver) (bool, error)
|
||||
|
||||
type Direction string
|
||||
|
||||
const (
|
||||
DirectionUp Direction = "up"
|
||||
DirectionDown Direction = "down"
|
||||
DirectionLeft Direction = "left"
|
||||
DirectionRight Direction = "right"
|
||||
)
|
||||
|
||||
type Point struct {
|
||||
X int `json:"x"` // upper left X coordinate of selected element
|
||||
Y int `json:"y"` // upper left Y coordinate of selected element
|
||||
}
|
||||
|
||||
type PointF struct {
|
||||
X float64 `json:"x"`
|
||||
Y float64 `json:"y"`
|
||||
}
|
||||
|
||||
func (p PointF) IsIdentical(p2 PointF) bool {
|
||||
// set the coordinate precision to 1 pixel
|
||||
return math.Abs(p.X-p2.X) < 1 && math.Abs(p.Y-p2.Y) < 1
|
||||
}
|
||||
Reference in New Issue
Block a user