XCUITest Bug Reproduction

press(forDuration:thenDragTo:withVelocity:thenHoldForDuration:)

Reproduction for long-press, drag & hold bug in XCUITest API.

Description

This API of XCUITest isn’t working as expected, and this repo (demo application and UI test) reproduces the bug. Apple Documentation: https://developer.apple.com/documentation/xctest/xcuicoordinate/3551692-press

func press(
  forDuration duration: TimeInterval, 
  thenDragTo otherCoordinate: XCUICoordinate, 
  withVelocity velocity: XCUIGestureVelocity, 
  thenHoldForDuration holdDuration: TimeInterval
)

The Bug

When using the above API with a non-zero holdDuration value, there is no effect, and no long press (A.K.A. “hold”) is made at the end of the dragging.

The Expected Behaviour

This is when I’m dragging my element manually (works as expected, the label changes its value to “Success!”):

Video.mp4

Download from here: Video.mp4

The Existing Behaviour

This test (here):

func testLongPressDragAndHold() throws {
  let app = XCUIApplication()
  app.launch()

  let button = app.buttons["button"]
  XCTAssert(button.waitForExistence(timeout: 5))

  let label = app.staticTexts["label"]
  XCTAssert(label.exists)

  button.press(forDuration: 1, thenDragTo: label, withVelocity: .default, thenHoldForDuration: 2)

  // The following assertion fails with the message:
  // XCTAssertEqual failed: ("Hold 1 second") is not equal to ("Success!")
  XCTAssertEqual(label.label, "Success!")
}

Results with an assertion error (XCTAssertEqual failed: ("Hold 1 second") is not equal to ("Success!")) when running on iPhone Simulator.

Visually, this happens:

UITests-Video.mp4

Download from here: UITests-Video.mp4

You may clone this repo, and execute the reproduction test from this file: XCUITestBugReproductionUITests/XCUITestBugReproductionUITests.swift

GitHub

View Github