Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
db4dda20
Unverified
Commit
db4dda20
authored
Sep 04, 2020
by
Im-Kevin
Committed by
GitHub
Sep 04, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add finders for enableFlutterDriverExtension (#64308)
parent
02d01632
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
167 additions
and
86 deletions
+167
-86
diagnostics_tree.dart
packages/flutter_driver/lib/src/common/diagnostics_tree.dart
+2
-2
find.dart
packages/flutter_driver/lib/src/common/find.dart
+31
-28
geometry.dart
packages/flutter_driver/lib/src/common/geometry.dart
+2
-2
gesture.dart
packages/flutter_driver/lib/src/common/gesture.dart
+5
-5
text.dart
packages/flutter_driver/lib/src/common/text.dart
+1
-1
extension.dart
packages/flutter_driver/lib/src/extension/extension.dart
+107
-35
extension_test.dart
...es/flutter_driver/test/src/real_tests/extension_test.dart
+11
-11
find_test.dart
packages/flutter_driver/test/src/real_tests/find_test.dart
+8
-2
No files found.
packages/flutter_driver/lib/src/common/diagnostics_tree.dart
View file @
db4dda20
...
...
@@ -33,11 +33,11 @@ class GetDiagnosticsTree extends CommandWithTarget {
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
GetDiagnosticsTree
.
deserialize
(
Map
<
String
,
String
>
json
)
GetDiagnosticsTree
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
subtreeDepth
=
int
.
parse
(
json
[
'subtreeDepth'
]),
includeProperties
=
json
[
'includeProperties'
]
==
'true'
,
diagnosticsType
=
_diagnosticsTypeIndex
.
lookupBySimpleName
(
json
[
'diagnosticsType'
]),
super
.
deserialize
(
json
);
super
.
deserialize
(
json
,
finderFactory
);
/// How many levels of children to include in the JSON result.
///
...
...
packages/flutter_driver/lib/src/common/find.dart
View file @
db4dda20
...
...
@@ -9,6 +9,25 @@ import 'package:meta/meta.dart';
import
'error.dart'
;
import
'message.dart'
;
/// A factory for deserializing [Finder]s.
mixin
DeserializeFinderFactory
{
/// Deserializes the finder from JSON generated by [SerializableFinder.serialize].
SerializableFinder
deserializeFinder
(
Map
<
String
,
String
>
json
)
{
final
String
finderType
=
json
[
'finderType'
];
switch
(
finderType
)
{
case
'ByType'
:
return
ByType
.
deserialize
(
json
);
case
'ByValueKey'
:
return
ByValueKey
.
deserialize
(
json
);
case
'ByTooltipMessage'
:
return
ByTooltipMessage
.
deserialize
(
json
);
case
'BySemanticsLabel'
:
return
BySemanticsLabel
.
deserialize
(
json
);
case
'ByText'
:
return
ByText
.
deserialize
(
json
);
case
'PageBack'
:
return
const
PageBack
();
case
'Descendant'
:
return
Descendant
.
deserialize
(
json
,
this
);
case
'Ancestor'
:
return
Ancestor
.
deserialize
(
json
,
this
);
}
throw
DriverError
(
'Unsupported search specification type
$finderType
'
);
}
}
const
List
<
Type
>
_supportedKeyValueTypes
=
<
Type
>[
String
,
int
];
DriverError
_createInvalidKeyValueTypeError
(
String
invalidType
)
{
...
...
@@ -28,8 +47,8 @@ abstract class CommandWithTarget extends Command {
}
/// Deserializes this command from the value generated by [serialize].
CommandWithTarget
.
deserialize
(
Map
<
String
,
String
>
json
)
:
finder
=
SerializableFinder
.
deserialize
(
json
),
CommandWithTarget
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
finder
=
finderFactory
.
deserializeFinder
(
json
),
super
.
deserialize
(
json
);
/// Locates the object or objects targeted by this command.
...
...
@@ -58,7 +77,7 @@ class WaitFor extends CommandWithTarget {
:
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
WaitFor
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
WaitFor
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
super
.
deserialize
(
json
,
finderFactory
);
@override
String
get
kind
=>
'waitFor'
;
...
...
@@ -88,7 +107,7 @@ class WaitForAbsent extends CommandWithTarget {
:
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
WaitForAbsent
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
WaitForAbsent
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
super
.
deserialize
(
json
,
finderFactory
);
@override
String
get
kind
=>
'waitForAbsent'
;
...
...
@@ -126,22 +145,6 @@ abstract class SerializableFinder {
Map
<
String
,
String
>
serialize
()
=>
<
String
,
String
>{
'finderType'
:
finderType
,
};
/// Deserializes a finder from JSON generated by [serialize].
static
SerializableFinder
deserialize
(
Map
<
String
,
String
>
json
)
{
final
String
finderType
=
json
[
'finderType'
];
switch
(
finderType
)
{
case
'ByType'
:
return
ByType
.
deserialize
(
json
);
case
'ByValueKey'
:
return
ByValueKey
.
deserialize
(
json
);
case
'ByTooltipMessage'
:
return
ByTooltipMessage
.
deserialize
(
json
);
case
'BySemanticsLabel'
:
return
BySemanticsLabel
.
deserialize
(
json
);
case
'ByText'
:
return
ByText
.
deserialize
(
json
);
case
'PageBack'
:
return
const
PageBack
();
case
'Descendant'
:
return
Descendant
.
deserialize
(
json
);
case
'Ancestor'
:
return
Ancestor
.
deserialize
(
json
);
}
throw
DriverError
(
'Unsupported search specification type
$finderType
'
);
}
}
/// A Flutter Driver finder that finds widgets by tooltip text.
...
...
@@ -349,14 +352,14 @@ class Descendant extends SerializableFinder {
}
/// Deserializes the finder from JSON generated by [serialize].
static
Descendant
deserialize
(
Map
<
String
,
String
>
json
)
{
static
Descendant
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
{
final
Map
<
String
,
String
>
jsonOfMatcher
=
Map
<
String
,
String
>.
from
(
jsonDecode
(
json
[
'of'
])
as
Map
<
String
,
dynamic
>);
final
Map
<
String
,
String
>
jsonMatchingMatcher
=
Map
<
String
,
String
>.
from
(
jsonDecode
(
json
[
'matching'
])
as
Map
<
String
,
dynamic
>);
return
Descendant
(
of:
SerializableFinder
.
deserialize
(
jsonOfMatcher
),
matching:
SerializableFinder
.
deserialize
(
jsonMatchingMatcher
),
of:
finderFactory
.
deserializeFinder
(
jsonOfMatcher
),
matching:
finderFactory
.
deserializeFinder
(
jsonMatchingMatcher
),
matchRoot:
json
[
'matchRoot'
]
==
'true'
,
firstMatchOnly:
json
[
'firstMatchOnly'
]
==
'true'
,
);
...
...
@@ -404,14 +407,14 @@ class Ancestor extends SerializableFinder {
}
/// Deserializes the finder from JSON generated by [serialize].
static
Ancestor
deserialize
(
Map
<
String
,
String
>
json
)
{
static
Ancestor
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
{
final
Map
<
String
,
String
>
jsonOfMatcher
=
Map
<
String
,
String
>.
from
(
jsonDecode
(
json
[
'of'
])
as
Map
<
String
,
dynamic
>);
final
Map
<
String
,
String
>
jsonMatchingMatcher
=
Map
<
String
,
String
>.
from
(
jsonDecode
(
json
[
'matching'
])
as
Map
<
String
,
dynamic
>);
return
Ancestor
(
of:
SerializableFinder
.
deserialize
(
jsonOfMatcher
),
matching:
SerializableFinder
.
deserialize
(
jsonMatchingMatcher
),
of:
finderFactory
.
deserializeFinder
(
jsonOfMatcher
),
matching:
finderFactory
.
deserializeFinder
(
jsonMatchingMatcher
),
matchRoot:
json
[
'matchRoot'
]
==
'true'
,
firstMatchOnly:
json
[
'firstMatchOnly'
]
==
'true'
,
);
...
...
@@ -436,8 +439,8 @@ class GetSemanticsId extends CommandWithTarget {
GetSemanticsId
(
SerializableFinder
finder
,
{
Duration
timeout
})
:
super
(
finder
,
timeout:
timeout
);
/// Creates a command from a JSON map.
GetSemanticsId
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
GetSemanticsId
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
super
.
deserialize
(
json
,
finderFactory
);
@override
String
get
kind
=>
'get_semantics_id'
;
...
...
packages/flutter_driver/lib/src/common/geometry.dart
View file @
db4dda20
...
...
@@ -36,9 +36,9 @@ class GetOffset extends CommandWithTarget {
GetOffset
(
SerializableFinder
finder
,
this
.
offsetType
,
{
Duration
timeout
})
:
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
GetOffset
.
deserialize
(
Map
<
String
,
String
>
json
)
GetOffset
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
offsetType
=
_offsetTypeIndex
.
lookupBySimpleName
(
json
[
'offsetType'
]),
super
.
deserialize
(
json
);
super
.
deserialize
(
json
,
finderFactory
);
@override
Map
<
String
,
String
>
serialize
()
=>
super
.
serialize
()..
addAll
(<
String
,
String
>{
...
...
packages/flutter_driver/lib/src/common/gesture.dart
View file @
db4dda20
...
...
@@ -11,7 +11,7 @@ class Tap extends CommandWithTarget {
Tap
(
SerializableFinder
finder
,
{
Duration
timeout
})
:
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
Tap
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
Tap
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
super
.
deserialize
(
json
,
finderFactory
);
@override
String
get
kind
=>
'tap'
;
...
...
@@ -46,12 +46,12 @@ class Scroll extends CommandWithTarget {
})
:
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
Scroll
.
deserialize
(
Map
<
String
,
String
>
json
)
Scroll
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
dx
=
double
.
parse
(
json
[
'dx'
]),
dy
=
double
.
parse
(
json
[
'dy'
]),
duration
=
Duration
(
microseconds:
int
.
parse
(
json
[
'duration'
])),
frequency
=
int
.
parse
(
json
[
'frequency'
]),
super
.
deserialize
(
json
);
super
.
deserialize
(
json
,
finderFactory
);
/// Delta X offset per move event.
final
double
dx
;
...
...
@@ -99,9 +99,9 @@ class ScrollIntoView extends CommandWithTarget {
ScrollIntoView
(
SerializableFinder
finder
,
{
this
.
alignment
=
0.0
,
Duration
timeout
})
:
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
ScrollIntoView
.
deserialize
(
Map
<
String
,
String
>
json
)
ScrollIntoView
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
alignment
=
double
.
parse
(
json
[
'alignment'
]),
super
.
deserialize
(
json
);
super
.
deserialize
(
json
,
finderFactory
);
/// How the widget should be aligned.
///
...
...
packages/flutter_driver/lib/src/common/text.dart
View file @
db4dda20
...
...
@@ -11,7 +11,7 @@ class GetText extends CommandWithTarget {
GetText
(
SerializableFinder
finder
,
{
Duration
timeout
})
:
super
(
finder
,
timeout:
timeout
);
/// Deserializes this command from the value generated by [serialize].
GetText
.
deserialize
(
Map
<
String
,
String
>
json
)
:
super
.
deserialize
(
json
);
GetText
.
deserialize
(
Map
<
String
,
String
>
json
,
DeserializeFinderFactory
finderFactory
)
:
super
.
deserialize
(
json
,
finderFactory
);
@override
String
get
kind
=>
'get_text'
;
...
...
packages/flutter_driver/lib/src/extension/extension.dart
View file @
db4dda20
...
...
@@ -43,15 +43,16 @@ const String _extensionMethod = 'ext.flutter.$_extensionMethodName';
typedef
DataHandler
=
Future
<
String
>
Function
(
String
message
);
class
_DriverBinding
extends
BindingBase
with
SchedulerBinding
,
ServicesBinding
,
GestureBinding
,
PaintingBinding
,
SemanticsBinding
,
RendererBinding
,
WidgetsBinding
{
_DriverBinding
(
this
.
_handler
,
this
.
_silenceErrors
);
_DriverBinding
(
this
.
_handler
,
this
.
_silenceErrors
,
this
.
finders
);
final
DataHandler
_handler
;
final
bool
_silenceErrors
;
final
List
<
FinderExtension
>
finders
;
@override
void
initServiceExtensions
()
{
super
.
initServiceExtensions
();
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
(
_handler
,
_silenceErrors
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
(
_handler
,
_silenceErrors
,
finders
);
registerServiceExtension
(
name:
_extensionMethodName
,
callback:
extension
.
call
,
...
...
@@ -86,9 +87,59 @@ class _DriverBinding extends BindingBase with SchedulerBinding, ServicesBinding,
/// for tests where exceptions are expected. Defaults to false. Any errors
/// will still be returned in the `response` field of the result JSON along
/// with an `isError` boolean.
void
enableFlutterDriverExtension
(
{
DataHandler
handler
,
bool
silenceErrors
=
false
})
{
///
/// The `finders` parameter are used to add custom finders, as in the following example.
///
/// ```dart main
/// void main() {
/// enableFlutterDriverExtension(finders: <FinderExtension>[ SomeFinderExtension() ]);
///
/// app.main();
/// }
/// ```
///
/// ```dart
/// class Some extends SerializableFinder {
/// const Some(this.title);
///
/// final String title;
///
/// @override
/// String get finderType => 'Some';
///
/// @override
/// Map<String, String> serialize() => super.serialize()..addAll(<String, String>{
/// 'title': title,
/// });
/// }
/// ```
///
/// ```dart
/// class SomeFinderExtension extends FinderExtension {
///
/// String get finderType => 'Some';
///
/// SerializableFinder deserialize(Map<String, String> params, DeserializeFinderFactory finderFactory) {
/// return Some(json['title']);
/// }
///
/// Finder createFinder(SerializableFinder finder) {
/// Some someFinder = finder as Some;
///
/// return find.byElementPredicate((Element element) {
/// final Widget widget = element.widget;
/// if (element.widget is SomeWidget) {
/// return element.widget.title == someFinder.title;
/// }
/// return false;
/// });
/// }
/// }
/// ```
///
void
enableFlutterDriverExtension
(
{
DataHandler
handler
,
bool
silenceErrors
=
false
,
List
<
FinderExtension
>
finders
})
{
assert
(
WidgetsBinding
.
instance
==
null
);
_DriverBinding
(
handler
,
silenceErrors
);
_DriverBinding
(
handler
,
silenceErrors
,
finders
??
<
FinderExtension
>[]
);
assert
(
WidgetsBinding
.
instance
is
_DriverBinding
);
}
...
...
@@ -98,9 +149,19 @@ typedef CommandHandlerCallback = Future<Result> Function(Command c);
/// Signature for functions that deserialize a JSON map to a command object.
typedef
CommandDeserializerCallback
=
Command
Function
(
Map
<
String
,
String
>
params
);
/// Signature for functions that run the given finder and return the [Element]
/// found, if any, or null otherwise.
typedef
FinderConstructor
=
Finder
Function
(
SerializableFinder
finder
);
/// Used to expand the new Finder
abstract
class
FinderExtension
{
/// Identifies the type of finder to be used by the driver extension.
String
get
finderType
;
/// Deserializes the finder from JSON generated by [SerializableFinder.serialize].
SerializableFinder
deserialize
(
Map
<
String
,
String
>
params
,
DeserializeFinderFactory
finderFactory
);
/// Signature for functions that run the given finder and return the [Element]
/// found, if any, or null otherwise.
Finder
createFinder
(
SerializableFinder
finder
);
}
/// The class that manages communication between a Flutter Driver test and the
/// application being remote-controlled, on the application side.
...
...
@@ -108,9 +169,9 @@ typedef FinderConstructor = Finder Function(SerializableFinder finder);
/// This is not normally used directly. It is instantiated automatically when
/// calling [enableFlutterDriverExtension].
@visibleForTesting
class
FlutterDriverExtension
{
class
FlutterDriverExtension
with
DeserializeFinderFactory
{
/// Creates an object to manage a Flutter Driver connection.
FlutterDriverExtension
(
this
.
_requestDataHandler
,
this
.
_silenceErrors
)
{
FlutterDriverExtension
(
this
.
_requestDataHandler
,
this
.
_silenceErrors
,
List
<
FinderExtension
>
finders
)
{
_testTextInput
.
register
();
_commandHandlers
.
addAll
(<
String
,
CommandHandlerCallback
>{
...
...
@@ -142,35 +203,28 @@ class FlutterDriverExtension {
'get_layer_tree'
:
(
Map
<
String
,
String
>
params
)
=>
GetLayerTree
.
deserialize
(
params
),
'get_render_tree'
:
(
Map
<
String
,
String
>
params
)
=>
GetRenderTree
.
deserialize
(
params
),
'enter_text'
:
(
Map
<
String
,
String
>
params
)
=>
EnterText
.
deserialize
(
params
),
'get_text'
:
(
Map
<
String
,
String
>
params
)
=>
GetText
.
deserialize
(
params
),
'get_text'
:
(
Map
<
String
,
String
>
params
)
=>
GetText
.
deserialize
(
params
,
this
),
'request_data'
:
(
Map
<
String
,
String
>
params
)
=>
RequestData
.
deserialize
(
params
),
'scroll'
:
(
Map
<
String
,
String
>
params
)
=>
Scroll
.
deserialize
(
params
),
'scrollIntoView'
:
(
Map
<
String
,
String
>
params
)
=>
ScrollIntoView
.
deserialize
(
params
),
'scroll'
:
(
Map
<
String
,
String
>
params
)
=>
Scroll
.
deserialize
(
params
,
this
),
'scrollIntoView'
:
(
Map
<
String
,
String
>
params
)
=>
ScrollIntoView
.
deserialize
(
params
,
this
),
'set_frame_sync'
:
(
Map
<
String
,
String
>
params
)
=>
SetFrameSync
.
deserialize
(
params
),
'set_semantics'
:
(
Map
<
String
,
String
>
params
)
=>
SetSemantics
.
deserialize
(
params
),
'set_text_entry_emulation'
:
(
Map
<
String
,
String
>
params
)
=>
SetTextEntryEmulation
.
deserialize
(
params
),
'tap'
:
(
Map
<
String
,
String
>
params
)
=>
Tap
.
deserialize
(
params
),
'waitFor'
:
(
Map
<
String
,
String
>
params
)
=>
WaitFor
.
deserialize
(
params
),
'waitForAbsent'
:
(
Map
<
String
,
String
>
params
)
=>
WaitForAbsent
.
deserialize
(
params
),
'tap'
:
(
Map
<
String
,
String
>
params
)
=>
Tap
.
deserialize
(
params
,
this
),
'waitFor'
:
(
Map
<
String
,
String
>
params
)
=>
WaitFor
.
deserialize
(
params
,
this
),
'waitForAbsent'
:
(
Map
<
String
,
String
>
params
)
=>
WaitForAbsent
.
deserialize
(
params
,
this
),
'waitForCondition'
:
(
Map
<
String
,
String
>
params
)
=>
WaitForCondition
.
deserialize
(
params
),
'waitUntilNoTransientCallbacks'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilNoTransientCallbacks
.
deserialize
(
params
),
'waitUntilNoPendingFrame'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilNoPendingFrame
.
deserialize
(
params
),
'waitUntilFirstFrameRasterized'
:
(
Map
<
String
,
String
>
params
)
=>
WaitUntilFirstFrameRasterized
.
deserialize
(
params
),
'get_semantics_id'
:
(
Map
<
String
,
String
>
params
)
=>
GetSemanticsId
.
deserialize
(
params
),
'get_offset'
:
(
Map
<
String
,
String
>
params
)
=>
GetOffset
.
deserialize
(
params
),
'get_diagnostics_tree'
:
(
Map
<
String
,
String
>
params
)
=>
GetDiagnosticsTree
.
deserialize
(
params
),
'get_semantics_id'
:
(
Map
<
String
,
String
>
params
)
=>
GetSemanticsId
.
deserialize
(
params
,
this
),
'get_offset'
:
(
Map
<
String
,
String
>
params
)
=>
GetOffset
.
deserialize
(
params
,
this
),
'get_diagnostics_tree'
:
(
Map
<
String
,
String
>
params
)
=>
GetDiagnosticsTree
.
deserialize
(
params
,
this
),
});
_finders
.
addAll
(<
String
,
FinderConstructor
>{
'ByText'
:
(
SerializableFinder
finder
)
=>
_createByTextFinder
(
finder
as
ByText
),
'ByTooltipMessage'
:
(
SerializableFinder
finder
)
=>
_createByTooltipMessageFinder
(
finder
as
ByTooltipMessage
),
'BySemanticsLabel'
:
(
SerializableFinder
finder
)
=>
_createBySemanticsLabelFinder
(
finder
as
BySemanticsLabel
),
'ByValueKey'
:
(
SerializableFinder
finder
)
=>
_createByValueKeyFinder
(
finder
as
ByValueKey
),
'ByType'
:
(
SerializableFinder
finder
)
=>
_createByTypeFinder
(
finder
as
ByType
),
'PageBack'
:
(
SerializableFinder
finder
)
=>
_createPageBackFinder
(),
'Ancestor'
:
(
SerializableFinder
finder
)
=>
_createAncestorFinder
(
finder
as
Ancestor
),
'Descendant'
:
(
SerializableFinder
finder
)
=>
_createDescendantFinder
(
finder
as
Descendant
),
});
for
(
final
FinderExtension
finder
in
finders
)
{
_finderExtensions
[
finder
.
finderType
]
=
finder
;
}
}
final
TestTextInput
_testTextInput
=
TestTextInput
();
...
...
@@ -185,7 +239,7 @@ class FlutterDriverExtension {
final
WidgetController
_prober
=
LiveWidgetController
(
WidgetsBinding
.
instance
);
final
Map
<
String
,
CommandHandlerCallback
>
_commandHandlers
=
<
String
,
CommandHandlerCallback
>{};
final
Map
<
String
,
CommandDeserializerCallback
>
_commandDeserializers
=
<
String
,
CommandDeserializerCallback
>{};
final
Map
<
String
,
Finder
Constructor
>
_finders
=
<
String
,
FinderConstructor
>{};
final
Map
<
String
,
Finder
Extension
>
_finderExtensions
=
<
String
,
FinderExtension
>{};
/// With [_frameSync] enabled, Flutter Driver will wait to perform an action
/// until there are no pending frames in the app under test.
...
...
@@ -372,12 +426,30 @@ class FlutterDriverExtension {
}
Finder
_createFinder
(
SerializableFinder
finder
)
{
final
FinderConstructor
constructor
=
_finders
[
finder
.
finderType
];
if
(
constructor
==
null
)
throw
'Unsupported finder type:
${finder.finderType}
'
;
return
constructor
(
finder
);
switch
(
finder
.
finderType
)
{
case
'ByText'
:
return
_createByTextFinder
(
finder
as
ByText
);
case
'ByTooltipMessage'
:
return
_createByTooltipMessageFinder
(
finder
as
ByTooltipMessage
);
case
'BySemanticsLabel'
:
return
_createBySemanticsLabelFinder
(
finder
as
BySemanticsLabel
);
case
'ByValueKey'
:
return
_createByValueKeyFinder
(
finder
as
ByValueKey
);
case
'ByType'
:
return
_createByTypeFinder
(
finder
as
ByType
);
case
'PageBack'
:
return
_createPageBackFinder
();
case
'Ancestor'
:
return
_createAncestorFinder
(
finder
as
Ancestor
);
case
'Descendant'
:
return
_createDescendantFinder
(
finder
as
Descendant
);
default
:
if
(
_finderExtensions
.
containsKey
(
finder
.
finderType
))
{
return
_finderExtensions
[
finder
.
finderType
].
createFinder
(
finder
);
}
else
{
throw
'Unsupported finder type:
${finder.finderType}
'
;
}
}
}
Future
<
TapResult
>
_tap
(
Command
command
)
async
{
...
...
packages/flutter_driver/test/src/real_tests/extension_test.dart
View file @
db4dda20
...
...
@@ -37,7 +37,7 @@ void main() {
setUp
(()
{
result
=
null
;
extension
=
FlutterDriverExtension
((
String
message
)
async
{
log
.
add
(
message
);
return
(
messageId
+=
1
).
toString
();
},
false
);
extension
=
FlutterDriverExtension
((
String
message
)
async
{
log
.
add
(
message
);
return
(
messageId
+=
1
).
toString
();
},
false
,
<
FinderExtension
>[]
);
});
testWidgets
(
'returns immediately when transient callback queue is empty'
,
(
WidgetTester
tester
)
async
{
...
...
@@ -98,7 +98,7 @@ void main() {
setUp
(()
{
result
=
null
;
extension
=
FlutterDriverExtension
((
String
message
)
async
{
log
.
add
(
message
);
return
(
messageId
+=
1
).
toString
();
},
false
);
extension
=
FlutterDriverExtension
((
String
message
)
async
{
log
.
add
(
message
);
return
(
messageId
+=
1
).
toString
();
},
false
,
<
FinderExtension
>[]
);
});
testWidgets
(
'waiting for NoTransientCallbacks returns immediately when transient callback queue is empty'
,
(
WidgetTester
tester
)
async
{
...
...
@@ -464,7 +464,7 @@ void main() {
group
(
'getSemanticsId'
,
()
{
FlutterDriverExtension
extension
;
setUp
(()
{
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
});
testWidgets
(
'works when semantics are enabled'
,
(
WidgetTester
tester
)
async
{
...
...
@@ -513,7 +513,7 @@ void main() {
});
testWidgets
(
'getOffset'
,
(
WidgetTester
tester
)
async
{
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
Future
<
Offset
>
getOffset
(
OffsetType
offset
)
async
{
final
Map
<
String
,
String
>
arguments
=
GetOffset
(
ByValueKey
(
1
),
offset
).
serialize
();
...
...
@@ -545,7 +545,7 @@ void main() {
testWidgets
(
'getText'
,
(
WidgetTester
tester
)
async
{
await
silenceDriverLogger
(()
async
{
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
Future
<
String
>
getTextInternal
(
SerializableFinder
search
)
async
{
final
Map
<
String
,
String
>
arguments
=
GetText
(
search
,
timeout:
const
Duration
(
seconds:
1
)).
serialize
();
...
...
@@ -615,7 +615,7 @@ void main() {
testWidgets
(
'descendant finder'
,
(
WidgetTester
tester
)
async
{
await
silenceDriverLogger
(()
async
{
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
Future
<
String
>
getDescendantText
({
String
of
,
bool
matchRoot
=
false
})
async
{
final
Map
<
String
,
String
>
arguments
=
GetText
(
Descendant
(
...
...
@@ -660,7 +660,7 @@ void main() {
testWidgets
(
'descendant finder firstMatchOnly'
,
(
WidgetTester
tester
)
async
{
await
silenceDriverLogger
(()
async
{
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
Future
<
String
>
getDescendantText
()
async
{
final
Map
<
String
,
String
>
arguments
=
GetText
(
Descendant
(
...
...
@@ -694,7 +694,7 @@ void main() {
testWidgets
(
'ancestor finder'
,
(
WidgetTester
tester
)
async
{
await
silenceDriverLogger
(()
async
{
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
Future
<
Offset
>
getAncestorTopLeft
({
String
of
,
String
matching
,
bool
matchRoot
=
false
})
async
{
final
Map
<
String
,
String
>
arguments
=
GetOffset
(
Ancestor
(
...
...
@@ -764,7 +764,7 @@ void main() {
testWidgets
(
'ancestor finder firstMatchOnly'
,
(
WidgetTester
tester
)
async
{
await
silenceDriverLogger
(()
async
{
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
Future
<
Offset
>
getAncestorTopLeft
()
async
{
final
Map
<
String
,
String
>
arguments
=
GetOffset
(
Ancestor
(
...
...
@@ -812,7 +812,7 @@ void main() {
});
testWidgets
(
'GetDiagnosticsTree'
,
(
WidgetTester
tester
)
async
{
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
final
FlutterDriverExtension
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
Future
<
Map
<
String
,
Object
>>
getDiagnosticsTree
(
DiagnosticsType
type
,
SerializableFinder
finder
,
{
int
depth
=
0
,
bool
properties
=
true
})
async
{
final
Map
<
String
,
String
>
arguments
=
GetDiagnosticsTree
(
finder
,
type
,
subtreeDepth:
depth
,
includeProperties:
properties
).
serialize
();
...
...
@@ -882,7 +882,7 @@ void main() {
Map
<
String
,
dynamic
>
result
;
setUp
(()
{
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
);
extension
=
FlutterDriverExtension
((
String
arg
)
async
=>
''
,
true
,
<
FinderExtension
>[]
);
result
=
null
;
});
...
...
packages/flutter_driver/test/src/real_tests/find_test.dart
View file @
db4dda20
...
...
@@ -2,11 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'package:flutter_driver/flutter_driver.dart'
;
import
'package:flutter_driver/src/common/find.dart'
;
import
'package:mockito/mockito.dart'
;
import
'../../common.dart'
;
void
main
(
)
{
MockDeserialize
mockDeserialize
;
test
(
'Ancestor finder serialize'
,
()
{
const
SerializableFinder
of
=
ByType
(
'Text'
);
final
SerializableFinder
matching
=
ByValueKey
(
'hello'
);
...
...
@@ -35,7 +39,7 @@ void main() {
'firstMatchOnly'
:
'true'
,
};
final
Ancestor
a
=
Ancestor
.
deserialize
(
serialized
);
final
Ancestor
a
=
Ancestor
.
deserialize
(
serialized
,
mockDeserialize
);
expect
(
a
.
of
,
isA
<
ByType
>());
expect
(
a
.
matching
,
isA
<
ByValueKey
>());
expect
(
a
.
matchRoot
,
isTrue
);
...
...
@@ -70,10 +74,12 @@ void main() {
'firstMatchOnly'
:
'true'
,
};
final
Descendant
a
=
Descendant
.
deserialize
(
serialized
);
final
Descendant
a
=
Descendant
.
deserialize
(
serialized
,
mockDeserialize
);
expect
(
a
.
of
,
isA
<
ByType
>());
expect
(
a
.
matching
,
isA
<
ByValueKey
>());
expect
(
a
.
matchRoot
,
isTrue
);
expect
(
a
.
firstMatchOnly
,
isTrue
);
});
}
class
MockDeserialize
with
Mock
,
DeserializeFinderFactory
{
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment