V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hongxi2200

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

  •  2
     
  •   hongxi2200 ·
    electricbubble · May 11, 2020 · 7597 views
    This topic created in 2188 days ago, the information mentioned may be changed or developed.

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

    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
      }
    
    
    Supplement 1  ·  May 15, 2020

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

    Supplement 2  ·  May 22, 2020

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

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

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

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

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

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

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

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

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

    // 回到主页
    client.Homescreen()

    // 上滑
    session.SwipeUp()


    项目的示例代码基本上都用到了这些基本命令哈
    pmispig
        4
    pmispig  
       May 11, 2020
    请问能输入用户密码登陆吗,然后如果弹出警告点确认,这些都能做到不
    oubfgiar
        5
    oubfgiar  
       May 11, 2020 via iPhone
    iOS 非越狱群控指日可待?[狗头]
    yukiloh
        6
    yukiloh  
       May 11, 2020
    原理是啥?
    安卓的残疾人功能还真挺好,不过 autojs 最后转成收费,可惜
    hongxi2200
        7
    hongxi2200  
    OP
       May 11, 2020
    @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  
       May 11, 2020
    @hongxi2200 多谢~
    hongxi2200
        9
    hongxi2200  
    OP
       May 11, 2020   ❤️ 2
    @yukiloh

    简单粗暴的理解就是
    gwda 发 HTTP 请求给 appium/WebDriverAgent ( forked from facebookarchive/WebDriverAgent )
    WebDriverAgent 利用苹果提供的测试框架 XCTest.framework 进行设备的各种操作命令
    hongxi2200
        10
    hongxi2200  
    OP
       May 11, 2020
    @oubfgiar

    已经有好些个厂商做到了。。。
    oubfgiar
        11
    oubfgiar  
       May 11, 2020 via iPhone
    @hongxi2200 厉害厉害!因为不接触这个,还真是孤陋寡闻了,哈哈。
    hongxi2200
        12
    hongxi2200  
    OP
       May 11, 2020
    @oubfgiar

    其实厉害的还是 Facebook 那帮子人
    得亏他们写出来了 WDA ( WebDriverAgent )
    aydd2004
        13
    aydd2004  
       May 11, 2020 via iPhone
    不是吧 我找这个找了好久 但是不会 go 啊 我去
    hongxi2200
        14
    hongxi2200  
    OP
       May 11, 2020
    @aydd2004

    有 python 版本的话
    stevenkang
        15
    stevenkang  
       May 11, 2020
    感谢分享,先 star
    hongxi2200
        16
    hongxi2200  
    OP
       May 11, 2020
    @stevenkang

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

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

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

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

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

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

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

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

    可直接通过指定图片进行操作啦
    lekai63
        26
    lekai63  
       May 24, 2020
    666~
    话说为什么我看到这玩意儿的第一反映是 可以拿来在 iOS 上自动刷强国?
    hongxi2200
        27
    hongxi2200  
    OP
       May 24, 2020
    @lekai63
    哈哈哈哈,也是可以的哈
    配合上 gwda-ext-opencv 就可以在刷游戏了
    aukw
        28
    aukw  
       Jun 13, 2023
    很 cool !
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5619 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 82ms · UTC 08:22 · PVG 16:22 · LAX 01:22 · JFK 04:22
    ♥ Do have faith in what you're doing.