• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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