diff --git a/AUTHORS b/AUTHORS index bfc7c6f01f..235e3d61b3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -50,3 +50,4 @@ Jefferson Quesado Mark Diener Alek Åström Efthymios Sarpmpanis +Cédric Wyss diff --git a/packages/flutter_driver/lib/src/extension/extension.dart b/packages/flutter_driver/lib/src/extension/extension.dart index 66bb8983f8..e503697bdd 100644 --- a/packages/flutter_driver/lib/src/extension/extension.dart +++ b/packages/flutter_driver/lib/src/extension/extension.dart @@ -545,9 +545,30 @@ class FlutterDriverExtension { Future _getText(Command command) async { final GetText getTextCommand = command as GetText; final Finder target = await _waitForElement(_createFinder(getTextCommand.finder)); - // TODO(yjbanov): support more ways to read text - final Text text = target.evaluate().single.widget as Text; - return GetTextResult(text.data); + + final Widget widget = target.evaluate().single.widget; + String text; + + if (widget.runtimeType == Text) { + text = (widget as Text).data; + } else if (widget.runtimeType == RichText) { + final RichText richText = widget as RichText; + if (richText.text.runtimeType == TextSpan) { + text = (richText.text as TextSpan).text; + } + } else if (widget.runtimeType == TextField) { + text = (widget as TextField).controller.text; + } else if (widget.runtimeType == TextFormField) { + text = (widget as TextFormField).controller.text; + } else if (widget.runtimeType == EditableText) { + text = (widget as EditableText).controller.text; + } + + if (text == null) { + throw UnsupportedError('Type ${widget.runtimeType.toString()} is currently not supported by getText'); + } + + return GetTextResult(text); } Future _setTextEntryEmulation(Command command) async { diff --git a/packages/flutter_driver/test/src/real_tests/extension_test.dart b/packages/flutter_driver/test/src/real_tests/extension_test.dart index de66790231..e5b0c8c0ae 100644 --- a/packages/flutter_driver/test/src/real_tests/extension_test.dart +++ b/packages/flutter_driver/test/src/real_tests/extension_test.dart @@ -543,6 +543,75 @@ void main() { expect(await getOffset(OffsetType.center), const Offset(40 + (100 / 2), 30 + (120 / 2))); }); + testWidgets('getText', (WidgetTester tester) async { + await silenceDriverLogger(() async { + final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true); + + Future getTextInternal(SerializableFinder search) async { + final Map arguments = GetText(search, timeout: const Duration(seconds: 1)).serialize(); + final Map result = await extension.call(arguments); + if (result['isError'] as bool) { + return null; + } + return GetTextResult.fromJson(result['response'] as Map).text; + } + + await tester.pumpWidget( + MaterialApp( + home: Scaffold(body:Column( + key: const ValueKey('column'), + children: [ + const Text('Hello1', key: ValueKey('text1')), + Container( + height: 25.0, + child: RichText( + key: const ValueKey('text2'), + text: const TextSpan(text: 'Hello2') + ) + ), + Container( + height: 25.0, + child: EditableText( + key: const ValueKey('text3'), + controller: TextEditingController(text: 'Hello3'), + focusNode: FocusNode(), + style: const TextStyle(), + cursorColor: Colors.red, + backgroundCursorColor: Colors.black) + ), + Container( + height: 25.0, + child: TextField( + key: const ValueKey('text4'), + controller: TextEditingController(text: 'Hello4') + ) + ), + Container( + height: 25.0, + child: TextFormField( + key: const ValueKey('text5'), + controller: TextEditingController(text: 'Hello5') + ) + ), + ], + )) + ) + ); + + expect(await getTextInternal(ByValueKey('text1')), 'Hello1'); + expect(await getTextInternal(ByValueKey('text2')), 'Hello2'); + expect(await getTextInternal(ByValueKey('text3')), 'Hello3'); + expect(await getTextInternal(ByValueKey('text4')), 'Hello4'); + expect(await getTextInternal(ByValueKey('text5')), 'Hello5'); + + // Check if error thrown for other types + final Map arguments = GetText(ByValueKey('column'), timeout: const Duration(seconds: 1)).serialize(); + final Map response = await extension.call(arguments); + expect(response['isError'], true); + expect(response['response'], contains('is currently not supported by getText')); + }); + }); + testWidgets('descendant finder', (WidgetTester tester) async { await silenceDriverLogger(() async { final FlutterDriverExtension extension = FlutterDriverExtension((String arg) async => '', true);