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 · 6655 次点击
    这是一个创建于 1660 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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
       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 应该填啥
    troyl
        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   ·   实用小工具   ·   6024 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.