如何在iOS模拟器UI自动化测试中验证无网络场景?
iOS模拟器验证无网络错误界面的实用方案
1. 用Xcode自带的网络调节器(Xcode 15+)
Xcode 15之后直接集成了对模拟器的网络控制功能,不用单独装工具:
- 运行模拟器后,打开Xcode顶部的
Debug菜单,选择Network Link Conditioner - 在弹出的面板里选
Offline,模拟器立刻断网,就能测试你的错误界面了
2. 命令行直接操控模拟器网络
用xcrun simctl命令可以快速切换模拟器网络状态,适合写自动化脚本:
- 断网:
xcrun simctl status_bar <模拟器UDID> override --cellularMode disconnected - 恢复网络:
xcrun simctl status_bar <模拟器UDID> clear
不知道UDID的话,跑xcrun simctl list devices就能看到当前运行的模拟器ID
3. 在测试代码里Mock网络请求(推荐自动化测试用)
不用真断网,直接在XCTest代码里拦截API请求,模拟失败场景:
- 写一个
URLProtocol子类,拦截所有请求后返回网络错误 - 示例代码:
class MockOfflineProtocol: URLProtocol { override class func canInit(with request: URLRequest) -> Bool { true } override class func canonicalRequest(for request: URLRequest) -> URLRequest { request } override func startLoading() { client?.urlProtocol(self, didFailWithError: URLError(.notConnectedToInternet)) } override func stopLoading() {} } // 测试用例里注册/取消注册 override func setUp() { super.setUp() URLProtocol.registerClass(MockOfflineProtocol.self) } override func tearDown() { URLProtocol.unregisterClass(MockOfflineProtocol.self) super.tearDown() }
这种方法不受系统设置干扰,自动化测试跑起来更稳定。
4. 用Charles代理模拟断网
如果平时用Charles抓包,直接用它的限流功能就能模拟无网络:
- 打开Charles,点顶部
Proxy->Throttle Settings - 勾选
Enable Throttling,然后把Bandwidth设为No Bandwidth,模拟器的所有请求都会失败
内容的提问来源于stack exchange,提问作者Wasim Akram
相关产品推荐
相关产品推荐

