fluttertestingwidget-test-flutter

How to check widget is visible when testing


In my case, when I using ExpansionPanelList, I need to check widget inside panel is visible.

If not visible, tester.tap(find.text('More Info')) will throw exception:

Warning: A call to tap() with finder "exactly one widget with text "More Info" (ignoring offstage widgets): Text("More Info", dependencies: [MediaQuery, DefaultTextStyle])" derived an Offset (Offset(400.0, 641.8)) that would not hit test on the specified widget. Maybe the widget is actually off-screen, or another widget is obscuring it, or the widget cannot receive pointer events. Indeed, Offset(400.0, 641.8) is outside the bounds of the root of the render tree, Size(800.0, 600.0). The finder corresponds to this RenderBox: RenderParagraph#1b6b1 relayoutBoundary=up27 The hit test result at that offset is: HitTestResult(HitTestEntry#b18dd(RenderView#408c3), HitTestEntry#a2393()) #0 WidgetController._getElementPoint (package:flutter_test/src/controller.dart:953:25) #1 WidgetController.getCenter (package:flutter_test/src/controller.dart:836:12) #2 WidgetController.tap (package:flutter_test/src/controller.dart:271:18) #3 main. (file:///Users/tommy/Repos/surveyapp/survey/test/widget_test.dart:99:18)

How do I check this widget is visible in testing?


Solution

  • Use hitTestable(), which produces a finder which only matches if the widget described by your finder is truly visible on the screen. For example:

      expect(find.text('More Info').hitTestable(), findsOneWidget);
    

    In your case, you may need to wait until the ExpansionPanelList expands or the list scrolls into view. You may need to use pumpSettle() or ensureVisible() first.