mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-07 07:21:23 +08:00
feat: merge
This commit is contained in:
@@ -1,5 +1 @@
|
|||||||
<<<<<<< Updated upstream
|
|
||||||
v4.5.1
|
|
||||||
=======
|
|
||||||
v4.5.8
|
v4.5.8
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ const (
|
|||||||
ACTION_SleepRandom ActionMethod = "sleep_random"
|
ACTION_SleepRandom ActionMethod = "sleep_random"
|
||||||
ACTION_StartCamera ActionMethod = "camera_start" // alias for app_launch camera
|
ACTION_StartCamera ActionMethod = "camera_start" // alias for app_launch camera
|
||||||
ACTION_StopCamera ActionMethod = "camera_stop" // alias for app_terminate camera
|
ACTION_StopCamera ActionMethod = "camera_stop" // alias for app_terminate camera
|
||||||
|
ACTION_SetClipboard ActionMethod = "set_clipboard"
|
||||||
|
ACTION_GetClipboard ActionMethod = "get_clipboard"
|
||||||
|
ACTION_SetIme ActionMethod = "set_ime"
|
||||||
|
|
||||||
// UI validation
|
// UI validation
|
||||||
// selectors
|
// selectors
|
||||||
@@ -594,8 +597,25 @@ func (dExt *DriverExt) DoAction(action MobileAction) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf("app_terminate params should be bundleId(string), got %v", action.Params)
|
return fmt.Errorf("app_terminate params should be bundleId(string), got %v", action.Params)
|
||||||
|
case ACTION_SetClipboard:
|
||||||
|
if text, ok := action.Params.(string); ok {
|
||||||
|
err := dExt.Driver.SetPasteboard(PasteboardTypePlaintext, text)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "failed to set clipboard")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt.Errorf("set_clioboard params should be text(string), got %v", action.Params)
|
||||||
case ACTION_Home:
|
case ACTION_Home:
|
||||||
return dExt.Driver.Homescreen()
|
return dExt.Driver.Homescreen()
|
||||||
|
case ACTION_SetIme:
|
||||||
|
if ime, ok := action.Params.(string); ok {
|
||||||
|
err = dExt.Driver.SetIme(ime)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "failed to set ime")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
case ACTION_TapXY:
|
case ACTION_TapXY:
|
||||||
if location, ok := action.Params.([]interface{}); ok {
|
if location, ok := action.Params.([]interface{}); ok {
|
||||||
// relative x,y of window size: [0.5, 0.5]
|
// relative x,y of window size: [0.5, 0.5]
|
||||||
|
|||||||
@@ -421,6 +421,14 @@ func (ad *adbDriver) IsUnicodeIMEInstalled() bool {
|
|||||||
return strings.Contains(output, UnicodeImePackageName)
|
return strings.Contains(output, UnicodeImePackageName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ad *adbDriver) ListIme() []string {
|
||||||
|
output, err := ad.adbClient.RunShellCommand("ime", "list", "-s")
|
||||||
|
if err != nil {
|
||||||
|
return []string{}
|
||||||
|
}
|
||||||
|
return strings.Split(output, "\n")
|
||||||
|
}
|
||||||
|
|
||||||
func (ad *adbDriver) SendKeysByAdbKeyBoard(text string) (err error) {
|
func (ad *adbDriver) SendKeysByAdbKeyBoard(text string) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
// Reset to default, don't care which keyboard was chosen before switch:
|
// Reset to default, don't care which keyboard was chosen before switch:
|
||||||
@@ -719,11 +727,61 @@ func (ad *adbDriver) GetForegroundApp() (app AppInfo, err error) {
|
|||||||
return AppInfo{}, errors.Wrap(code.MobileUIAssertForegroundAppError, "get foreground app failed")
|
return AppInfo{}, errors.Wrap(code.MobileUIAssertForegroundAppError, "get foreground app failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ad *adbDriver) SetIme(ime string) error {
|
func (ad *adbDriver) GetFocusedPackage() (packageName string, err error) {
|
||||||
_, err := ad.adbClient.RunShellCommand("ime", "set", ime)
|
res, err := ad.adbClient.RunShellCommand("dumpsys", "window", "windows", "|", "grep", "-E", "'mCurrentFocus|mFocusedApp'")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
match := regexp.MustCompile("mCurrentFocus.+\\s([^\\s/}]+)/[^\\s/}]+(\\.[^\\s/}]+)}").FindStringSubmatch(res)
|
||||||
|
if len(match) > 1 {
|
||||||
|
packageName = match[1]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
match = regexp.MustCompile("mFocusedApp.+Record\\{.*\\s([^\\s/}]+)/([^\\s/}]+)(\\s[^\\s/}]+)*}").FindStringSubmatch(res)
|
||||||
|
if len(match) > 1 {
|
||||||
|
packageName = match[1]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Error().Str("dumpsys", res).Msg("failed to get focused package")
|
||||||
|
return "", fmt.Errorf("failed to get focused package")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ad *adbDriver) SetIme(imeRegx string) error {
|
||||||
|
imeList := ad.ListIme()
|
||||||
|
ime := ""
|
||||||
|
for _, imeName := range imeList {
|
||||||
|
if regexp.MustCompile(imeRegx).MatchString(imeName) {
|
||||||
|
ime = imeName
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ime == "" {
|
||||||
|
return fmt.Errorf("failed to set ime by %s, ime list: %v", imeRegx, imeList)
|
||||||
|
}
|
||||||
|
brand, _ := ad.adbClient.Brand()
|
||||||
|
packageName := strings.Split(ime, "/")[0]
|
||||||
|
res, err := ad.adbClient.RunShellCommand("ime", "set", ime)
|
||||||
|
log.Info().Str("funcName", "SetIme").Interface("ime", ime).
|
||||||
|
Interface("output", res).Msg("set ime")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if strings.ToLower(brand) == "oppo" {
|
||||||
|
pid, _ := ad.adbClient.RunShellCommand("pidof", packageName)
|
||||||
|
if strings.TrimSpace(pid) == "" {
|
||||||
|
focusedPackage, err := ad.GetFocusedPackage()
|
||||||
|
_ = ad.AppLaunch(packageName)
|
||||||
|
if err == nil && packageName != UnicodeImePackageName {
|
||||||
|
time.Sleep(10 * time.Second)
|
||||||
|
currentPackage, err := ad.GetFocusedPackage()
|
||||||
|
log.Info().Str("beforeFocusedPackage", focusedPackage).Str("afterFocusedPackage", currentPackage).Msg("")
|
||||||
|
if err == nil && currentPackage != focusedPackage {
|
||||||
|
_ = ad.PressKeyCode(KCBack, KMEmpty)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// even if the shell command has returned,
|
// even if the shell command has returned,
|
||||||
// as there might be a situation where the input method has not been completely switched yet
|
// as there might be a situation where the input method has not been completely switched yet
|
||||||
// Listen to the following message.
|
// Listen to the following message.
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
|
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/code"
|
"github.com/httprunner/httprunner/v4/hrp/internal/code"
|
||||||
|
"github.com/httprunner/httprunner/v4/hrp/internal/env"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/json"
|
"github.com/httprunner/httprunner/v4/hrp/internal/json"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/pkg/gadb"
|
"github.com/httprunner/httprunner/v4/hrp/pkg/gadb"
|
||||||
)
|
)
|
||||||
@@ -154,6 +155,14 @@ type AndroidDevice struct {
|
|||||||
UIA2IP string `json:"uia2_ip,omitempty" yaml:"uia2_ip,omitempty"` // uiautomator2 server ip
|
UIA2IP string `json:"uia2_ip,omitempty" yaml:"uia2_ip,omitempty"` // uiautomator2 server ip
|
||||||
UIA2Port int `json:"uia2_port,omitempty" yaml:"uia2_port,omitempty"` // uiautomator2 server port
|
UIA2Port int `json:"uia2_port,omitempty" yaml:"uia2_port,omitempty"` // uiautomator2 server port
|
||||||
LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"`
|
LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"`
|
||||||
|
IgnorePopup bool `json:"ignore_popup,omitempty" yaml:"ignore_popup,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dev *AndroidDevice) Init() error {
|
||||||
|
myexec.RunCommand("adb", "-s", dev.SerialNumber, "shell",
|
||||||
|
"ime", "enable", "io.appium.settings/.UnicodeIME")
|
||||||
|
myexec.RunCommand("adb", "-s", dev.SerialNumber, "shell", "rm", "-r", env.DeviceActionLogFilePath)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dev *AndroidDevice) UUID() string {
|
func (dev *AndroidDevice) UUID() string {
|
||||||
|
|||||||
@@ -216,17 +216,8 @@ func TestDriver_Tap(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDriver_Swipe(t *testing.T) {
|
func TestDriver_Swipe(t *testing.T) {
|
||||||
driver, err := NewUIADriver(nil, uiaServerURL)
|
setupAndroid(t)
|
||||||
if err != nil {
|
err := driverExt.Driver.Swipe(400, 1000, 400, 500, WithPressDuration(0.5))
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = driver.Swipe(400, 1000, 400, 500, WithPressDuration(2000))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = driver.SwipeFloat(400, 555.5, 400, 1255.5)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -307,6 +298,14 @@ func TestDriver_SetRotation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDriver_GetOrientation(t *testing.T) {
|
||||||
|
setupAndroid(t)
|
||||||
|
_, _ = driverExt.Driver.AppTerminate("com.quark.browser")
|
||||||
|
_ = driverExt.Driver.AppLaunch("com.quark.browser")
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
_ = driverExt.Driver.Homescreen()
|
||||||
|
}
|
||||||
|
|
||||||
func TestUiSelectorHelper_NewUiSelectorHelper(t *testing.T) {
|
func TestUiSelectorHelper_NewUiSelectorHelper(t *testing.T) {
|
||||||
uiSelector := NewUiSelectorHelper().Text("a").String()
|
uiSelector := NewUiSelectorHelper().Text("a").String()
|
||||||
if uiSelector != `new UiSelector().text("a");` {
|
if uiSelector != `new UiSelector().text("a");` {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ func NewUIADriver(capabilities Capabilities, urlPrefix string) (driver *uiaDrive
|
|||||||
log.Info().Msg("init uiautomator2 driver")
|
log.Info().Msg("init uiautomator2 driver")
|
||||||
if capabilities == nil {
|
if capabilities == nil {
|
||||||
capabilities = NewCapabilities()
|
capabilities = NewCapabilities()
|
||||||
|
capabilities.WithWaitForIdleTimeout(0)
|
||||||
}
|
}
|
||||||
driver = new(uiaDriver)
|
driver = new(uiaDriver)
|
||||||
if driver.urlPrefix, err = url.Parse(urlPrefix); err != nil {
|
if driver.urlPrefix, err = url.Parse(urlPrefix); err != nil {
|
||||||
@@ -141,7 +142,12 @@ func (ud *uiaDriver) httpDELETE(pathElem ...string) (rawResp rawResponse, err er
|
|||||||
func (ud *uiaDriver) NewSession(capabilities Capabilities) (sessionInfo SessionInfo, err error) {
|
func (ud *uiaDriver) NewSession(capabilities Capabilities) (sessionInfo SessionInfo, err error) {
|
||||||
// register(postHandler, new NewSession("/wd/hub/session"))
|
// register(postHandler, new NewSession("/wd/hub/session"))
|
||||||
var rawResp rawResponse
|
var rawResp rawResponse
|
||||||
data := map[string]interface{}{"capabilities": capabilities}
|
data := make(map[string]interface{})
|
||||||
|
if len(capabilities) == 0 {
|
||||||
|
data["capabilities"] = make(map[string]interface{})
|
||||||
|
} else {
|
||||||
|
data["capabilities"] = map[string]interface{}{"alwaysMatch": capabilities}
|
||||||
|
}
|
||||||
if rawResp, err = ud.Driver.httpPOST(data, "/session"); err != nil {
|
if rawResp, err = ud.Driver.httpPOST(data, "/session"); err != nil {
|
||||||
return SessionInfo{SessionId: ""}, err
|
return SessionInfo{SessionId: ""}, err
|
||||||
}
|
}
|
||||||
@@ -293,7 +299,7 @@ func (ud *uiaDriver) TapFloat(x, y float64, options ...ActionOption) (err error)
|
|||||||
|
|
||||||
duration := 100.0
|
duration := 100.0
|
||||||
if actionOptions.PressDuration > 0 {
|
if actionOptions.PressDuration > 0 {
|
||||||
duration = actionOptions.PressDuration
|
duration = actionOptions.PressDuration * 1000
|
||||||
}
|
}
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"actions": []interface{}{
|
"actions": []interface{}{
|
||||||
@@ -399,7 +405,7 @@ func (ud *uiaDriver) SwipeFloat(fromX, fromY, toX, toY float64, options ...Actio
|
|||||||
|
|
||||||
duration := 200.0
|
duration := 200.0
|
||||||
if actionOptions.PressDuration > 0 {
|
if actionOptions.PressDuration > 0 {
|
||||||
duration = actionOptions.PressDuration
|
duration = actionOptions.PressDuration * 1000
|
||||||
}
|
}
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"actions": []interface{}{
|
"actions": []interface{}{
|
||||||
|
|||||||
@@ -468,6 +468,7 @@ func WithDriverPlugin(plugin funplugin.IPlugin) DriverOption {
|
|||||||
|
|
||||||
// current implemeted device: IOSDevice, AndroidDevice
|
// current implemeted device: IOSDevice, AndroidDevice
|
||||||
type Device interface {
|
type Device interface {
|
||||||
|
Init() error // init android device
|
||||||
UUID() string // ios udid or android serial
|
UUID() string // ios udid or android serial
|
||||||
LogEnabled() bool
|
LogEnabled() bool
|
||||||
NewDriver(...DriverOption) (driverExt *DriverExt, err error)
|
NewDriver(...DriverOption) (driverExt *DriverExt, err error)
|
||||||
@@ -571,6 +572,8 @@ type WebDriver interface {
|
|||||||
// It worked when `WDA` was foreground. https://github.com/appium/WebDriverAgent/issues/330
|
// It worked when `WDA` was foreground. https://github.com/appium/WebDriverAgent/issues/330
|
||||||
GetPasteboard(contentType PasteboardType) (raw *bytes.Buffer, err error)
|
GetPasteboard(contentType PasteboardType) (raw *bytes.Buffer, err error)
|
||||||
|
|
||||||
|
SetIme(ime string) error
|
||||||
|
|
||||||
// SendKeys Types a string into active element. There must be element with keyboard focus,
|
// SendKeys Types a string into active element. There must be element with keyboard focus,
|
||||||
// otherwise an error is raised.
|
// otherwise an error is raised.
|
||||||
// WithFrequency option can be used to set frequency of typing (letters per sec). The default value is 60
|
// WithFrequency option can be used to set frequency of typing (letters per sec). The default value is 60
|
||||||
|
|||||||
@@ -276,6 +276,7 @@ type IOSDevice struct {
|
|||||||
MjpegPort int `json:"mjpeg_port,omitempty" yaml:"mjpeg_port,omitempty"` // WDA remote MJPEG port
|
MjpegPort int `json:"mjpeg_port,omitempty" yaml:"mjpeg_port,omitempty"` // WDA remote MJPEG port
|
||||||
LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"`
|
LogOn bool `json:"log_on,omitempty" yaml:"log_on,omitempty"`
|
||||||
XCTestBundleID string `json:"xctest_bundle_id,omitempty" yaml:"xctest_bundle_id,omitempty"`
|
XCTestBundleID string `json:"xctest_bundle_id,omitempty" yaml:"xctest_bundle_id,omitempty"`
|
||||||
|
IgnorePopup bool `json:"ignore_popup,omitempty" yaml:"ignore_popup,omitempty"`
|
||||||
|
|
||||||
// switch to iOS springboard before init WDA session
|
// switch to iOS springboard before init WDA session
|
||||||
ResetHomeOnStartup bool `json:"reset_home_on_startup,omitempty" yaml:"reset_home_on_startup,omitempty"`
|
ResetHomeOnStartup bool `json:"reset_home_on_startup,omitempty" yaml:"reset_home_on_startup,omitempty"`
|
||||||
@@ -294,6 +295,10 @@ type IOSDevice struct {
|
|||||||
pcapFile string // saved pcap file path
|
pcapFile string // saved pcap file path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (dev *IOSDevice) Init() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (dev *IOSDevice) UUID() string {
|
func (dev *IOSDevice) UUID() string {
|
||||||
return dev.UDID
|
return dev.UDID
|
||||||
}
|
}
|
||||||
@@ -631,7 +636,7 @@ func (dev *IOSDevice) NewHTTPDriver(capabilities Capabilities) (driver WebDriver
|
|||||||
wd := new(wdaDriver)
|
wd := new(wdaDriver)
|
||||||
wd.client = http.DefaultClient
|
wd.client = http.DefaultClient
|
||||||
|
|
||||||
host := "127.0.0.1"
|
host := "localhost"
|
||||||
if wd.urlPrefix, err = url.Parse(fmt.Sprintf("http://%s:%d", host, localPort)); err != nil {
|
if wd.urlPrefix, err = url.Parse(fmt.Sprintf("http://%s:%d", host, localPort)); err != nil {
|
||||||
return nil, errors.Wrap(code.IOSDeviceHTTPDriverError, err.Error())
|
return nil, errors.Wrap(code.IOSDeviceHTTPDriverError, err.Error())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -591,6 +591,10 @@ func (wd *wdaDriver) GetPasteboard(contentType PasteboardType) (raw *bytes.Buffe
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (wd *wdaDriver) SetIme(ime string) error {
|
||||||
|
return errDriverNotImplemented
|
||||||
|
}
|
||||||
|
|
||||||
func (wd *wdaDriver) SendKeys(text string, options ...ActionOption) (err error) {
|
func (wd *wdaDriver) SendKeys(text string, options ...ActionOption) (err error) {
|
||||||
// [[FBRoute POST:@"/wda/keys"] respondWithTarget:self action:@selector(handleKeys:)]
|
// [[FBRoute POST:@"/wda/keys"] respondWithTarget:self action:@selector(handleKeys:)]
|
||||||
actionOptions := NewActionOptions(options...)
|
actionOptions := NewActionOptions(options...)
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import (
|
|||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/httprunner/funplugin"
|
"github.com/httprunner/funplugin"
|
||||||
"github.com/httprunner/funplugin/myexec"
|
|
||||||
"github.com/jinzhu/copier"
|
"github.com/jinzhu/copier"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
@@ -26,7 +25,6 @@ import (
|
|||||||
|
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/builtin"
|
"github.com/httprunner/httprunner/v4/hrp/internal/builtin"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/code"
|
"github.com/httprunner/httprunner/v4/hrp/internal/code"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/env"
|
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/sdk"
|
"github.com/httprunner/httprunner/v4/hrp/internal/sdk"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/internal/version"
|
"github.com/httprunner/httprunner/v4/hrp/internal/version"
|
||||||
"github.com/httprunner/httprunner/v4/hrp/pkg/uixt"
|
"github.com/httprunner/httprunner/v4/hrp/pkg/uixt"
|
||||||
@@ -437,11 +435,15 @@ func (r *CaseRunner) parseConfig() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "init iOS device failed")
|
return errors.Wrap(err, "init iOS device failed")
|
||||||
}
|
}
|
||||||
|
if err := device.Init(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
client, err := device.NewDriver(uixt.WithDriverPlugin(r.parser.plugin))
|
client, err := device.NewDriver(uixt.WithDriverPlugin(r.parser.plugin))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "init iOS WDA client failed")
|
return errors.Wrap(err, "init iOS WDA client failed")
|
||||||
}
|
}
|
||||||
r.uiClients[device.UDID] = client
|
r.uiClients[device.UDID] = client
|
||||||
|
|
||||||
}
|
}
|
||||||
for _, androidDeviceConfig := range r.parsedConfig.Android {
|
for _, androidDeviceConfig := range r.parsedConfig.Android {
|
||||||
if androidDeviceConfig.SerialNumber != "" {
|
if androidDeviceConfig.SerialNumber != "" {
|
||||||
@@ -456,11 +458,15 @@ func (r *CaseRunner) parseConfig() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "init Android device failed")
|
return errors.Wrap(err, "init Android device failed")
|
||||||
}
|
}
|
||||||
|
if err := device.Init(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
client, err := device.NewDriver(uixt.WithDriverPlugin(r.parser.plugin))
|
client, err := device.NewDriver(uixt.WithDriverPlugin(r.parser.plugin))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "init Android client failed")
|
return errors.Wrap(err, "init Android client failed")
|
||||||
}
|
}
|
||||||
r.uiClients[device.SerialNumber] = client
|
r.uiClients[device.SerialNumber] = client
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -525,11 +531,6 @@ func (r *SessionRunner) Start(givenVars map[string]interface{}) error {
|
|||||||
config := r.caseRunner.testCase.Config
|
config := r.caseRunner.testCase.Config
|
||||||
log.Info().Str("testcase", config.Name).Msg("run testcase start")
|
log.Info().Str("testcase", config.Name).Msg("run testcase start")
|
||||||
|
|
||||||
// 安卓系统删除打点日志文件
|
|
||||||
if r.caseRunner.testCase.Config.Android != nil {
|
|
||||||
myexec.RunCommand("adb", "-s", r.caseRunner.testCase.Config.Android[0].SerialNumber, "shell", "rm", "-r", env.DeviceActionLogFilePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
// update config variables with given variables
|
// update config variables with given variables
|
||||||
r.InitWithParameters(givenVars)
|
r.InitWithParameters(givenVars)
|
||||||
|
|
||||||
@@ -711,6 +712,16 @@ func (r *SessionRunner) GetSummary() (*TestCaseSummary, error) {
|
|||||||
return caseSummary, nil
|
return caseSummary, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *SessionRunner) IgnorePopup() bool {
|
||||||
|
if r.caseRunner.testCase.Config.Android != nil {
|
||||||
|
return r.caseRunner.testCase.Config.Android[0].IgnorePopup
|
||||||
|
}
|
||||||
|
if r.caseRunner.testCase.Config.IOS != nil {
|
||||||
|
return r.caseRunner.testCase.Config.IOS[0].IgnorePopup
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// updateSummary updates summary of StepResult.
|
// updateSummary updates summary of StepResult.
|
||||||
func (r *SessionRunner) updateSummary(stepResult *StepResult) {
|
func (r *SessionRunner) updateSummary(stepResult *StepResult) {
|
||||||
switch stepResult.StepType {
|
switch stepResult.StepType {
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ type TStep struct {
|
|||||||
Validators []interface{} `json:"validate,omitempty" yaml:"validate,omitempty"`
|
Validators []interface{} `json:"validate,omitempty" yaml:"validate,omitempty"`
|
||||||
Export []string `json:"export,omitempty" yaml:"export,omitempty"`
|
Export []string `json:"export,omitempty" yaml:"export,omitempty"`
|
||||||
Loops int `json:"loops,omitempty" yaml:"loops,omitempty"`
|
Loops int `json:"loops,omitempty" yaml:"loops,omitempty"`
|
||||||
|
IgnorePopup bool `json:"ignore_popup,omitempty" yaml:"ignore_popup,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// IStep represents interface for all types for teststeps, includes:
|
// IStep represents interface for all types for teststeps, includes:
|
||||||
|
|||||||
@@ -647,8 +647,10 @@ func runStepMobileUI(s *SessionRunner, step *TStep) (stepResult *StepResult, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
// automatic handling of pop-up windows on each step finished
|
// automatic handling of pop-up windows on each step finished
|
||||||
if err2 := uiDriver.ClosePopups(); err2 != nil {
|
if !step.IgnorePopup && !s.IgnorePopup() {
|
||||||
log.Error().Err(err2).Str("step", step.Name).Msg("auto handle popup failed")
|
if err2 := uiDriver.ClosePopups(); err2 != nil {
|
||||||
|
log.Error().Err(err2).Str("step", step.Name).Msg("auto handle popup failed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// save attachments
|
// save attachments
|
||||||
|
|||||||
Reference in New Issue
Block a user