You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:19:01