使用 Golang 来控制你的 iOS 设备~ - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hongxi2200
V2EX    Go 编程语言

使用 Golang 来控制你的 iOS 设备~

  •  2
     
  •   hongxi2200
    electricbubble 2020-05-11 11:06:12 +08:00 7226 次点击
    这是一个创建于 1983 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有兴趣的小伙伴可以玩一玩哈~

    https://github.com/ElectricBubble/gwda

    Golang 实现的 WebDriverAgent 客户端库,可以使用 Golang 控制 iOS 设备,实现 UI 自动化操作。(无需越狱)

    参考 facebook-wda (python): https://github.com/openatx/facebook-wda

    几乎完成了 appium/WebDriverAgent 的全部命令(部分 tvOS 的因为没环境测试。。就暂时放弃了)

    放一个示例代码的执行 GIF

    其实执行速度还可以,只是 GIF 压缩感觉卡顿

    下面是示例代码的执行输出:

    2020/05/10 00:02:00 Name: TEST’s iPhone 2020/05/10 00:02:00 IsSimulator: false 2020/05/10 00:02:00 UIKit Size (Points): 375 x 667 2020/05/10 00:02:01 UIKit Scale factor: 2 2020/05/10 00:02:01 Native Resolution (Pixels): 750 x 1334 2020/05/10 00:02:02 Status bar size: 375 x 20 2020/05/10 00:02:02 State: Plugged in, at 100% 2020/05/10 00:02:02 Level: 100% 2020/05/10 00:02:02 该 App 未运行, 开始打开 App: com.apple.Preferences 2020/05/10 00:02:04 使当前 App 退回 主屏幕, 并至少等待 3s 后(默认等待时间)再切换到前台 2020/05/10 00:02:09 当前 App 的 PID: 3616 2020/05/10 00:02:33 搜索输入框 的截图图片格式: png 2020/05/10 00:02:33 搜索输入框 的截图图片大小(像素): (594,72) 2020/05/10 00:02:37 共找到 3 个搜索结果 2020/05/10 00:02:48 当前屏幕第一个 App/文件夹 的文本内容: “自带”文件夹 2020/05/10 00:02:48 该 App/文件夹 的坐标和大小: { "y" : 26, "x" : 199, "width" : 64, "height" : 88 } 2020/05/10 00:02:57 Orientation: Device oriented vertically, home button on the bottom 2020/05/10 00:02:57 Rotation: { "x" : 0, "y" : 0, "z" : 0 } 
    第 1 条附言    2020-05-15 16:00:50 +08:00

    增加了一个 某东 的每日领取 J豆 的脚本,感兴趣的可以直接运行体验一下 gwda 的小魅力哈 daily-bean

    第 2 条附言    2020-05-22 11:15:48 +08:00

    更新了 gwda 的扩展库 gwda-ext-opencv

    可直接通过指定图片进行操作啦

    28 条回复    2023-06-13 10:02:06 +08:00
    Leigg
        1
    Leigg  
       2020-05-11 11:54:12 +08:00 via Android
    大部分的操作都能模拟?获取元素位置,点击指定 app,回到主页,下滑上推这些
    hongxi2200
        2
    hongxi2200  
    OP
       2020-05-11 12:53:23 +08:00
    @Leigg `WDA` 支持的命令全都可以的哟
    hongxi2200
        3
    hongxi2200  
    OP
       2020-05-11 13:12:49 +08:00
    @Leigg

    // 查找符合条件第一个元素
    session.FindElement()

    // 查找符合条件的全部元素
    session.FindElements()

    // 查找指定元素的子元素(符合条件的第一个)
    element.FindElement()

    // 查找指定元素的子元素(符合条件的全部元素)
    element.FindElements()

    // 获取元素的坐标和宽高
    elemIcon.Rect()

    // 启动指定 app
    session.AppLaunch()

    // 回到主页
    client.Homescreen()

    // 上滑
    session.SwipeUp()


    项目的示例代码基本上都用到了这些基本命令哈
    pmispig
        4
    pmispig  
       2020-05-11 13:25:11 +08:00
    请问能输入用户密码登陆吗,然后如果弹出警告点确认,这些都能做到不
    oubfgiar
        5
    oubfgiar  
       2020-05-11 13:29:01 +08:00 via iPhone
    iOS 非越狱群控指日可待?[狗头]
    yukiloh
        6
    yukiloh  
       2020-05-11 13:34:54 +08:00
    原理是啥?
    安卓的残疾人功能还真挺好,不过 autojs 最后转成收费,可惜
    hongxi2200
        7
    hongxi2200  
    OP
       2020-05-11 13:39:31 +08:00
    @pmispig

    弹窗也可以手动 /自动处理

    弹窗自动处理
    // 在连接设备的时候,追加一个 "true" 参数,用于在连接设备时,预设“允许 /拒绝”的选择器
    // 允许: **/XCUIElementTypeButton[`label IN {'允许','好','仅在使用应用期间','暂不'}`]
    // 拒绝: **/XCUIElementTypeButton[`label IN {'不允许','暂不'}`]
    gwda.NewClient("http://localhost:8100", true)
    // 也可以选择不再连接设备时去预设选择器
    // 通过下面两个函数也可以在创建 session 之前设置好想要设置的弹窗按钮选择器
    // client.SetAcceptAlertButtonSelector()
    // client.SetDismissAlertButtonSelector()

    // 创建 session 时,设置当 Alert 出现时的默认处理行为( Accept/Dismiss )
    // gwda.WDASessionAlertActionAccept
    client.NewSession(
    gwda.NewWDASessionCapability(bundleId).
    SetDefaultAlertAction(gwda.WDASessionAlertActionAccept))


    手动处理使用以下相关函数

    // 获取弹窗的内容
    session.AlertText()

    // 在弹窗里的输入框输入内容
    session.AlertSendKeys()

    // 获取弹窗的全部按钮
    session.AlertButtons()

    // 点击指定“名称”的“yes”按钮
    session.AlertAccept()

    // 点击指定“名称”的“no”按钮
    session.AlertDismiss()
    pmispig
        8
    pmispig  
       2020-05-11 13:42:01 +08:00
    @hongxi2200 多谢~
    hongxi2200
        9
    hongxi2200  
    OP
       2020-05-11 13:45:35 +08:00   2
    @yukiloh

    简单粗暴的理解就是
    gwda 发 HTTP 请求给 appium/WebDriverAgent ( forked from facebookarchive/WebDriverAgent )
    WebDriverAgent 利用苹果提供的测试框架 XCTest.framework 进行设备的各种操作命令
    hongxi2200
        10
    hongxi2200  
    OP
    &nbs;  2020-05-11 13:46:39 +08:00
    @oubfgiar

    已经有好些个厂商做到了。。。
    oubfgiar
        11
    oubfgiar  
       2020-05-11 14:02:00 +08:00 via iPhone
    @hongxi2200 厉害厉害!因为不接触这个,还真是孤陋寡闻了,哈哈。
    hongxi2200
        12
    hongxi2200  
    OP
       2020-05-11 14:05:26 +08:00
    @oubfgiar

    其实厉害的还是 Facebook 那帮子人
    得亏他们写出来了 WDA ( WebDriverAgent )
    aydd2004
        13
    aydd2004  
       2020-05-11 15:35:24 +08:00 via iPhone
    不是吧 我找这个找了好久 但是不会 go 啊 我去
    hongxi2200
        14
    hongxi2200  
    OP
       2020-05-11 15:40:02 +08:00
    @aydd2004

    有 python 版本的话
    stevenkang
        15
    stevenkang  
       2020-05-11 17:03:09 +08:00
    感谢分享,先 star
    hongxi2200
        16
    hongxi2200  
    OP
       2020-05-11 17:54:20 +08:00
    @stevenkang

    觉得好玩就行
    magicdawn
        17
    magicdawn  
       2020-05-11 23:56:57 +08:00
    请教下 appium 也是用 wda, macacajs 用他们自己写的 XCTestWD
    为啥他们都需要 app or bundleId 配置, 如果只是控制手机, 这里 app or bundleid 应该填啥
        18
    troyl  
       2020-05-12 01:35:10 +08:00 via iPhone
    这跟自带的 XCUITest 有啥区别吗?
    hongxi2200
        19
    hongxi2200  
    OP
       2020-05-12 08:57:01 +08:00   1
    @magicdawn
    可以简单的理解为 XCTestWD 就是 swift 版的 WDA ( WDA 使用的是 Objective-C )
    Product Bundle Identifier 的修改是因为需要给 WDA-Runner (会通过 Xcode 安装到设备上)一个唯一的
    修改的话,我是改成 com.个人域名.WebDriverAgentRunner (关于这个的修改,项目 README 里有安装的教程链接)

    除了这个,还有苹果的 个人 /团队开发者账号 需要设置,个人账号是可以免费的,但是必须要联网验证证书哈
    hongxi2200
        20
    hongxi2200  
    OP
       2020-05-12 09:01:00 +08:00
    @troyl
    appium/WebDriverAgent 和 前面同学提到的 macacajs/XCTestWD 本质上都是使用的苹果的测试框架哈

    这就好比是其实大家都可以通过浏览器的开发者模式的 控制台 输入对应的 js 实现页面元素的点击 /输入等操作
    但是却出现了 selenium,然后觉得真香
    JRay
        21
    JRay  
       2020-05-12 09:03:50 +08:00
    稳,空了来试试
    hongxi2200
        22
    hongxi2200  
    OP
       2020-05-12 09:11:01 +08:00
    @JRay
    再增加个搜图功能,那就可以更好玩了
    JRay
        23
    JRay  
       2020-05-12 09:16:39 +08:00
    @hongxi2200 搜图? 怎么玩儿?
    hongxi2200
        24
    hongxi2200  
    OP
       2020-05-12 09:31:01 +08:00
    @JRay

    // 这三个都拥有三种截图函数
    client.ScreenshotToImage()
    session.ScreenshotToDisk()
    element.Screenshot()

    client/session 都可以截图整个屏幕

    有了“大图”,然后拿出你想要点击位置的“小图”,
    就可以 “大图” 里 “小图”,并对应的找到 “小图” 所在的坐标
    然后就可以让 gwda 去点击啦

    不过这块儿我还在考虑该咋弄。。
    直接上 opencv 的话。。会不会有点大材小用?
    但的确后面可能需要 opencv 的 sift 算法,可以做到一张图在不同缩放的分辨率图片上找到“小图”
    hongxi2200
        25
    hongxi2200  
    OP
       2020-05-22 11:15:24 +08:00
    @JRay

    更新了 gwda 的扩展库 [gwda-ext-opencv]( https://github.com/electricbubble/gwda-ext-opencv)

    可直接通过指定图片进行操作啦
    lekai63
        26
    lekai63  
       2020-05-24 10:29:21 +08:00
    666~
    话说为什么我看到这玩意儿的第一反映是 可以拿来在 iOS 上自动刷强国?
    hongxi2200
        27
    hongxi2200  
    OP
       2020-05-24 16:25:50 +08:00
    @lekai63
    哈哈哈哈,也是可以的哈
    配合上 gwda-ext-opencv 就可以在刷游戏了
    aukw
        28
    aukw  
       2023-06-13 10:02:06 +08:00
    很 cool !
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3070 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:31 PVG 08:31 LAX 17:31 JFK 20:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86