iOS零代码自动化教程(替你重复点点点 比如充值0.01一类的)
iOS自动化羊毛:利用XCUITest/Appium绕过Apple Pay生物验证刷Suica。
1. 关键信息
- iOS 17.5 / 18.0;设备:iPhone SE3 / iPhone 15 Pro;工具:XCUITest、Appium + WebDriverAgent、Mirror。
- 辅助功能设置:设置—辅助功能—语音控制,关闭“注视感知”;启用“通过辅助触控确认”。
- 快捷指令与语音控制:Text2Speech生成脚本;Voice Control录屏循环播放。
- 调试与签名:需开发者账号($99 ADP);真机调试必连mac;WebDriverAgent需重新签名。
- 兼容包:Apple Card、Bilt World Elite、Altitude Reserve Visa Infinite、FutureCard。
2. 羊毛/优惠信息
- Citi Rewards+:刷$0.01返10 TYP(10倍),争议期$2–$5;6w+点已蒸发。
- Suica:Apple Pay充值$2–¥2;每轮25笔,CD约1小时;7–10轮/天,48h内可能降0CL。
- Amex PLAT/CSP/CIP:TYP 10x;Amex FHR;Upgrade Debit Card 1%–2%。
- Apple Card:需改Passcode脚本;FaceID未通,TouchID可用。
- FutureCard:Apple Pay 6% CB。
- 其他:Fidelity Bloom Debit $0.10/笔。
3. 最新动态
- 转向Appium + WebDriverAgent脱离电脑控制;iOS 18 UI变更需重录。
- WDA稳定性:24–48h挂一次;真机ADP签名提升稳定性。
- 自动化闭环:Python监控+重启;0.2s轮询“Done/Payment Failed”。
- 远程方案:WebDriver Server独立运行,解放mac依赖。
4. 争议或不同意见
- 合规风险:多次触发风控/Fraud Loop;账户封禁案例(#92)。
- 技术分歧:XCUITest必须连mac;Appium在iOS 18读不到UI(#129)。
- 成功率:FaceID无TouchID方案未跑通(#35、#111)。
5. 行动建议
- 优先TouchID设备;改Passcode脚本+0.2s轮询。
- 混卡轮刷降风控;ADP正式环境。
- 监控内存与CD,崩溃后自动重启。
- 短期试Apple Watch钱包(按两下侧边键)。
就是类似python写 selenium、playwright那种, 不过这个不会写代码的人也完全可以无痛使用……毕竟只需要录音就好了……
如何开启?
设置——辅助功能—— 语音控制
关闭“注视感知” (不关的话你眼球盯着前置摄像头才会执行,不能无痛当点点点机器人)
三种确认屏幕组件/位置的模式
编号网格
我可以用“点击32” 向对应button 执行toggle
这里执行了toggle580×1238 132 KB
有些区域比如左上角的箭头太小的话, 最后会进入子九宫格, 直到对应的小格子可以无歧义对应一个可以点击的ui组件
项目编号
image872×980 71.3 KB
项目名称
IMG_76291170×2532 141 KB
示例
在项目名称模式下点点点刷论坛
image320×682 71.9 KB
image294×632 84.7 KB
大多数情况下都能完成简单的重复性自动化薅羊毛需求了…
文本输入
image674×1330 147 KB
密码输入
你的密码比较复杂的话打开可以放在剪贴板, 说“长按” 之后就可以粘贴
(小心别的程序读剪贴板偷密码)
image688×1372 126 KB
码农脚本使用密码跳过ApplePay TouchID确认支付
请自行认真爬楼(
FaceID的我这边还没测试成功
TouchID的飞机哥成功了
观此帖有感
【引用自 ze3kr】:
我是怎么用Apple Card撸到2万泥潭円的(附带Q&A)
image1208×984 54.5 KB
谭友众筹一下,做一个类似这样的机械手,24x7 自动挣钱,发财的机会来了,一年内上市
楼主手速好快。请问是单身么?
据说是,小 还不赶紧的
上大号说话
水老师,您。。。
我这是哀其不幸怒其不争啊
抓紧啊扭老师
谢谢楼主,正在冲suica
让我想起了国内的黑产
你这在陆老师楼下叫我怎么接话……
呜呜呜 为什么不是管此贴有感
【引用自 未知】:
我是怎么用Apple Card撸到2万泥潭円的(附带Q&A) 玩卡
你不如让轮老师教你自带自动化
陆老师要是可以直接分享一个自动化脚本就冲钛了,这个应该是可以输入密码的
【引用自 未知】:
忽然想分享一些之前abuse citi award+ 的小故事,也不一定会被干掉嘛 玩卡
shetao 老师狂刷 apple card 每次 2 刀不知道怎么回事
可以只通过密码的,拿直接设置一个自动化程序就能自动了
https://discussions.apple.com/thread/252463593?sortBy=best
https://www.reddit.com/r/ynab/comments/14zklkx/ios_17_has_apple_pay_shortc…
水老师名卡有主了吧
【引用自 忽然想分享一些之前abuse citi award+ 的小故事,也不一定会被干掉嘛】:
忽然想分享一些之前abuse citi award+ 的小故事,也不一定会被干掉嘛
shetao 老师狂刷 apple card 每次 2 刀不知道怎么回事
现在知道是怎么回事了吧,是不是根本想不到
【引用自 LeeKuanYew】:
为什么不是管此贴有感
因为你没有效艾特…
真是原始的自动化框架
有种用摄像头拍温度计检测温度的感觉
还是不一样
主要是ios也没给你什么直接写脚本的机会(快捷指令能实现一部分但是真的就是一部分), 我当时好像有搜到测试框架但没仔细查了
还有语音控制这个, 写成 文本 之后用text2speech的话跟写爬虫脚本一样灵活可修改
(如果自己录音的话确实比较麻烦)
【引用自 ze3kr】:
我是怎么用Apple Card撸到2万泥潭円的(附带Q&A)
做一个类似这样的机械手
已经有自动控制程序了,不需要物理外挂。
如果你要物理的,搜索一下八爪鱼。
【引用自 LeeKuanYew】:
为什么不是管此贴有感
因为我那张图有视觉冲击力哈哈
我记得 有 机械手 as a service
可以机械手shetao吗
还是国内会玩,4个月赚300万
国内是一点点羊毛大家往死里薅的
尝试了一下,XCUITest 居然是可以操纵系统应用的。随便创建一个新应用,UI test 里面加入:
func testSuica() throws {
let expectedCard = "Altitude Reserve Visa Infinite";
let wallet = XCUIApplication(bundleIdentifier: "com.apple.Passbook")
let applePayUI = XCUIApplication(bundleIdentifier: "com.apple.PassbookUIService")
wallet.launch()
// Add a breakpoint here and try:
// - po wallet.debugDescription
// - po wallet.otherElements
// - ... etc.
print(wallet.debugDescription)
if !wallet.buttons["Done"].exists {
wallet.otherElements["Suica"].tap()
}
wallet.buttons["Add Money"].tap()
wallet.keys["¥2"].tap()
wallet.buttons["Add"].tap()
let cardLabel = applePayUI.buttons["Wallet.BankConnectAccountCredentialsView.AccountNumber"].label
XCTAssert(cardLabel.starts(with: expectedCard))
if applePayUI.staticTexts["Confirm with Side Button"].exists {
print("Double tap pls")
}
// Try: po applePayUI.debugDescription
print("自由发挥")
}
可惜无法绕过最后确认的步骤,不过可以在设置里面从双击电源键变成 AssistiveTouch。其余各位研究去吧
【引用自 0.6cpp】:
Altitude Reserve Visa Infinite
醒目(
飞机哥yyds!
当然没有理由用 UAR 上量啦 你们有 Apple Card 的试试咯
话说有其它带最低返现的卡吗
t = 24.91s Tear Down
Test Case '-[testCardUITests.testCardUITests testLaunchPerformance]' failed (25.179 seconds).
Test Case '-[testCardUITests.testCardUITests testSuica]' started.
t = 0.00s Start Test at 2024-04-28
t = 0.05s Set Up
t = 0.06s Open com.apple.Passbook
t = 0.06s Launch com.apple.Passbook
t = 0.17s Setting up automation session
t = 0.37s Wait for com.apple.Passbook to idle
`
竟然真的行
不过写起来也挺烦的(
【引用自 Lunasol】:
不过写起来也挺烦的(
是烦,不过现在主要是没法自动绕过 Apple Pay 的确认,能做到的话就能睡衣了(
【引用自 0.6cpp】:
不过可以在设置里面从双击电源键变成 AssistiveTouch
我试了这个
具体步骤是 设置里搜索“侧边按钮” 或者在辅助功能里自己找——拉到底——“通过辅助触控确认”
但是我在支付界面手工点击两下 虚拟home键 也没用
(刚开始以为是跟之前的设置冲突, 但把点一下 点两下都设置成无也不行)
不过就算找到办法tap这个虚拟home键, 之后应该也还是要进入输入密码替代faceid的界面
这里的话用XCUITest也不好说能不能解决
【引用自 Lunasol】:
但是我在支付界面手工点击两下 虚拟home键 也没用
要点进虚拟 home 菜单里面,默认藏的很深,得自定义把它拉出来才勉强能用
【引用自 Shetao】:
我是怎么用Apple Card撸到2万泥潭円的(附带Q&A)
因为需要生物信息的验证,估计脚本不可行。
我也觉得最难的是这一步。换成输密码可行吗?多次输入密码会不会触发fraud?
IMG_281AEFC502E5-11170×1130 105 KB
IMG_AAD17E4A1ECD-11170×653 42.1 KB
就是这里点虚拟home点不动 点了没反应的
如果这里虚拟home可以点的话
那至少我语音操控的脚本 就能虚拟home 接 密码代替faceid了
【引用自 Shetao】:
换成输密码可行吗
这个问题 @LeeKuanYew 在两周前在我胡言乱语之后就开始质疑思考了
飞机哥这几条也都是针对这个问题
【引用自 忽然想分享一些之前abuse citi award+ 的小故事,也不一定会被干掉嘛】:
忽然想分享一些之前abuse citi award+ 的小故事,也不一定会被干掉嘛
shetao 老师狂刷 apple card 每次 2 刀不知道怎么回事 可以只通过密码的,拿直接设置一个自动化程序就能自动了 No Face ID, Can I still set up Apple Pay - Apple Community https://www.reddit.com/r/ynab/comments/14zklkx/ios_17_has_apple_pay_shortc…
是我不了解的技术!
泥潭越来越刑了
【引用自 Lunasol】:
就是这里点虚拟home点不动 点了没反应的
image1179×1111 35.8 KB
我这可以啊,默认在 Device → More → Apple Pay 底下
(XCTest 正在运行,截图截不出来 Automation Running 的水印)
【引用自 LeeKuanYew】:
忽然想分享一些之前abuse citi award+ 的小故事,也不一定会被干掉嘛
可以只通过密码的,拿直接设置一个自动化程序就能自动了
我想在 SE 上关掉 Apple Pay Touch ID,然而还得等半个小时(新的防盗功能)
Edit: 重启之后倒计时还重置了,麻了
【引用自 0.6cpp】:
Device → More → Apple Pay 底下
咦我这里真的没……你是ios几
IMG_76561170×2396 203 KB
IMG_76571170×2040 164 KB
17.5 beta, iPhone 15 Pro
【引用自 0.6cpp】:
Device → More → Apple Pay 底下
这个是在虚拟 home 键点进去的菜单里,你点一下完全没反应?
IMG_1BBDE2E47276-11170×2391 138 KB
你轻点一下/轻点两下这里有设置吗
是的完全没反应…………
啊,我这是 打开菜单
我刚才改成打开菜单之后…
IMG_499F6653C36C-11170×1324 52.7 KB
又可以开始喷苹果了
不懂为什么你的默认是空的,手动加一下吧
怎么这个信用卡论坛也变成马浓黑产了
Citi rewards+啊
Citi rewards+,刷$0.01, 返10 TYP ,10倍收益
艹,关掉 Apple Pay 生物验证之后实测可睡,用 Bilt 自动充了 ¥2
func testSuica() throws {
let expectedCard = "Bilt World Elite";
let passcode = "666666\r";
let wallet = XCUIApplication(bundleIdentifier: "com.apple.Passbook")
let applePayUI = XCUIApplication(bundleIdentifier: "com.apple.PassbookUIService")
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
wallet.launch()
// Add a breakpoint here and try:
// - po wallet.debugDescription
// - po wallet.otherElements
// - ... etc.
print(wallet.debugDescription)
if !wallet.buttons["Done"].exists {
wallet.otherElements["Suica"].tap()
}
wallet.buttons["Add Money"].tap()
wallet.keys["¥2"].tap()
wallet.buttons["Add"].tap()
let cardLabel = applePayUI.buttons["Wallet.BankConnectAccountCredentialsView.AccountNumber"].label
XCTAssert(cardLabel.starts(with: expectedCard))
let passcodeButton = applePayUI.buttons["Pay with Passcode"]
if !passcodeButton.exists {
print("Disable Touch ID or Face ID for Apple Pay")
return;
}
passcodeButton.tap()
let passcodeField = springboard.secureTextFields["Passcode field"]
XCTAssert(passcodeField.waitForExistence(timeout: 5))
passcodeField.tap()
passcodeField.typeText(passcode)
// Try: po applePayUI.debugDescription
print("自由发挥")
}
飞机哥真勤奋
感恩飞机哥
我也来试试
我在设置 faceID &passcode里关了 wallet&apple pay
还是assistivetouch那一块过不去= =
好像IOS端deploy XCUITest的app需要developer account?
门槛就是99刀/yr 哈哈哈
应该不至于 我记得现在只有testflight分发和正式上架需要付费
但是mac和一个iPhone是必须的
飞机哥我突发奇想
apple watch里的wallet不知道能不能成
hmm 好像是 如果build locally的话 可能就不需要
安卓好像直接下个app就行了
现在坐实了路老师确实是搞accessibility的。 我们都是accessibility苦逼人。
【引用自 ctzsm】:
我们都是accessibility苦逼人。
我还没有all in呢,你展开讲讲苦逼之处?
哦,我只是做不出来
HCI吗
【引用自 divinebaboon】:
大号说话
有人叫我嗎?我錯過了什麼?
你错过了楼主
【引用自 Lunasol】:
我在设置 faceID &passcode里关了 wallet&apple pay
还是assistivetouch那一块过不去= =
我 SE3 关掉 Touch ID 里 Apple Pay 的开关直接变成 Pay with Passcode,没 AssistiveTouch 这步了
image750×369 35.1 KB
AssistiveTouch 处于关闭状态
passcode可以自动输入? n部手机等于n线程,?
可以,我这成功了,楼上有代码。改改可以实现两张卡交替撸之类的操作
感觉得矜持一点,不然这车要翻了
【引用自 0.6cpp】:
XCUITest 居然是可以操纵系统应用的
【引用自 IrishCoffee】:
passcode可以自动输入
这两步实在是难以置信(
【引用自 0.6cpp】:
得矜持一点,不然这车要翻了
不过很多人应该懒得下载xcode懒得写UItest那一块(
passcode 可以输入我还是在哔哩哔哩看到的,就是有人尝试大叫一声口令来解锁屏幕,这些操作应该可以完全改成快捷指令
【引用自 LeeKuanYew】:
应该可以完全改成快捷指令
Voice Control 是另一码事,应该没有内置快捷指令可以直接操纵无关应用
XCUITest 其实是可以在非 test 目标里面用的,背后链接 XCTestCore 和 XCTAutomationSupport 两个私有框架。因为 XCTAutomationSupport 设置了白名单,直接构建会炸,但看了一下可以绕过(其他人也有这个需求,比如做 WebDriver)
所以理论上可以用私有框架自己做一个快捷指令,无法上架但是可以方便脱离 Xcode 自己玩
Edit: 艹,还是需要一台电脑通过 imobiledevice 来启动有特权的 testmanagerd,搞得有点像 tethered jailbreak 或许可以像 SideStore 那样通过 VPN 作为电脑端连接自己,但是就很脏了
【引用自 0.6cpp】:
Voice Control 是另一码事,应该没有内置快捷指令可以直接操纵无关应用
可不可以语音录屏,然后循环播放
我家就是用米家开关操控小爱同学指挥 Alexa 开灯关灯的。android 倒是有 autojs 挺方便的,不过应该绕不过 Google pay
【引用自 0.6cpp】:
XCUITest 其实是可以在非 test 目标里面用的
应该类似ui automator 一样可以开系统应用。 感觉挺合理,测试app在不同的外部设置的行为。 但是android可以直接跑ui automator
账号会被关,这是刷小聪明
你帮我问问 @wtfwtf 他刷了多少 million 被关的卡
感觉swift长得挺像JavaScript的
另外我记得每轮可以刷25次,之后CD一小时,而且刷多了之后每次也会有几秒CD,脚本和硬薅应该差不多,而且
【引用自 chy8803】:
IOS端deploy XCUITest的app需要developer account?
门槛就是99刀/yr
我的账号是有membership的我不确定跑这个要不要钱
但感觉是不需要付这99刀的
再不济也可以小号拼车小企业账号(不过被封的话设备也会被flag)
陆老师能不能教教我ios开发啊
【引用自 chy8803】:
门槛就是99刀/yr
然后vision pro买个开发dango,300美刀又没了
https://www.reddit.com/r/apple/comments/1akz14l/300_vision_pro_developer_strap_is_just_an/
那可以来 150 个 suica 账号,刷满了换一个
【引用自 Shetao】:
另外我记得每轮可以刷25次,之后CD一小时,而且刷多了之后每次也会有几秒CD
这个是 Suica 的 CD?是时候自动换卡了
可不可以用Suica买开发者账户(永动机并感
【引用自 YCShing】:
vision pro买个开发dango
可以自己造或者等华强北
【引用自 0.6cpp】:
Edit: 艹,还是需要一台电脑通过 imobiledevice 来启动有特权的 testmanagerd,搞得有点像 tethered jailbreak 或许可以像 SideStore 那样通过 VPN 作为电脑端连接自己,但是就很脏了
飞机哥悄悄更新了
【引用自 IrishCoffee】:
n部手机等于n线程,?
不可行
说起来才发现Irish coffee的头像是黑色背景的小b
完全没写过 XCTest
娱乐的目的的大过了羊毛
我在想过几天研究一下注册次抛apple id绑定有限额度apple gc或者其他临时虚拟卡
是很多订阅都有ios免费2周到两个月这种,web打开是不显示的
那用自动化测试可以做成个服务了,这样可以 scale 起来,不过真的就是体验内容,应该没什么物理的好处
厉害了。。。
Fidelity Bloom Debit 应该可以吧,每笔交易返 ¢10
image1332×96 10.7 KB
开始试apple watch了实在是太玄学/慢了(
应该是不太行 得按两下确认 而且没找到可以关闭设置的地方
不过发现apple watch支持了一些手势还不错
一个小时过去了反正我还没连接上
我以前倒是有成功过watch app不知道这回怎么了
没有apple watch,想问一下这个的生物认证是是什么?也是face ID吗?
Apple Watch 我最少要冲100元,能只充2元吗?顺便问下大佬 uitest 有没有在非测试目标里跑的办法吗 看了上面的post还是不知道怎么练XCTestCore
按两下侧边键 可能没有生物认证吧 (这也是我想试试apple watch的原因
我盲猜是戴在手腕上& 附近有iphone 等效了生物认证
试了 就是按两下侧边键就支付/充值成功
也不需要密码什么的
【引用自 anon57197955】:
顺便问下大佬 uitest 有没有在非测试目标里跑的办法吗 看了上面的post还是不知道怎么练XCTestCore
【引用自 0.6cpp】:
let wallet = XCUIApplication(bundleIdentifier: "com.apple.Passbook")
let applePayUI = XCUIApplication(bundleIdentifier: "com.apple.PassbookUIService")
apple是根据bundleid决定目标的
你把bundleid改了就能用XCTest打开别的了
image1084×494 35.6 KB
这是你自己的
【引用自 anon57197955】:
uitest能不能不连xcode跑
应该不能
原来如此 谢谢大佬。uitest能不能不连xcode跑,一直要连着电脑有点麻烦,而且电脑如果连了vpn好像uitest跑的automation就停了
恭喜lu妹妹发现了新的MS上量方法
没自动化啊不行啊 按两下麻烦死了
不过这里我发现assistive touch那里似乎能模拟侧边按键,应该也许有办法连起来
IMG_77971170×1971 247 KB
这说明之前真的有问题啊…
但是我的watchOS10.1 根本连不上xcode15.3和xcode里的watchos10.4 volumes
xcode里watchos 10.4肯定是能调整target的min到10.0然后给10.1build的
最后说是非法经营被判了一年多。难道薅羊毛也不行吗?
既然 5/24 了,我也上果卡的车了 然而只给了 3000 CL 好抠门啊
Edit: 锁 TU 大法居然还能用,interesting
我瞬间平衡了点,我是 0CL,凑上 P2 才是 2000CL
可以了可以了,一个月刷 30 万笔也差不多了,bill 能出书了
话说天天薅 Suica 然后 redeem statement credit,每个月 iCloud $1 会不会继续 adjust 成 0?
你这是走私军火连包装袋的钱都不愿意给啊
把 Apple Card 加到了 Copilot,有点后悔
image1179×2361 526 KB
我看截图就不太对,嘿,果然是那个屎黄色的论坛。。
而我现在才知道suica人人都可以办
本来以为得去日本办
【引用自 0.6cpp】:
这又是啥
stage1st
屎黄色论坛就是s1
【引用自 Lunasol】:
image320×682 71.9 KB
【引用自 paceggg】:
果然是那个屎黄色的论坛。。
这又是啥
一个我没有手机认证已经无法说话的地方。
刷多了好像apple card和wallet会爆炸 特别卡。我现在自己用的手机不删apple card连app里用apple pay都打不开
卧槽,这么猛的吗 我随便刷了四百次,目前没遇到卡顿
属实,刷到15000以上后特别明显,不过换其他卡可解决
依然可以
毕竟五月的账单401页
所以你们faceid无touchid的都跑通脚本了吗…
陆妹妹你记错了啊,我的手机是iPhone SE只有touch id而且早充满了
这不再整一张继续薅
翻出来个se2。 face id试了了两天还是不行放弃了
太神奇了
x.com
Kyle Ye (@KyleSwifter) on X
@KyleSwifter
The original author did not post the full tech detail. But following his tip, I successfully launched the Mirror app.
Will post the detail to GitHub Gist later.
Ref: https://t.co/FjFeKCCEhC
iPhone mirror,之后试试mirror之后可以怎么双击侧键验证…………
【引用自 Lunasol】:
不过写起来也挺烦的(
【引用自 0.6cpp】:
是烦
我看fastlane的时候才发现XCUITest是有record and playback功能的……
不过真机总是闪退,也没空间装模拟器了就没测…
在左下角的小红点处就可以record操作了
image414×162 4.68 KB
image1536×602 54.7 KB
https://youtu.be/FXbIwalwPxI?t=97
问下你的这个iOS和iPhone的的version都是啥?
当时是 iOS 17.5,SE3。iOS 18 改了 UI,加断点可以看到新的 UI 怎么操作
好,哈哈,目标只是不想要冒出来用assitivetouch。
???750×662 43 KB
完鸟,不会喜提杀全家吧 Watch 也加不上了
去超市主力机 Apple Pay 被 decline,但刷实体卡过了。有点害怕
泥潭第一个被apple card杀的dp吗
感觉是被某种算法盯上了,被人工 review 的话就有点凉 现在都不敢找客服
各位别强撸灰飞烟灭了
那apple card会拒绝你买apple device或者比如用apple id付chatgpt plus吗
【引用自 Lunasol】:
用apple id付chatgpt plus吗
我 Narwhal 2 里面内购了 $5 成功了,但 Wallet 里面还没显示出来。之前所有 App Store/iCloud 的钱都显示为 Card Number Used,可能和实体卡一样能过?
反正现在 Apple Pay 还是凉透的状态(加不了卡,已有设备 decline)
Edit: 卧槽居然又能加了,谢你果不杀之恩?我还是消停点吧
想被杀的自取(iOS 18.1)
func testSuica() throws {
let expectedCard = "Apple Card";
let passcode = "123456\r";
let screenSaver = XCUIApplication(bundleIdentifier: "com.satishmaha.flurry")
let wallet = XCUIApplication(bundleIdentifier: "com.apple.Passbook")
let applePayUI = XCUIApplication(bundleIdentifier: "com.apple.PassbookUIService")
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
wallet.launch()
// Add a breakpoint here and try:
// - po wallet.debugDescription
// - po wallet.otherElements
// - ... etc.
//print(wallet.debugDescription)
if wallet.buttons["Done"].exists && !wallet.buttons["Add Money"].exists {
print("In another card")
wallet.buttons["Done"].tap()
XCTAssert(wallet.otherElements["Suica"].waitForExistence(timeout: 10))
wallet.otherElements["Suica"].tap()
XCTAssert(wallet.buttons["Add Money"].waitForExistence(timeout: 10))
print("Navigated to Suica")
}
while true {
if !wallet.buttons["Done"].exists {
wallet.otherElements["Suica"].tap()
}
wallet.buttons["Add Money"].tap()
let amount = wallet.staticTexts["Amount"]
XCTAssert(amount.waitForExistence(timeout: 5))
XCTAssert(amount.value as! String == "¥0")
var amount_str = "¥0"
while amount_str == "¥0" {
XCTAssert(wallet.keys["2"].waitForExistence(timeout: 5))
wallet.keys["2"].tap()
amount_str = amount.value as! String
if amount_str == "¥0" {
continue
} else if amount_str == "¥2" {
break
} else {
XCTAssert(false)
}
}
wallet.buttons["Add"].tap()
if expectedCard == "Apple Card" {
// second is iOS 18
XCTAssert(applePayUI.buttons["Apple Card"].exists || applePayUI.otherElements["Apple Card"].exists)
} else {
let cardLabel = applePayUI.buttons["Wallet.BankConnectAccountCredentialsView.AccountNumber"].label
XCTAssert(cardLabel.starts(with: expectedCard))
}
let passcodeButton = applePayUI.buttons["Pay with Passcode"]
XCTAssert(passcodeButton.waitForExistence(timeout: 10))
passcodeButton.tap()
let passcodeField = springboard.secureTextFields["Passcode field"]
XCTAssert(passcodeField.waitForExistence(timeout: 5))
passcodeField.tap()
passcodeField.typeText(passcode)
let processingPayment = applePayUI.staticTexts["Processing Payment"]
XCTAssert(processingPayment.waitForExistence(timeout: 5))
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
expectation(for: doesNotExistPredicate, evaluatedWith: processingPayment)
waitForExpectations(timeout: 10, handler: nil)
print("Processing Payment has disappeared")
let doneText = applePayUI.staticTexts["Done"]
let notCompletedText = applePayUI.staticTexts["Payment Not Completed"]
if doneText.exists {
print("Payment successful")
} else if notCompletedText.exists {
print("Payment failed")
break
} else {
print("???")
XCTAssert(false)
}
XCTAssert(wallet.buttons["Add Money"].waitForExistence(timeout: 10))
sleep(5)
}
screenSaver.launch()
}
你现在apple card每天能load多少次suica呀
8-10 轮,有个脚本循环跑 xcodebuild,跑完之后睡一个半小时
我以为已经很保守了,但最大的问题是有时会触发大 CD(一直 payment not completed),需要删掉重新加 apple card 才能解。昨天碰上完全加不回去了就很慌
你这个代码部分做的不错。
let processingPayment = applePayUI.staticTexts["Processing Payment"]
XCTAssert(processingPayment.waitForExistence(timeout: 5))
let doesNotExistPredicate = NSPredicate(format: "exists == FALSE")
expectation(for: doesNotExistPredicate, evaluatedWith: processingPayment)
waitForExpectations(timeout: 10, handler: nil)
print("Processing Payment has disappeared")
let doneText = applePayUI.staticTexts["Done"]
let notCompletedText = applePayUI.staticTexts["Payment Not Completed"]
if doneText.exists {
print("Payment successful")
} else if notCompletedText.exists {
print("Payment failed")
break
} else {
print("???")
XCTAssert(false)
}
刚刚测试了一下,并不robust。原因是因为接近每秒测试一次,导致"Processing Payment"消失之后,测试done或者payment failed的时候,done和payment failed也消失了。这个似乎是xuitest本身的问题,暂时不知道怎么做。
所以一个较为robust的做法,应该是不断的0.2秒级别的测试payment failed或者done是否出来了。当然这个的缺点,也就是会有大量的输出。因为每次做这个动作系统都会截屏。会导致iphone的memory使用迅速上升。到达2GB的时候会挂掉。所以这个的一个解决方案,是可以跑了几百次之后,关掉test。重跑。
另一个是,如果payment not completed出现次数多了就会让apple pay一段时间限制那张卡。导致了你需要解绑卡。但是比如citi解绑卡再加进去,可能会触发fraud loop。也就是刷一次suica就给你fraud一次。所以要保证系统重跑的时候应该知道自己为什么重跑:payment not completed还是程序本身出现了exception而崩了。
话说我之前几个月刷了6w不到点,去了趟日本瞬间蒸发。但apple card已经卡的用不了了,感觉刷不动了… 别的有啥卡可以继续搞得 除了 citi reward +
跑xcode测试的时候跑release mode,就能解决这个2GB挂掉的问题。
可以用python写个监督程序,如果长时间卡住,就关了test重开。
但是每一天要跑test,iphone都会要求人手动unlock,这个至今无法解决。
自从有了这个python自监督程序之后:发现了很有意思的事情: 有的时候suica那边网络会慢导致出现一段时间payment error,这个等个5分钟就差不多了,然后suica上会冒出一条信息表明刚刚过慢花了很久才能通过。
那个unlock可能也有不错的解决方法,就是直接放弃纯粹的xcode上跑xcuitest. 而是应该在机器上跑个webdriver server,然后之后通过webdriver来长期控制。有很多好处:
解决了必须连着一台苹果电脑的问题。 还是需要一直连着一台苹果电脑。跑server本身需要连着个苹果。但是发号施令的电脑可以不是mac了。
不需要考虑唤醒问题,那个webdriver一直在跑,就不会有需要跑新的automation需要unlock的问题。
也能远程debug,做一些可能没有完全被自动化的活动。比ios 18的iPhone mirroring要求低不少,比如不需要host machine和iphone在用相同的apple id。
当然,我还没有开始做这方面的exploration。这几天试试。
【引用自 Chao】:
而是应该在机器上跑个webdriver server,然后之后通过webdriver来长期控制。
期待一个
【引用自 Chao】:
ios 18的iPhone mirroring
这个我试过,很不幸在 iphone mirroring 模式 UI test 读不到 UI(xcode 里开 accessibility inspector 可复现一样的问题),其他人也有这个问题
developer.apple.com
UI automation with iphone mirroring | Apple Developer Forums
我打入了一个成都的码农群,国内很多码农需要写程序测试游戏。
他们用这个:http://airtest.netease.com/
当然没必要真的用这个,只是看到他们有一系列工具可以用上。
花了点时间彻底改为Appium + WebDriverAgent.
首先技术上的小更新:
【引用自 Chao】:
一个较为robust的做法,应该是不断的0.2秒级别的测试payment failed或者done是否出来了。
没必要,直接等Add Money出来。出不来的话就说明payment failed。
速度稍微比直接用xcuitest慢一点点。不断优化现在也大概是平均15秒刷一次,而我的xcuitest版本可以做到12秒左右。
用appium就不用每天带着手机在身上。能每日开个cron job自己跑。
保证整个刷的setup都放在一个固定的地方。这是很好的,因为发现有的酒店的IP,刷容易被风控。
有时候可以用appium inspector远程操控一下。比如刷满之后的手动操作。完全可以卡刷爆了之后发个email给我。
真的从头到尾用python了,不需要和swift搏斗了。
需要用个mac机子专门用来操控,比较合理的就是弄个mac mini做服务器,专门搞这个。
不过,如果appium重启,就必须要手动操作一下了。这个解决不了。不知道appium能有多robust。如果能跑几个星期不重启就没啥问题。
问题:如果刷的时候秒payment not completed,是不是就说明是苹果那边rate limit了?
chao教授share一下code大家一起研究一下
请问一下各位IT,我不知道为什么我尝试用iPhone刷Citi需要输入手机验证码,但是不知道为什么那个验证码我按确认之后只会重复发验证码并不能进入验证,一开始我以为我按错重发验证码,但后来我发现貌似是苹果的问题?我换成安卓就没了这个问题
【引用自 anon57197955】:
去了趟日本瞬间蒸发。
用得这么快
大部分地方都能用啊,优衣库逛街吃饭
主要买了点衣服鞋子啥的马上就用完了
confirm了,WDA过一段时间会挂掉。导致要重启。那就没必要用appium了(除非是为了只用python)。
问了下专业搞测试的,都说没遇到过这个问题。
怀疑WebDriverAgent重启的原因似乎是我不是真developer。导致程序跑了足够久会挂,比如可能是因为certificate会过期。所以刚花了$99 enroll了ADP。
等待ADP拿到之后,重新sign以下app。然后看看稳定性如何。
自动换卡的操作也写出来了。
我可能成为了iOS自动化专家。
许老师有多少张充满的suica了?
不知道哈哈哈 七八张吧
【引用自 Chao】:
WDA过一段时间会挂掉
这一般是多少时间啊,我 6 个小时都没挂
24-48小时之间
现在迫切想找到其他的刷一分反一分的卡。
都用什么卡充的啊。。
请问 XCUITest 必须通过电脑执行吗? 有没有可以在手机自己执行的方案。不是给suica,只是简单的点击button,输入text 两三部的逻辑。
【引用自 IrishCoffee】:
只是简单的点击button,输入text 两三部的逻辑。
那你用shortcuts或者主楼的语音吧 虽然主楼语音看起来有点弱智
我看看shortcut行不行。我还要lookup一个数据表 或者发个http request 。 shortcut支持一些简单的script
今天弄了一天 终于
image1922×1828 329 KB
没做过ios 试了appium 有些东西还不懂 不过基本上比较robust了
回头找叫兽研究一下ui层的问题
【引用自 Chao】:
刷一分反一分
前两天发现upgrade debit card可以,似乎没有人提到过
image1311×164 12.8 KB
这个卡我加apple pay一直提示 联系发卡行
联系了说地址要符合
我琢磨半天加卡的时候也没填地址啊
我没遇到,还挺丝滑的
【引用自 未知】:
FutureCard充西瓜卡好像有6% cash back 购物折扣
[Screenshot_20250808-113703~2]
用的Apple Pay
又有新卡了
【引用自 eniqma3010】:
FutureCard充西瓜卡好像有6% cash back
刚试了下结果100x
IMG_05691179×2308 126 KB
桑太会玩了
我不玩 给你们玩的
桑有没有refer
今天跑了半天脚本,一看屏幕
Enjoying Wallet? Tap to rate on App Store.
哇, 你们至少跑了7个月了, 还在薅啊