How to check if widget is visible using FlutterDriver

Issue

I am not sure how I would check whether a widget is currently shown or not using FlutterDriver.

Using WidgetTester this is really easy to perform using e.g. findsOneWidget.
However, during integration tests using FlutterDriver, there is no access to a WidgetTester object.

The FlutterDriver.waitFor method does not indicate whether the widget was found in the given duration.

How do I check whether a widget is on screen using FlutterDriver?

Solution

Flutter Driver doesn’t have explicit method to check if a widget is present / exists, but we can create a custom method which will serve the purpose using waitFor method. For example, I have a simple text widget on screen and I will write a flutter driver test to check if that widget is present or not using a custom method isPresent.

Main code:

body: Center(
      child:
      Text('This is Test', key: Key('textKey'))

Flutter driver test to check if this widget is present or not is as below:

test('check if text widget is present', () async {
      final isExists = await isPresent(find.byValueKey('textKey'), driver);
      if (isExists) {
        print('widget is present');
      } else {
        print('widget is not present');
      }
    });

isPresent is custom method whose definition is as below:

isPresent(SerializableFinder byValueKey, FlutterDriver driver, {Duration timeout = const Duration(seconds: 1)}) async {
  try {
    await driver.waitFor(byValueKey,timeout: timeout);
    return true;
  } catch(exception) {
    return false;
  }
}

Running the test detects the widget is present:

enter image description here

If I comment out the text widget code and then run the test, it detects that widget is not present:

enter image description here

Answered By – Darshan

Answer Checked By – Timothy Miller (FlutterFixes Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *