Xcode UI test - UI Testing Failure - Failed to scroll to visible (by AX action) when tap on Search field "Cancel' button

前端 未结 8 1431
时光取名叫无心
时光取名叫无心 2020-12-04 08:32

I am trying to dismiss the search field by tapping \'Cancel\' button in search bar.

The test case is failing to find the cancel button. It was working fine in Xcode

相关标签:
8条回答
  • 2020-12-04 08:50

    If you're using the AppCenter simulator to run the tests, you should make sure that you're running the tests on the same device version than your local simulator. I lost 3 days of work because of this.

    0 讨论(0)
  • 2020-12-04 08:54

    This question ranks well for Google queries around the term "Failed to scroll to visible (by AX action) Button". Given the age of the question I was inclined to think this was no longer an issue with the XCUITest framework as the accepted answer suggests.

    I found this issue was due to the XCElement existing, but being hidden behind the software keyboard. The error is emitted by the framework since it is unable to scroll a view that exists into view to be tappable. In my case the button in question was behind the software keyboard sometimes.

    I found the iOS Simulator's software keyboard may be toggled off in some cases (eg: on your machine) and toggled on in others (eg: on your CI). In my case I had toggled the software keyboard off on one machine, and by default it was toggled on on others.

    Solution: Dismiss the keyboard before attempting to tap buttons that may be behind it.

    I found tapping somewhere that explicitly dismissed the keyboard before tapping on the button solved my problem in all environments.

    I added add some actions to get the current responder to resignFirstResponder. The views behind my text views will force the first responder to resign, so I tap somewhere just underneath the last text area.

     /// 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)
    
    0 讨论(0)
  • 2020-12-04 08:56

    I guess here "Cancel" button returns false for hittable property, that is preventing it from tapping.

    If you see tap() in documentation it says

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

    It seems things are broken with XCode 7.1.To keep myself (and u too ;)) unblocked from these issues I wrote a extension on XCUIElement that allows tap on element even if it is not hittable. Following can help you.

    /*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()
            }
        }
    }
    

    Now you can call as

    button.forceTapElement()
    

    Update - For swift 3 use following:

    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()
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 08:56

    The workaround of Sandy seemed help for a while but then no more - I then changed it like this:

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

    Main point being that as the issue is that isHittable check throws an exception, I don't do this check at all and go straight for coordinates after the element is found.

    0 讨论(0)
  • 2020-12-04 08:59

    For me, the root cause was that the objects I wanted to tap

    • have been set to hidden (and back)
    • have been removed and re-attached

    In both cases the isAccessibilityElement property was false afterwards. Setting it back to true fixed it.

    0 讨论(0)
  • 2020-12-04 09:01

    In the spirit of things that can cover your element, I had the RN debugger partially overlayed on top of my icon:

    0 讨论(0)
提交回复
热议问题