1// Copyright 2017 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5import 'dart:async'; 6 7import 'package:flutter_driver/flutter_driver.dart'; 8 9import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; 10 11void main() { 12 group('FlutterDriver', () { 13 final SerializableFinder presentText = find.text('present'); 14 FlutterDriver driver; 15 16 setUpAll(() async { 17 driver = await FlutterDriver.connect(); 18 }); 19 20 tearDownAll(() async { 21 await driver.close(); 22 }); 23 24 test('waitFor should find text "present"', () async { 25 await driver.waitFor(presentText); 26 }); 27 28 test('waitForAbsent should time out waiting for text "present" to disappear', () async { 29 try { 30 await driver.waitForAbsent(presentText, timeout: const Duration(seconds: 1)); 31 fail('expected DriverError'); 32 } on DriverError catch (error) { 33 expect(error.message, contains('Timeout while executing waitForAbsent')); 34 } 35 }); 36 37 test('waitForAbsent should resolve when text "present" disappears', () async { 38 // Begin waiting for it to disappear 39 final Completer<void> whenWaitForAbsentResolves = Completer<void>(); 40 driver.waitForAbsent(presentText).then( 41 whenWaitForAbsentResolves.complete, 42 onError: whenWaitForAbsentResolves.completeError, 43 ); 44 45 // Wait 1 second then make it disappear 46 await Future<void>.delayed(const Duration(seconds: 1)); 47 await driver.tap(find.byValueKey('togglePresent')); 48 49 // Ensure waitForAbsent resolves 50 await whenWaitForAbsentResolves.future; 51 }); 52 53 test('waitFor times out waiting for "present" to reappear', () async { 54 try { 55 await driver.waitFor(presentText, timeout: const Duration(seconds: 1)); 56 fail('expected DriverError'); 57 } on DriverError catch (error) { 58 expect(error.message, contains('Timeout while executing waitFor')); 59 } 60 }); 61 62 test('waitFor should resolve when text "present" reappears', () async { 63 // Begin waiting for it to reappear 64 final Completer<void> whenWaitForResolves = Completer<void>(); 65 driver.waitFor(presentText).then( 66 whenWaitForResolves.complete, 67 onError: whenWaitForResolves.completeError, 68 ); 69 70 // Wait 1 second then make it appear 71 await Future<void>.delayed(const Duration(seconds: 1)); 72 await driver.tap(find.byValueKey('togglePresent')); 73 74 // Ensure waitFor resolves 75 await whenWaitForResolves.future; 76 }); 77 78 test('waitForAbsent resolves immediately when the element does not exist', () async { 79 await driver.waitForAbsent(find.text('that does not exist')); 80 }); 81 82 test('uses hit test to determine tappable elements', () async { 83 final SerializableFinder a = find.byValueKey('a'); 84 final SerializableFinder menu = find.byType('_DropdownMenu<Letter>'); 85 86 // Dropdown is closed 87 await driver.waitForAbsent(menu); 88 89 // Open dropdown 90 await driver.tap(a); 91 await driver.waitFor(menu); 92 93 // Close it again 94 await driver.tap(a); 95 await driver.waitForAbsent(menu); 96 }); 97 98 test('enters text in a text field', () async { 99 final SerializableFinder textField = find.byValueKey('enter-text-field'); 100 await driver.tap(textField); 101 await driver.enterText('Hello!'); 102 await driver.waitFor(find.text('Hello!')); 103 await driver.enterText('World!'); 104 await driver.waitFor(find.text('World!')); 105 }); 106 }); 107} 108