mirror of
https://github.com/flutter/flutter
synced 2024-10-13 03:32:55 +00:00
Create helper functions to handle WebDriver actions. Some actions on base … (#48538)
This commit is contained in:
parent
6397c022bb
commit
1d08642a90
|
@ -157,10 +157,10 @@ abstract class FlutterDriver {
|
|||
}
|
||||
|
||||
/// Getter of appIsolate
|
||||
VMIsolate get appIsolate;
|
||||
VMIsolate get appIsolate => throw UnimplementedError();
|
||||
|
||||
/// Getter of serviceClient
|
||||
VMServiceClient get serviceClient;
|
||||
VMServiceClient get serviceClient => throw UnimplementedError();
|
||||
|
||||
/// Sends [command] to the Flutter Driver extensions.
|
||||
/// This must be implemented by subclass.
|
||||
|
@ -169,7 +169,7 @@ abstract class FlutterDriver {
|
|||
///
|
||||
/// * [VMServiceFlutterDriver], which uses vmservice to implement.
|
||||
/// * [WebFlutterDriver], which uses webdriver to implement.
|
||||
Future<Map<String, dynamic>> sendCommand(Command command);
|
||||
Future<Map<String, dynamic>> sendCommand(Command command) => throw UnimplementedError();
|
||||
|
||||
/// Checks the status of the Flutter Driver extension.
|
||||
Future<Health> checkHealth({ Duration timeout }) async {
|
||||
|
@ -561,7 +561,7 @@ abstract class FlutterDriver {
|
|||
/// In practice, sometimes the device gets really busy for a while and
|
||||
/// even two seconds isn't enough, which means that this is still racy
|
||||
/// and a source of flakes.
|
||||
Future<List<int>> screenshot();
|
||||
Future<List<int>> screenshot() => throw UnimplementedError();
|
||||
|
||||
/// Returns the Flags set in the Dart VM as JSON.
|
||||
///
|
||||
|
@ -584,7 +584,7 @@ abstract class FlutterDriver {
|
|||
/// [getFlagList]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#getflaglist
|
||||
///
|
||||
/// Throws [UnimplementedError] on [WebFlutterDriver] instances.
|
||||
Future<List<Map<String, dynamic>>> getVmFlags();
|
||||
Future<List<Map<String, dynamic>>> getVmFlags() => throw UnimplementedError();
|
||||
|
||||
/// Starts recording performance traces.
|
||||
///
|
||||
|
@ -596,7 +596,7 @@ abstract class FlutterDriver {
|
|||
Future<void> startTracing({
|
||||
List<TimelineStream> streams = const <TimelineStream>[TimelineStream.all],
|
||||
Duration timeout = kUnusuallyLongTimeout,
|
||||
});
|
||||
}) => throw UnimplementedError();
|
||||
|
||||
/// Stops recording performance traces and downloads the timeline.
|
||||
///
|
||||
|
@ -607,7 +607,7 @@ abstract class FlutterDriver {
|
|||
/// For [WebFlutterDriver], this is only supported for Chrome.
|
||||
Future<Timeline> stopTracingAndDownloadTimeline({
|
||||
Duration timeout = kUnusuallyLongTimeout,
|
||||
});
|
||||
}) => throw UnimplementedError();
|
||||
|
||||
/// Runs [action] and outputs a performance trace for it.
|
||||
///
|
||||
|
@ -632,7 +632,7 @@ abstract class FlutterDriver {
|
|||
Future<dynamic> action(), {
|
||||
List<TimelineStream> streams = const <TimelineStream>[TimelineStream.all],
|
||||
bool retainPriorEvents = false,
|
||||
});
|
||||
}) => throw UnimplementedError();
|
||||
|
||||
/// Clears all timeline events recorded up until now.
|
||||
///
|
||||
|
@ -643,7 +643,7 @@ abstract class FlutterDriver {
|
|||
/// For [WebFlutterDriver], this is only supported for Chrome.
|
||||
Future<void> clearTimeline({
|
||||
Duration timeout = kUnusuallyLongTimeout,
|
||||
});
|
||||
}) => throw UnimplementedError();
|
||||
|
||||
/// [action] will be executed with the frame sync mechanism disabled.
|
||||
///
|
||||
|
@ -675,12 +675,12 @@ abstract class FlutterDriver {
|
|||
/// Force a garbage collection run in the VM.
|
||||
///
|
||||
/// Throws [UnimplementedError] on [WebFlutterDriver] instances.
|
||||
Future<void> forceGC();
|
||||
Future<void> forceGC() => throw UnimplementedError();
|
||||
|
||||
/// Closes the underlying connection to the VM service.
|
||||
///
|
||||
/// Returns a [Future] that fires once the connection has been closed.
|
||||
Future<void> close();
|
||||
Future<void> close() => throw UnimplementedError();
|
||||
}
|
||||
|
||||
/// Provides convenient accessors to frequently used finders.
|
||||
|
|
|
@ -88,16 +88,6 @@ class WebFlutterDriver extends FlutterDriver {
|
|||
@override
|
||||
Future<void> close() => _connection.close();
|
||||
|
||||
@override
|
||||
Future<void> forceGC() async {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<Map<String, Object>>> getVmFlags() async {
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> waitUntilFirstFrameRasterized() async {
|
||||
throw UnimplementedError();
|
||||
|
@ -178,7 +168,8 @@ class WebFlutterDriver extends FlutterDriver {
|
|||
|
||||
/// Encapsulates connection information to an instance of a Flutter Web application.
|
||||
class FlutterWebConnection {
|
||||
FlutterWebConnection._(this._driver);
|
||||
/// Creates a FlutterWebConnection with WebDriver
|
||||
FlutterWebConnection(this._driver);
|
||||
|
||||
final sync_io.WebDriver _driver;
|
||||
|
||||
|
@ -193,22 +184,10 @@ class FlutterWebConnection {
|
|||
final sync_io.WebDriver driver = createDriver(settings);
|
||||
driver.get(url);
|
||||
|
||||
// Configure WebDriver browser by setting its location and dimension.
|
||||
final List<String> dimensions = settings['browser-dimension'].split(',') as List<String>;
|
||||
if (dimensions.length != 2) {
|
||||
throw DriverError('Invalid browser window size.');
|
||||
}
|
||||
final int x = int.parse(dimensions[0]);
|
||||
final int y = int.parse(dimensions[1]);
|
||||
final sync_io.Window window = driver.window;
|
||||
window.setLocation(const math.Point<int>(0, 0));
|
||||
window.setSize(math.Rectangle<int>(0, 0, x, y));
|
||||
setDriverLocationAndDimension(driver, settings);
|
||||
|
||||
// Wait until extension is installed.
|
||||
await waitFor<void>(() => driver.execute('return typeof(window.\$flutterDriver)', <String>[]),
|
||||
matcher: 'function',
|
||||
timeout: timeout ?? const Duration(days: 365));
|
||||
return FlutterWebConnection._(driver);
|
||||
await waitUntilExtensionInstalled(driver, timeout);
|
||||
return FlutterWebConnection(driver);
|
||||
}
|
||||
|
||||
/// Sends command via WebDriver to Flutter web application
|
||||
|
@ -248,3 +227,28 @@ class FlutterWebConnection {
|
|||
_driver.quit();
|
||||
}
|
||||
}
|
||||
|
||||
/// Configures the location and dimension of WebDriver.
|
||||
void setDriverLocationAndDimension(sync_io.WebDriver driver, Map<String, dynamic> settings) {
|
||||
final List<String> dimensions = settings['browser-dimension'].split(',') as List<String>;
|
||||
if (dimensions.length != 2) {
|
||||
throw DriverError('Invalid browser window size.');
|
||||
}
|
||||
final int x = int.parse(dimensions[0]);
|
||||
final int y = int.parse(dimensions[1]);
|
||||
final sync_io.Window window = driver.window;
|
||||
try {
|
||||
window.setLocation(const math.Point<int>(0, 0));
|
||||
window.setSize(math.Rectangle<int>(0, 0, x, y));
|
||||
} catch (_) {
|
||||
// Error might be thrown in some browsers.
|
||||
}
|
||||
}
|
||||
|
||||
/// Waits until extension is installed.
|
||||
Future<void> waitUntilExtensionInstalled(sync_io.WebDriver driver, Duration timeout) async {
|
||||
await waitFor<void>(() =>
|
||||
driver.execute('return typeof(window.\$flutterDriver)', <String>[]),
|
||||
matcher: 'function',
|
||||
timeout: timeout ?? const Duration(days: 365));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue