Create helper functions to handle WebDriver actions. Some actions on base … (#48538)

This commit is contained in:
Angjie Li 2020-01-10 14:48:02 -08:00 committed by Flutter GitHub Bot
parent 6397c022bb
commit 1d08642a90
2 changed files with 41 additions and 37 deletions

View file

@ -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.

View file

@ -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));
}