꾸준한 기록

UITest 사용 메서드 본문

iOS

UITest 사용 메서드

Doo혀니 2025. 10. 23. 19:31

1️⃣ app.coordinate(withNormalizedOffset:) 의 역할

XCUIApplication 혹은 XCUIElement 객체에서 이 메서드는 해당 요소의 상대적 좌표계를 기준으로 한 터치 지점(XCUICoordinate)을 반환합니다.

즉, 화면에서 특정 위치를 정확히 지정해 터치나 드래그를 수행할 때 사용합니다.

let element = app.otherElements["canvas"]
let start = element.coordinate(withNormalizedOffset: CGVector(dx: 0.1, dy: 0.5))
let end = element.coordinate(withNormalizedOffset: CGVector(dx: 0.9, dy: 0.5))
start.press(forDuration: 0.1, thenDragTo: end)

위 코드는 element 내부의 왼쪽 10% 지점에서 오른쪽 90% 지점까지 드래그하는 동작을 수행합니다.
즉, normalized offset (정규화된 오프셋) 을 이용해 위치를 비율로 지정합니다.

 

2️⃣ CGVector(dx:, dy:) 의 의미

CGVector는 2D 벡터로, dx, dy는 각각 x축과 y축의 이동량(또는 비율) 을 나타냅니다.

UITest의 withNormalizedOffset:에서는 이 값이 비율로 해석됩니다.

  • dx = 0 → 왼쪽 끝
  • dx = 1 → 오른쪽 끝
  • dy = 0 → 위쪽 끝
  • dy = 1 → 아래쪽 끝

예를 들어:

 
CGVector(dx: 0.5, dy: 0.5)

➡️ 요소의 정중앙

 
CGVector(dx: 0, dy: 0)

➡️ 요소의 왼쪽 상단

 

 
CGVector(dx: 1, dy: 1)

➡️ 요소의 오른쪽 하단

 

3️⃣ 실제 좌표(XCUICoordinate)의 변환 원리

withNormalizedOffset:은 내부적으로 다음 과정을 거칩니다.

  1. 해당 요소의 프레임(rect) 을 가져옵니다.
  2. dx, dy를 곱해 해당 프레임 내부의 절대 위치(x, y) 를 계산합니다.
  3. 이 좌표를 XCUICoordinate 객체로 반환합니다.
  4. 반환된 객체로 tap(), press(forDuration:), drag(to:) 등 액션을 수행합니다.

즉, UITest에서 tap() 이 인식되지 않거나 위치가 어긋날 때, 이 방식으로 정밀 제어가 가능합니다.

 

🔍 요약

항목설명
app.coordinate(withNormalizedOffset:) 앱 또는 요소의 상대 좌표(비율)로 좌표 객체 생성
CGVector(dx:, dy:) x, y 방향의 비율 (0.0~1.0)
반환값 XCUICoordinate (터치/드래그 등 수행 가능)
사용 목적 정밀한 터치, 스와이프, 드래그 동작 구현