XCTest问题:录制WKWebView内元素时Xcode崩溃
解决Xcode UI测试录制WKWebView时崩溃的问题
我之前在做WKWebView的UI测试时也碰到过一模一样的Xcode崩溃问题,完全卡死测试流水线,给你几个亲测有效的解决方案:
1. 优先升级到最新稳定版Xcode
旧版本的Xcode(尤其是Xcode 13.x早期版本、Xcode 14.0)对WKWebView的UI测试录制支持有已知bug,苹果后续在更新中修复了这类兼容性问题。直接升级到当前最新的稳定版Xcode,大概率能解决这个崩溃问题。
2. 放弃录制,手动编写UI测试代码
Xcode的UI测试录制功能对WebView这类嵌套复杂的控件支持一直不太稳定,手动编写测试代码反而更可靠、更灵活。针对你的场景,示例代码如下:
import XCTest class WebViewUITests: XCTestCase { func testWebViewTapInteraction() { let app = XCUIApplication() app.launch() // 等待WebView加载完成,超时时间可根据实际调整 let webView = app.webViews.firstMatch XCTAssertTrue(webView.waitForExistence(timeout: 10), "WebView未在规定时间内加载完成") // 定位WebView内的可点击元素(以Google首页的搜索框为例) // 你可以根据实际页面元素的accessibility属性、类型或占位符来定位 let searchField = webView.textFields["Search"].firstMatch XCTAssertTrue(searchField.waitForExistence(timeout: 5), "未找到搜索框元素") // 执行点击操作 searchField.tap() } }
如果页面元素没有设置accessibility标识,你可以通过Safari的Web Inspector查看WebView内元素的属性,再针对性地编写定位逻辑。
3. 临时禁用WebView的手势交互
你的代码里开启了allowsBackForwardNavigationGestures,这个手势可能会和Xcode的录制功能产生冲突,导致崩溃。可以在测试环境下临时关闭该功能:
修改ViewController.swift里的代码:
override func viewDidLoad() { super.viewDidLoad() let url = URL(string: "https://www.google.com")! _webView.load(URLRequest(url: url)) // 仅在非测试环境开启手势 #if !DEBUG _webView.allowsBackForwardNavigationGestures = true #endif }
4. 重置Xcode缓存文件
有时候Xcode的缓存损坏会引发各种奇怪的崩溃,尝试清理缓存:
- 完全关闭Xcode
- 删除
~/Library/Developer/Xcode/DerivedData目录下的所有内容 - 删除
~/Library/Caches/com.apple.dt.Xcode目录 - 重新打开Xcode,执行
Cmd+Shift+K清理项目,再重新构建运行测试
如果以上方法都无效,可以尝试创建一个全新的Xcode项目,逐步迁移你的代码和测试用例,排查是不是原有项目的配置文件损坏导致的问题。
内容的提问来源于stack exchange,提问作者BadmintonCat
相关产品推荐
相关产品推荐

