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

如何在XCUITest长按手势执行过程中截取屏幕?

手势执行过程中截图的实现方案

目前XCUI框架没有提供与按键修饰符同款的手势执行闭包API,可通过以下两种方案实现需求:

  • 官方公开API方案:分步构造XCUIGesture序列
    将连续手势拆分为「触发阶段-保持阶段-结束阶段」,在两个阶段中间插入截图逻辑,示例代码如下:
// 双指保持手势中途截图实现示例
// 构造第一阶段手势:双指按压+短等待确保手势触发
let pressGesture = XCUIGesture()
pressGesture.press(withNumberOfTouches: 2, location: element.center)
pressGesture.wait(forDuration: 0.2)
element.perform(pressGesture)

// 手势已处于持续触发状态,此时截图
let shot = element.screenshot()

// 构造第二阶段手势:释放按压
let releaseGesture = XCUIGesture()
releaseGesture.release()
element.perform(releaseGesture)

平移、缩放、旋转类手势也可按照相同逻辑拆分:先执行手势到需要截图的中间状态,完成截图后再执行剩余手势动作即可。

  • 私有API方案(仅测试环境可用)
    如果需要更灵活的手势控制,可以使用XCEventGenerator私有接口实现,示例代码如下:
// 注意:该接口为XCUI私有能力,仅可在测试包中使用,禁止接入生产代码
let eventGenerator = XCEventGenerator()
// 启动双指长按手势
eventGenerator.startPress(
    withNumberOfTouches: 2,
    location: element.center,
    in: element
)
// 等待App完成手势响应渲染
Thread.sleep(forTimeInterval: 0.15)
// 中途截图
let shot = element.screenshot()
// 结束手势
eventGenerator.stopPress()

注意事项:

  • 手势触发后建议添加100~300ms的等待时间再执行截图,避免捕获到应用未完成渲染的中间帧
  • 手势触发坐标需要落在目标元素的响应区域内,避免手势不生效
  • 私有API随Xcode版本更新可能发生变动,优先使用官方公开的XCUIGesture方案

内容的提问来源于stack exchange,提问作者Paulius Liekis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:57:00