Xcode UI 테스트-UI 테스트 실패-검색 필드 "취소"버튼을 탭할 때 표시 (AX 작업에 의해)로 스크롤하지 못했습니다.


85

검색 창에서 '취소'버튼을 눌러 검색 창을 닫으려고합니다.

테스트 케이스가 취소 버튼을 찾지 못했습니다. Xcode 7.0.1에서 잘 작동했습니다.

버튼이 나타날 때까지 기다리는 술어를 추가했습니다. "취소"버튼을 누르면 테스트 케이스가 실패합니다.

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

로그 :

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type 'vinayak@xmd.net' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003

@ Joe Masilotti 어떤 아이디어?
Vinpai

온 전성 검사일뿐 화면에 취소 버튼이 있습니까 아니면 스크롤해야합니까? 요소 스크롤이 항상 작동하지 않는 문제가 여전히 있음을 알고 있습니다.
Joe Masilotti 2015 년

@JoeMasilotti 취소 버튼이 화면에 있습니다. 취소 버튼은 UISearchbar의 일부인 시스템 기본 버튼입니다. [self.buttons [@ "Cancel"] 탭]을했을 때 Xcode 7.0.1에서 잘 작동했습니다.
Vinpai

1
@Vinpai app.tables.cells.allElementsBoundByAccessibilityElement.count버튼을 탭하기 전에을 추가하면 어떻게 되나요? 궁금한 점이 있습니다. 이것은 때때로 화면을 '새로 고침'하는 데 도움이되었습니다.
cakes88

@Konnor, 제안한 API로 시도했지만 취소 버튼을 탭하면 실패합니다. 디버거에서 application.buttons를 쿼리하면 취소 버튼이 표시됩니다
Vinpai

답변:


140

나는 여기에 "취소"버튼 falsehittable속성에 대해 반환 되는 것 같아요 .

당신이 볼 경우 tap()설명서에 말한다

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

XCode 7.1로 인해 문제가 발생한 것 같습니다. 이러한 문제로부터 자신을 차단하지 않기 위해 (그리고 u도;)) 히트 XCUIElement가능하지 않더라도 요소를 탭할 수 있는 확장 프로그램을 작성했습니다 . 다음이 도움이 될 수 있습니다.

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

이제 다음과 같이 호출 할 수 있습니다.

button.forceTapElement()

업데이트 -신속한 3의 경우 다음을 사용하십시오.

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}

수정 해 주셔서 감사합니다. 비슷한 문제가 발생하여 해결되었습니다 cell.tap(). Xcode7.1에서 무언가가 변경되어 일부 요소가 더 이상
적중

Xcode7.1에서 '적중 가능'하지 않은 사용자 지정 navigationBar backButtonItem이 있으며이 솔루션은 저에게 효과적입니다self.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

감사합니다-같은 문제를 해결했습니다.
Taché에

7
제 경우에는 탭이 뷰의 중앙에있을 때 작동했습니다. 오프셋을 (0.5, 0.5)로 변경합니다. let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks 2016 년

1
훌륭한 일. 나는 이것을보기 전에 내 맥북을 거의 죽이기 시작했습니다.
ChaosSpeeder 2016

11

저에게 근본 원인은 제가 탭하고 싶은 오브젝트가

  • 숨김 (및 뒤로)으로 설정되었습니다.
  • 제거되었다가 다시 연결되었습니다

두 경우 모두 isAccessibilityElement재산은 false그 후 였습니다 . 다시 설정하여 true수정했습니다.


3
이것은 정확히 내 문제였습니다. 이상하게도 iOS 11에서 발생하기 시작했습니다 (iOS 10에서 잘 작동했습니다).
Ricardo Sanchez-Saez

4

이 질문은 "표시된 (AX 작업으로) 버튼으로 스크롤하지 못함" 이라는 용어에 대한 Google 검색어의 순위 가 높습니다 . 질문의 나이를 감안할 때 나는 이것이 더 이상 XCUITest 프레임 워크의 문제가 아니라고 생각했습니다.

이 문제는 XCElement기존에 있지만 소프트웨어 키보드 뒤에 숨겨져 있기 때문이라는 것을 알았습니다 . 탭할 수 있도록 뷰에 존재하는 뷰를 스크롤 할 수 없기 때문에 프레임 워크에서 오류가 발생합니다. 제 경우에는 문제의 버튼이 때때로 소프트웨어 키보드 뒤에있었습니다 .

iOS 시뮬레이터의 소프트웨어 키보드가 어떤 경우 (예 : 컴퓨터에서) 꺼지고 다른 경우 (예 : CI에서) 켜질 수 있음을 발견했습니다. 제 경우에는 한 컴퓨터에서 소프트웨어 키보드를 끄고 기본적으로 다른 컴퓨터에서는 켜졌습니다.

해결 방법 : 키보드 뒤에있을 수있는 버튼을 누르기 전에 키보드를 닫으십시오.

버튼을 누르기 전에 명시 적으로 키보드를 닫는 곳을 두드리면 모든 환경에서 내 문제가 해결되었습니다.

현재 응답자가 resignFirstResponder에 도달하도록 몇 가지 작업을 추가했습니다. 내 텍스트보기 뒤에있는보기로 인해 첫 번째 응답자가 사임해야하므로 마지막 텍스트 영역 바로 아래를 탭합니다.

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

2

요소의 특성을 확인하십시오. TableViewSectionHeader와 동일한 문제에 직면했습니다. 탭을 시도했지만 모든 지점에서 실패했습니다.

여기에 이미지 설명 입력


1

Sandy의 해결 방법은 잠시 동안 도움이 된 것처럼 보였지만 더 이상은 아닙니다. 그런 다음 다음과 같이 변경했습니다.

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

요점은 isHittable 검사가 예외를 throw한다는 것이므로이 검사를 전혀 수행하지 않고 요소가 발견 된 후 곧바로 좌표를 찾습니다.


0

제 경우에는 버튼을 덮는 프로그래밍 방식으로 추가 된 UI 요소가있었습니다.


0

AppCenter 시뮬레이터를 사용하여 테스트를 실행하는 경우 로컬 시뮬레이터와 동일한 디바이스 버전에서 테스트를 실행하고 있는지 확인해야합니다. 이 때문에 3 일의 일을 잃었습니다.


0

요소를 덮을 수있는 정신에 따라 RN 디버거를 아이콘 위에 부분적으로 오버레이했습니다.

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.