close
The Wayback Machine - https://web.archive.org/web/20201214104023/https://github.com/google/EarlGrey/issues/1283
Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Custom matcher in Swift 5 / Xcode 11 / iOS 13 never sets element in GREYMatchesBlock to a UIView (EarlGrey 2.0) #1283

Open
whoyawn opened this issue Apr 23, 2020 · 5 comments

Comments

@whoyawn
Copy link

@whoyawn whoyawn commented Apr 23, 2020

Tested custom matcher in the example project, fails:

// EarlGreyExampleSwiftUITests.swift
    func testCustomMatcher() {
        let workaroundArray: NSArray = [grey_kindOfClass(UITableViewCell.self), grey_tableCell()]
        let matcher = grey_allOf(workaroundArray as! [GREYMatcher])
        EarlGrey.selectElement(with: matcher)
            .perform(grey_doubleTap())
    }
    
    func grey_tableCell() -> GREYMatcher {
        let matches: GREYMatchesBlock = { (element: Any?) -> Bool in
          if let cell = element as? UITableViewCell { // fails
            return true
          } else {
            print("goes here")
            return false
          }
        }

        // Create a description for the matcher.
        let describe: GREYDescribeToBlock = { (description: Any) -> Void in
          let greyDescription:GREYDescription = description as! GREYDescription
          greyDescription.appendText("Table Cell")
        }

        // Create an EarlGrey custom matcher.
        return GREYElementMatcherBlock.init(matchesBlock: matches, descriptionBlock: describe)
    }

Error message:

cannot proceed
    t =     3.54s Assertion Failure: EarlGreyExampleSwiftUITests.swift:78: Exception: com.google.earlgrey.ElementInteractionErrorDomain

Exception Name: com.google.earlgrey.ElementInteractionErrorDomain
Exception Reason: {
  "User Info" :   {
    "NSLocalizedDescription" : "Interaction cannot continue because the desired element was not found."
  },
  "Error Info" :   {
    "Search API Info" : "",
    "Action Name" : "Tap 2 times",
    "Recovery Suggestion" : "Check if the element exists in the UI hierarchy printed below. If it exists, adjust the matcher so that it accurately matches element.",
    "Element Matcher" : "(kindOfClass('UITableViewCell') && Table Cell)"
  },
  "Bundle ID" : "com.google.earlgrey.samples.EarlGrey",
  "File Name" : "GREYElementInteraction.m",
  "Stack Trace" :   [
    "0   AppFramework                        0x000000010047dbce -[GREYElementInteraction matchElementsWithTimeout:syncBeforeMatch:completionBlock:] + 3198",
    "1   AppFramework                        0x000000010047fed1 -[GREYElementInteraction performAction:error:] + 1617",
    "2   CoreFoundation                      0x00007fff23e44c4c __invoking___ + 140",
    "3   CoreFoundation                      0x00007fff23e41e31 -[NSInvocation invoke] + 321",
    "4   AppFramework                        0x00000001004b2401 __38+[EDOInvocationRequest requestHandler]_block_invoke + 4433",
    "5   AppFramework                        0x00000001004aed4b -[EDOExecutor edo_handleMessage:] + 331",
    "6   AppFramework                        0x00000001004aebeb __37-[EDOExecutor handleRequest:context:]_block_invoke_2 + 43",
    "7   libdispatch.dylib                   0x00007fff51978951 _dispatch_call_block_and_release + 12",
    "8   libdispatch.dylib                   0x00007fff519798cb _dispatch_client_callout + 8",
    "9   libdispatch.dylib                   0x00007fff5197f60c _dispatch_lane_serial_drain + 707",
    "10  libdispatch.dylib                   0x00007fff51980044 _dispatch_lane_invoke + 388",
    "11  libdispatch.dylib                   0x00007fff5198a0c4 _dispatch_workloop_worker_thread + 626",
    "12  libsystem_pthread.dylib             0x00007fff51b9ea3d _pthread_wqthread + 290",
    "13  libsystem_pthread.dylib             0x00007fff51b9db77 start_wqthread + 15"
  ],
  "Line" : "160",
  "Error Code" : "0",
  "App Screenshots" :   {
    "Screenshot At Failure" : <UIImage:0x600002cb5830 anonymous {414, 896}>
  },
  "Function Name" : "-[GREYElementInteraction matchElementsWithTimeout:syncBeforeMatch:completionBlock:]",
  "Description" : "Interaction cannot continue because the desired element was not found.",
  "Error Domain" : "com.google.earlgrey.ElementInteractionErrorDomain"
}
Exception Details: (kindOfClass('UITableViewCell') && Table Cell)

Bundle ID: com.google.EarlGreyExampleSwiftUITests.xctrunner

Stack Trace: (
	0   EarlGreyExampleSwiftUITests         0x000000010546e96e -[GREYDefaultFailureHandler handleException:details:] + 2078
	1   EarlGreyExampleSwiftUITests         0x000000010546eede +[GREYElementInteractionErrorHandler handleInteractionError:outError:] + 542
	2   EarlGreyExampleSwiftUITests         0x000000010546f372 -[GREYElementInteractionProxy performAction:error:] + 498
	3   EarlGreyExampleSwiftUITests         0x000000010546f14f -[GREYElementInteractionProxy performAction:] + 79
	4   EarlGreyExampleSwiftUITests         0x0000000105464d3b $sSo15GREYInteractionP15EarlGreyExampleE7performyxSo10GREYAction_pF + 59
	5   EarlGreyExampleSwiftUITests         0x0000000105466130 $s15EarlGreyExample0abC12SwiftUITestsC17testCustomMatcheryyF + 608
	6   EarlGreyExampleSwiftUITests         0x000000010546637b $s15EarlGreyExample0abC12SwiftUITestsC17testCustomMatcheryyFTo + 43
	7   CoreFoundation                      0x00007fff23e44c4c __invoking___ + 140
	8   CoreFoundation                      0x00007fff23e41e31 -[NSInvocation invoke] + 321
	9   EarlGreyExampleSwiftUITests         0x000000010547c168 -[GREYTestCaseInvocation invoke] + 104
	10  XCTest                              0x0000000103463037 __24-[XCTestCase invokeTest]_block_invoke_2 + 52
	11  XCTest                              0x0000000103462fe3 __24-[XCTestCase invokeTest]_block_invoke.206 + 320
	12  XCTest                              0x00000001034bddc2 +[XCTestCase(Failures) performFailableBlock:testCase:testCaseRun:shouldInterruptTest:] + 69
	13  XCTest                              0x00000001034bdcd4 -[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 115
	14  XCTest                              0x00000001034629f6 -[XCTestCase invokeTest] + 1183
	15  EarlGreyExampleSwiftUITests         0x00000001054844f0 -[XCTestCase(GREYTest) grey_invokeTest] + 992
	16  XCTest                              0x0000000103464329 __26-[XCTestCase performTest:]_block_invoke_2 + 43
	17  XCTest                              0x00000001034bddc2 +[XCTestCase(Failures) performFailableBlock:testCase:testCaseRun:shouldInterruptTest:] + 69
	18  XCTest                              0x00000001034bdcd4 -[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 115
	19  XCTest                              0x0000000103464260 __26-[XCTestCase performTest:]_block_invoke.359 + 86
	20  XCTest                              0x00000001034d0a0d +[XCTContext runInContextForTestCase:block:] + 211
	21  XCTest                              0x0000000103463b14 -[XCTestCase performTest:] + 566
	22  XCTest                              0x00000001034aa38e -[XCTest runTest] + 57
	23  XCTest                              0x000000010345dd50 __27-[XCTestSuite performTest:]_block_invoke + 354
	24  XCTest                              0x000000010345d4a2 __59-[XCTestSuite _performProtectedSectionForTest:testSection:]_block_invoke + 24
	25  XCTest                              0x00000001034d0a0d +[XCTContext runInContextForTestCase:block:] + 211
	26  XCTest                              0x000000010345d459 -[XCTestSuite _performProtectedSectionForTest:testSection:] + 148
	27  XCTest                              0x000000010345d7be -[XCTestSuite performTest:] + 348
	28  XCTest                              0x00000001034aa38e -[XCTest runTest] + 57
	29  XCTest                              0x000000010345dd50 __27-[XCTestSuite performTest:]_block_invoke + 354
	30  XCTest                              0x000000010345d4a2 __59-[XCTestSuite _performProtectedSectionForTest:testSection:]_block_invoke + 24
	31  XCTest                              0x00000001034d0a0d +[XCTContext runInContextForTestCase:block:] + 211
	32  XCTest                              0x000000010345d459 -[XCTestSuite _performProtectedSectionForTest:testSection:] + 148
	33  XCTest                              0x000000010345d7be -[XCTestSuite performTest:] + 348
	34  XCTest                              0x00000001034aa38e -[XCTest runTest] + 57
	35  XCTest                              0x000000010345dd50 __27-[XCTestSuite performTest:]_block_invoke + 354
	36  XCTest                              0x000000010345d4a2 __59-[XCTestSuite _performProtectedSectionForTest:testSection:]_block_invoke + 24
	37  XCTest                              0x00000001034d0a0d +[XCTContext runInContextForTestCase:block:] + 211
	38  XCTest                              0x000000010345d459 -[XCTestSuite _performProtectedSectionForTest:testSection:] + 148
	39  XCTest                              0x000000010345d7be -[XCTestSuite performTest:] + 348
	40  XCTest                              0x00000001034aa38e -[XCTest runTest] + 57
	41  XCTest                              0x00000001034dff14 __44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke + 171
	42  XCTest                              0x00000001034e0001 __44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke.100 + 96
	43  XCTest                              0x0000000103478746 -[XCTestObservationCenter _observeTestExecutionForBlock:] + 682
	44  XCTest                              0x00000001034dfc9f -[XCTTestRunSession runTestsAndReturnError:] + 615
	45  XCTest                              0x0000000103441744 -[XCTestDriver runTestsAndReturnError:] + 456
	46  XCTest                              0x00000001034cc64c _XCTestMain + 2496
	47  EarlGreyExampleSwiftUITests-Runner  0x000000010324ee1a -[_XCTRunnerAppDelegate applicationWillResignActive:] + 0
	48  EarlGreyExampleSwiftUITests-Runner  0x000000010324ed18 _XCTRunnerRunTests + 0
	49  CoreFoundation                      0x00007fff23da1a9c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
	50  CoreFoundation                      0x00007fff23da1193 __CFRunLoopDoBlocks + 195
	51  CoreFoundation                      0x00007fff23d9bf83 __CFRunLoopRun + 995
	52  CoreFoundation                      0x00007fff23d9b884 CFRunLoopRunSpecific + 404
	53  GraphicsServices                    0x00007fff38b5ac1a GSEventRunModal + 139
	54  UIKitCore                           0x00007fff48c19220 UIApplicationMain + 1605
	55  EarlGreyExampleSwiftUITests-Runner  0x000000010324efd5 main + 183
	56  libdyld.dylib                       0x00007fff519b910d start + 1
)

Screenshots: {
  "Screenshot At Failure" : <UIImage:0x6000003ccbd0 anonymous {414, 896}>
}

UI Hierarchy (ordered by window level, front to back):

Legend: {
  "[Window 1]" : "Frontmost Window",
  "[AX]" : "Accessibility",
  "[UIE]" : "User Interaction Enabled"
}

========== Window 1 ==========

<UITextEffectsWindow:0x7faa256250b0; isAccessible=N; AX.frame={{0, 0}, {414, 896}}; AX.activationPoint={207, 448}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {414, 896}}; alpha=1>
  |--<UIInputSetContainerView:0x7faa2780ea50; isAccessible=N; AX.frame={{0, 0}, {414, 896}}; AX.activationPoint={207, 448}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {414, 896}}; opaque; alpha=1>
  |  |--<UIEditingOverlayGestureView:0x7faa27c0cec0; isAccessible=N; AX.frame={{0, 0}, {414, 896}}; AX.activationPoint={207, 448}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {414, 896}}; opaque; alpha=1>
  |  |--<UIInputSetHostView:0x7faa27810db0; isAccessible=N; AX.frame={{0, 896}, {414, 0}}; AX.activationPoint={207, 896}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 896}, {414, 0}}; opaque; alpha=1>

**** No Animating Views Found. ****

========== Window 2 ==========

<UIWindow:0x7faa25408850; isAccessible=N; AX.frame={{0, 0}, {414, 896}}; AX.activationPoint={207, 448}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {414, 896}}; opaque; alpha=1>
  |--<UITransitionView:0x7faa2780fd70; isAccessible=N; AX.frame={{0, 0}, {414, 896}}; AX.activationPoint={207, 448}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {414, 896}}; opaque; alpha=1>
  |  |--<UIDropShadowView:0x7faa27813130; isAccessible=N; AX.frame={{0, 0}, {414, 896}}; AX.activationPoint={207, 448}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {414, 896}}; opaque; alpha=1>
  |  |  |--<UIView:0x7faa27809c40; isAccessible=N; AX.frame={{0, 0}, {414, 896}}; AX.activationPoint={207, 448}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {414, 896}}; opaque; alpha=1>
  |  |  |  |--<UITableView:0x7faa28029e00; isAccessible=N; AX.id='table'; AX.frame={{10, 180}, {320, 716}}; AX.activationPoint={170, 538}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{10, 180}, {320, 716}}; opaque; alpha=1>
  |  |  |  |  |--<_UIScrollViewScrollIndicator:0x7faa27b090c0; isAccessible=N; AX.label='Horizontal scroll bar, 1 page'; AX.value='0%'; AX.frame={{31.333333333333332, 863}, {288, 30}}; AX.activationPoint={175.33333333333334, 891.5}; AX.traits='UIAccessibilityTraitAdjustable'; AX.focused='N'; frame={{24.333333333333343, 710}, {282, 3}}; opaque; alpha=0>
  |  |  |  |  |  |--<UIView:0x7faa27b09460; isAccessible=N; AX.frame={{34.333333333333343, 890}, {282, 3}}; AX.activationPoint={175.33333333333334, 891.5}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {282, 3}}; opaque; alpha=1>
  |  |  |  |  |--<_UIScrollViewScrollIndicator:0x7faa2780a510; isAccessible=N; AX.label='Vertical scroll bar, 6 pages'; AX.value='0%'; AX.frame={{297, 180}, {30, 716}}; AX.activationPoint={325.5, 242.33333333333334}; AX.traits='UIAccessibilityTraitAdjustable'; AX.focused='N'; frame={{314, 3}, {3, 118.66666666666667}}; opaque; alpha=0>
  |  |  |  |  |  |--<UIView:0x7faa27813900; isAccessible=N; AX.frame={{324, 183}, {3, 118.66666666666669}}; AX.activationPoint={325.5, 242.33333333333334}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {3, 118.66666666666667}}; opaque; alpha=1>
  |  |  |  |  |--<UITableViewCell:0x7faa25616f30; isAccessible=N; AX.id='Cell1'; AX.frame={{10, 180}, {320, 44}}; AX.activationPoint={170, 202}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1; text='Cell1'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa2561e340; isAccessible=N; AX.frame={{26, 223.66666666666666}, {304, 0.33333333333334281}}; AX.activationPoint={178, 223.83333333333331}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa25615040; isAccessible=N; AX.frame={{10, 180}, {320, 44}}; AX.activationPoint={170, 202}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa256174d0; isAccessible=Y; AX.label='Cell1'; AX.frame={{26, 180}, {288, 44}}; AX.activationPoint={170, 202}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell1'>
  |  |  |  |  |--<UITableViewCell:0x7faa2561f6a0; isAccessible=N; AX.id='April 22, 2020'; AX.frame={{10, 224}, {320, 44}}; AX.activationPoint={170, 246}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 44}, {320, 44}}; opaque; alpha=1; text='April 22, 2020'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b2d650; isAccessible=N; AX.frame={{26, 267.66666666666663}, {304, 0.33333333333331439}}; AX.activationPoint={178, 267.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa2561fc40; isAccessible=N; AX.frame={{10, 224}, {320, 44}}; AX.activationPoint={170, 246}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b27a50; isAccessible=Y; AX.label='April 22, 2020'; AX.frame={{26, 224}, {288, 44}}; AX.activationPoint={170, 246}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='April 22, 2020'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b2d7f0; isAccessible=N; AX.id='April 23, 2020'; AX.frame={{10, 268}, {320, 44}}; AX.activationPoint={170, 290}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 88}, {320, 44}}; opaque; alpha=1; text='April 23, 2020'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b2e070; isAccessible=N; AX.frame={{26, 311.66666666666663}, {304, 0.33333333333331439}}; AX.activationPoint={178, 311.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b2db90; isAccessible=N; AX.frame={{10, 268}, {320, 44}}; AX.activationPoint={170, 290}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b296c0; isAccessible=Y; AX.label='April 23, 2020'; AX.frame={{26, 268}, {288, 44}}; AX.activationPoint={170, 290}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='April 23, 2020'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b2e210; isAccessible=N; AX.id='April 24, 2020'; AX.frame={{10, 312}, {320, 44}}; AX.activationPoint={170, 334}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 132}, {320, 44}}; opaque; alpha=1; text='April 24, 2020'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b2a210; isAccessible=N; AX.frame={{26, 355.66666666666663}, {304, 0.33333333333331439}}; AX.activationPoint={178, 355.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b2e5b0; isAccessible=N; AX.frame={{10, 312}, {320, 44}}; AX.activationPoint={170, 334}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b2e910; isAccessible=Y; AX.label='April 24, 2020'; AX.frame={{26, 312}, {288, 44}}; AX.activationPoint={170, 334}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='April 24, 2020'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b2a3b0; isAccessible=N; AX.id='April 25, 2020'; AX.frame={{10, 356}, {320, 44}}; AX.activationPoint={170, 378}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 176}, {320, 44}}; opaque; alpha=1; text='April 25, 2020'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b28620; isAccessible=N; AX.frame={{26, 399.66666666666663}, {304, 0.33333333333331439}}; AX.activationPoint={178, 399.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b2a750; isAccessible=N; AX.frame={{10, 356}, {320, 44}}; AX.activationPoint={170, 378}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b28200; isAccessible=Y; AX.label='April 25, 2020'; AX.frame={{26, 356}, {288, 44}}; AX.activationPoint={170, 378}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='April 25, 2020'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b287c0; isAccessible=N; AX.id='April 26, 2020'; AX.frame={{10, 400}, {320, 44}}; AX.activationPoint={170, 422}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 220}, {320, 44}}; opaque; alpha=1; text='April 26, 2020'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b2f8f0; isAccessible=N; AX.frame={{26, 443.66666666666669}, {304, 0.33333333333331439}}; AX.activationPoint={178, 443.83333333333337}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b29be0; isAccessible=N; AX.frame={{10, 400}, {320, 44}}; AX.activationPoint={170, 422}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b2f650; isAccessible=Y; AX.label='April 26, 2020'; AX.frame={{26, 400}, {288, 44}}; AX.activationPoint={170, 422}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='April 26, 2020'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b2fa90; isAccessible=N; AX.id='April 27, 2020'; AX.frame={{10, 444}, {320, 44}}; AX.activationPoint={170, 466}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 264}, {320, 44}}; opaque; alpha=1; text='April 27, 2020'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b305b0; isAccessible=N; AX.frame={{26, 487.66666666666669}, {304, 0.33333333333331439}}; AX.activationPoint={178, 487.83333333333337}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b2fe30; isAccessible=N; AX.frame={{10, 444}, {320, 44}}; AX.activationPoint={170, 466}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b30190; isAccessible=Y; AX.label='April 27, 2020'; AX.frame={{26, 444}, {288, 44}}; AX.activationPoint={170, 466}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='April 27, 2020'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b30750; isAccessible=N; AX.id='April 28, 2020'; AX.frame={{10, 488}, {320, 44}}; AX.activationPoint={170, 510}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 308}, {320, 44}}; opaque; alpha=1; text='April 28, 2020'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b31270; isAccessible=N; AX.frame={{26, 531.66666666666674}, {304, 0.33333333333337123}}; AX.activationPoint={178, 531.83333333333348}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b30af0; isAccessible=N; AX.frame={{10, 488}, {320, 44}}; AX.activationPoint={170, 510}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b30e50; isAccessible=Y; AX.label='April 28, 2020'; AX.frame={{26, 488}, {288, 44}}; AX.activationPoint={170, 510}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='April 28, 2020'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b31410; isAccessible=N; AX.id='Cell9'; AX.frame={{10, 532}, {320, 44}}; AX.activationPoint={170, 554}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 352}, {320, 44}}; opaque; alpha=1; text='Cell9'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b31f30; isAccessible=N; AX.frame={{26, 575.66666666666674}, {304, 0.33333333333337123}}; AX.activationPoint={178, 575.83333333333348}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b317b0; isAccessible=N; AX.frame={{10, 532}, {320, 44}}; AX.activationPoint={170, 554}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b31b10; isAccessible=Y; AX.label='Cell9'; AX.frame={{26, 532}, {288, 44}}; AX.activationPoint={170, 554}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell9'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b322d0; isAccessible=N; AX.id='Cell10'; AX.frame={{10, 576}, {320, 44}}; AX.activationPoint={170, 598}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 396}, {320, 44}}; opaque; alpha=1; text='Cell10'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b32df0; isAccessible=N; AX.frame={{26, 619.66666666666674}, {304, 0.33333333333337123}}; AX.activationPoint={178, 619.83333333333348}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b32670; isAccessible=N; AX.frame={{10, 576}, {320, 44}}; AX.activationPoint={170, 598}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b329d0; isAccessible=Y; AX.label='Cell10'; AX.frame={{26, 576}, {288, 44}}; AX.activationPoint={170, 598}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell10'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b32f90; isAccessible=N; AX.id='Cell11'; AX.frame={{10, 620}, {320, 44}}; AX.activationPoint={170, 642}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 440}, {320, 44}}; opaque; alpha=1; text='Cell11'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b33ab0; isAccessible=N; AX.frame={{26, 663.66666666666674}, {304, 0.33333333333337123}}; AX.activationPoint={178, 663.83333333333348}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b33330; isAccessible=N; AX.frame={{10, 620}, {320, 44}}; AX.activationPoint={170, 642}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b33690; isAccessible=Y; AX.label='Cell11'; AX.frame={{26, 620}, {288, 44}}; AX.activationPoint={170, 642}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell11'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b33c50; isAccessible=N; AX.id='Cell12'; AX.frame={{10, 664}, {320, 44}}; AX.activationPoint={170, 686}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 484}, {320, 44}}; opaque; alpha=1; text='Cell12'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b34770; isAccessible=N; AX.frame={{26, 707.66666666666663}, {304, 0.33333333333337123}}; AX.activationPoint={178, 707.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b33ff0; isAccessible=N; AX.frame={{10, 664}, {320, 44}}; AX.activationPoint={170, 686}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b34350; isAccessible=Y; AX.label='Cell12'; AX.frame={{26, 664}, {288, 44}}; AX.activationPoint={170, 686}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell12'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b34910; isAccessible=N; AX.id='Cell13'; AX.frame={{10, 708}, {320, 44}}; AX.activationPoint={170, 730}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 528}, {320, 44}}; opaque; alpha=1; text='Cell13'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b35430; isAccessible=N; AX.frame={{26, 751.66666666666663}, {304, 0.33333333333337123}}; AX.activationPoint={178, 751.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b34cb0; isAccessible=N; AX.frame={{10, 708}, {320, 44}}; AX.activationPoint={170, 730}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b35010; isAccessible=Y; AX.label='Cell13'; AX.frame={{26, 708}, {288, 44}}; AX.activationPoint={170, 730}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell13'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b355d0; isAccessible=N; AX.id='Cell14'; AX.frame={{10, 752}, {320, 44}}; AX.activationPoint={170, 774}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 572}, {320, 44}}; opaque; alpha=1; text='Cell14'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b36220; isAccessible=N; AX.frame={{26, 795.66666666666663}, {304, 0.33333333333337123}}; AX.activationPoint={178, 795.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b35970; isAccessible=N; AX.frame={{10, 752}, {320, 44}}; AX.activationPoint={170, 774}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b35cd0; isAccessible=Y; AX.label='Cell14'; AX.frame={{26, 752}, {288, 44}}; AX.activationPoint={170, 774}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell14'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b363c0; isAccessible=N; AX.id='Cell15'; AX.frame={{10, 796}, {320, 44}}; AX.activationPoint={170, 818}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 616}, {320, 44}}; opaque; alpha=1; text='Cell15'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b37120; isAccessible=N; AX.frame={{26, 839.66666666666663}, {304, 0.33333333333337123}}; AX.activationPoint={178, 839.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b36760; isAccessible=N; AX.frame={{10, 796}, {320, 44}}; AX.activationPoint={170, 818}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b36d00; isAccessible=Y; AX.label='Cell15'; AX.frame={{26, 796}, {288, 44}}; AX.activationPoint={170, 818}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell15'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b372c0; isAccessible=N; AX.id='Cell16'; AX.frame={{10, 840}, {320, 44}}; AX.activationPoint={170, 862}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 660}, {320, 44}}; opaque; alpha=1; text='Cell16'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b37de0; isAccessible=N; AX.frame={{26, 883.66666666666663}, {304, 0.33333333333337123}}; AX.activationPoint={178, 883.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b37660; isAccessible=N; AX.frame={{10, 840}, {320, 44}}; AX.activationPoint={170, 862}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b379c0; isAccessible=Y; AX.label='Cell16'; AX.frame={{26, 840}, {288, 44}}; AX.activationPoint={170, 862}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell16'>
  |  |  |  |  |--<UITableViewCell:0x7faa27b37f80; isAccessible=N; AX.id='Cell17'; AX.frame={{10, 884}, {320, 44}}; AX.activationPoint={170, 906}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 704}, {320, 44}}; opaque; alpha=1; text='Cell17'>
  |  |  |  |  |  |--<_UITableViewCellSeparatorView:0x7faa27b38aa0; isAccessible=N; AX.frame={{26, 927.66666666666663}, {304, 0.33333333333337123}}; AX.activationPoint={178, 927.83333333333326}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{16, 43.666666666666664}, {304, 0.33333333333333331}}; opaque; alpha=1>
  |  |  |  |  |  |--<UITableViewCellContentView:0x7faa27b38320; isAccessible=N; AX.frame={{10, 884}, {320, 44}}; AX.activationPoint={170, 906}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {320, 44}}; opaque; alpha=1>
  |  |  |  |  |  |  |--<UITableViewLabel:0x7faa27b38680; isAccessible=Y; AX.label='Cell17'; AX.frame={{26, 884}, {288, 44}}; AX.activationPoint={170, 906}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{16, 0}, {288, 44}}; opaque; alpha=1; UIE=N; text='Cell17'>
  |  |  |  |--<UIButton:0x7faa2780bb80; isAccessible=Y; AX.id='Send'; AX.label='SendForLayoutTest'; AX.frame={{130, 40}, {100, 30}}; AX.activationPoint={180, 55}; AX.traits='UIAccessibilityTraitButton'; AX.focused='N'; frame={{130, 40}, {100, 30}}; alpha=1>
  |  |  |  |  |--<UIButtonLabel:0x7faa2790a720; isAccessible=N; AX.label='Send'; AX.frame={{162, 46}, {36, 18}}; AX.activationPoint={180, 55}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{32, 6}, {36, 18}}; alpha=1; UIE=N; text='Send'>
  |  |  |  |--<UIButton:0x7faa2780acd0; isAccessible=Y; AX.id='ClickMe'; AX.label='ClickMe'; AX.frame={{10, 40}, {100, 30}}; AX.activationPoint={60, 55}; AX.traits='UIAccessibilityTraitButton'; AX.focused='N'; frame={{10, 40}, {100, 30}}; alpha=1>
  |  |  |  |  |--<UIButtonLabel:0x7faa25616c90; isAccessible=N; AX.label='ClickMe'; AX.frame={{32.666666666666671, 46}, {55, 18}}; AX.activationPoint={60.166666666666671, 55}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{22.666666666666671, 6}, {55, 18}}; alpha=1; UIE=N; text='ClickMe'>
  |  |  |  |--<EarlGreyExampleSwift.SendMessageView:0x7faa27809a40; isAccessible=N; AX.frame={{0, 0}, {0, 0}}; AX.activationPoint={0, 0}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {0, 0}}; opaque; alpha=1>
  |  |  |  |  |--<UIButton:0x7faa2780c450; isAccessible=Y; AX.id='Send'; AX.label='Send'; AX.frame={{10, 110}, {100, 30}}; AX.activationPoint={60, 125}; AX.traits='UIAccessibilityTraitButton'; AX.focused='N'; frame={{10, 110}, {100, 30}}; alpha=1>
  |  |  |  |  |  |--<UIButtonLabel:0x7faa27b397b0; isAccessible=N; AX.label='Send'; AX.frame={{42, 116}, {36, 18}}; AX.activationPoint={60, 125}; AX.traits='UIAccessibilityTraitStaticText'; AX.focused='N'; frame={{32, 6}, {36, 18}}; alpha=1; UIE=N; text='Send'>
  |  |  |  |--<_UILayoutGuide:0x7faa2780a140; isAccessible=N; AX.frame={{0, 862}, {0, 34}}; AX.activationPoint={0, 879}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 862}, {0, 34}}; opaque; hidden; alpha=1>
  |  |  |  |--<_UILayoutGuide:0x7faa27809db0; isAccessible=N; AX.frame={{0, 0}, {0, 44}}; AX.activationPoint={0, 22}; AX.traits='UIAccessibilityTraitNone'; AX.focused='N'; frame={{0, 0}, {0, 44}}; opaque; hidden; alpha=1>

Originally posted by @whoyawn in #1281 (comment)

@tirodkar
Copy link
Collaborator

@tirodkar tirodkar commented Apr 27, 2020

Since the matcher is on the test side, the element returned is an EDOObject - the UIView wrapped as an IPC object EarlGrey uses to communicate between the two XCUITest processes.

You could print the element's class to check. Use grey_kindOfClass() before the matcher you are using to get this to work. We use an internal implementation to get it to work.

@whoyawn
Copy link
Author

@whoyawn whoyawn commented May 14, 2020

Does that mean this example code won't work then?

@joolurik
Copy link

@joolurik joolurik commented May 17, 2020

Facing similar problem, i am trying to implement below custom matcher

public func grey_accessibilityLabelContains(text subString: String, _ ignoreCase: Bool = true) -> GREYMatcher {
    let matches: GREYMatchesBlock = { (element: Any) -> Bool in
        let viewElement = element as? UIView
        guard let label: String = viewElement?.accessibilityLabel else { return false }
        return ignoreCase ? label.localizedCaseInsensitiveContains(subString) : label.contains(subString)
        } 
    
    let description: GREYDescribeToBlock = { (description: GREYDescription!) -> Void in
        guard let description = description else {
            return
        }
        let descriptionText:String = "accessibility label contains text " + subString + " with case ignorance " + ignoreCase.description
        description.appendText(descriptionText)
    }
    
    return GREYElementMatcherBlock.init(matchesBlock: matches, descriptionBlock: description)
        }
@bksingapore90
Copy link

@bksingapore90 bksingapore90 commented Oct 16, 2020

is there any update for this ??

@tirodkar
Copy link
Collaborator

@tirodkar tirodkar commented Oct 16, 2020

In general, do not do class checks in custom matchers / assertions. You can do them on the preceding matcher. @joolurik what was the issue with your code? It should work fine, unless if it wasn't able to convert into a UIView.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
4 participants
You can’t perform that action at this time.