mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-10 17:43:00 +08:00
145 lines
3.3 KiB
Go
145 lines
3.3 KiB
Go
package uixt
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
|
|
"github.com/httprunner/httprunner/v5/internal/builtin"
|
|
"github.com/httprunner/httprunner/v5/pkg/uixt/options"
|
|
)
|
|
|
|
type InstallOptions struct {
|
|
Reinstall bool
|
|
GrantPermission bool
|
|
Downgrade bool
|
|
RetryTimes int
|
|
}
|
|
|
|
type InstallOption func(o *InstallOptions)
|
|
|
|
func NewInstallOptions(opts ...InstallOption) *InstallOptions {
|
|
installOptions := &InstallOptions{}
|
|
for _, option := range opts {
|
|
option(installOptions)
|
|
}
|
|
return installOptions
|
|
}
|
|
|
|
func WithReinstall(reinstall bool) InstallOption {
|
|
return func(o *InstallOptions) {
|
|
o.Reinstall = reinstall
|
|
}
|
|
}
|
|
|
|
func WithGrantPermission(grantPermission bool) InstallOption {
|
|
return func(o *InstallOptions) {
|
|
o.GrantPermission = grantPermission
|
|
}
|
|
}
|
|
|
|
func WithDowngrade(downgrade bool) InstallOption {
|
|
return func(o *InstallOptions) {
|
|
o.Downgrade = downgrade
|
|
}
|
|
}
|
|
|
|
func WithRetryTimes(retryTimes int) InstallOption {
|
|
return func(o *InstallOptions) {
|
|
o.RetryTimes = retryTimes
|
|
}
|
|
}
|
|
|
|
type InstallResult struct {
|
|
Result int `json:"result"`
|
|
ErrorCode int `json:"errorCode"`
|
|
ErrorMsg string `json:"errorMsg"`
|
|
}
|
|
|
|
func (dExt *DriverExt) InstallByUrl(url string, opts ...InstallOption) error {
|
|
// 获取当前目录
|
|
cwd, err := os.Getwd()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 将文件保存到当前目录
|
|
appPath := filepath.Join(cwd, fmt.Sprint(time.Now().UnixNano())) // 替换为你想保存的文件名
|
|
err = builtin.DownloadFile(appPath, url)
|
|
if err != nil {
|
|
log.Error().Err(err).Msg("download file failed")
|
|
return err
|
|
}
|
|
|
|
err = dExt.Install(appPath, opts...)
|
|
if err != nil {
|
|
log.Error().Err(err).Msg("install app failed")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (dExt *DriverExt) Install(filePath string, opts ...InstallOption) error {
|
|
if _, ok := dExt.Device.(*AndroidDevice); ok {
|
|
stopChan := make(chan struct{})
|
|
go func() {
|
|
ticker := time.NewTicker(5 * time.Second)
|
|
defer ticker.Stop()
|
|
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
actions := []TapTextAction{
|
|
{
|
|
Text: "^.*无视风险安装$",
|
|
Options: []options.ActionOption{
|
|
options.WithTapOffset(100, 0),
|
|
options.WithRegex(true),
|
|
options.WithIgnoreNotFoundError(true),
|
|
},
|
|
},
|
|
{
|
|
Text: "^已了解此应用未经检测.*",
|
|
Options: []options.ActionOption{
|
|
options.WithTapOffset(-450, 0),
|
|
options.WithRegex(true),
|
|
options.WithIgnoreNotFoundError(true),
|
|
},
|
|
},
|
|
}
|
|
_ = dExt.Driver.TapByTexts(actions...)
|
|
|
|
_ = dExt.TapByOCR(
|
|
"^(.*无视风险安装|确定|继续|完成|点击继续安装|继续安装旧版本|替换|授权本次安装|稍后提醒|继续安装|重新安装|安装)$",
|
|
options.WithRegex(true),
|
|
options.WithIgnoreNotFoundError(true),
|
|
)
|
|
case <-stopChan:
|
|
log.Info().Msg("Ticker stopped")
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
defer func() {
|
|
close(stopChan)
|
|
}()
|
|
}
|
|
|
|
return dExt.Device.Install(filePath, opts...)
|
|
}
|
|
|
|
func (dExt *DriverExt) Uninstall(packageName string, opts ...options.ActionOption) error {
|
|
actionOptions := options.NewActionOptions(opts...)
|
|
err := dExt.Device.Uninstall(packageName)
|
|
if err != nil {
|
|
log.Warn().Err(err).Msg("failed to uninstall")
|
|
}
|
|
if actionOptions.IgnoreNotFoundError {
|
|
return nil
|
|
}
|
|
return err
|
|
}
|