diff --git a/lib/src/common/request_client.dart b/lib/src/common/request_client.dart
index 2512361..6ca12d0 100644
--- a/lib/src/common/request_client.dart
+++ b/lib/src/common/request_client.dart
@@ -40,7 +40,7 @@
     trace = trace.foldFrames((f) => f.library.startsWith('package:webdriver/'),
         terse: true);
 
-    var exception;
+    Object? exception;
     T? response;
     try {
       return response = process(sendRaw(request));
@@ -90,7 +90,7 @@
     trace = trace.foldFrames((f) => f.library.startsWith('package:webdriver/'),
         terse: true);
 
-    var exception;
+    Object? exception;
     T? response;
     try {
       return response = process(await sendRaw(request));
diff --git a/lib/src/sync/common.dart b/lib/src/sync/common.dart
index c32d800..0255a44 100644
--- a/lib/src/sync/common.dart
+++ b/lib/src/sync/common.dart
@@ -30,7 +30,7 @@
 /// Simple class to provide access to indexed properties such as WebElement
 /// attributes or css styles.
 class Attributes {
-  GetAttribute _getAttribute;
+  final GetAttribute _getAttribute;
 
   Attributes(this._getAttribute);
 
diff --git a/lib/support/firefox_profile.dart b/lib/support/firefox_profile.dart
index 244472f..ed3b4ff 100644
--- a/lib/support/firefox_profile.dart
+++ b/lib/support/firefox_profile.dart
@@ -105,7 +105,7 @@
 class FirefoxProfile {
   final io.Directory profileDirectory;
 
-  Set<PrefsOption> _prefs = Set<PrefsOption>();
+  Set<PrefsOption> _prefs = <PrefsOption>{};
 
   /// The read-only settings of the `prefs.js` file of the profile directory.
   List<PrefsOption> get prefs => UnmodifiableListView<PrefsOption>(_prefs);
@@ -114,7 +114,7 @@
   /// the settings in [lockedPrefs].
   /// [setOption] and [removeOption] allow to update, add, and remove settings
   /// except these included in [lockedPrefs].
-  Set<PrefsOption> _userPrefs = Set<PrefsOption>();
+  Set<PrefsOption> _userPrefs = <PrefsOption>{};
 
   List<PrefsOption> get userPrefs =>
       UnmodifiableListView<PrefsOption>(_userPrefs);
@@ -199,7 +199,7 @@
   /// is otherwise ignored.
   /// Comments, lines starting with `//` are silently ignored.
   static Set<PrefsOption> loadPrefsFile(io.File file) {
-    final prefs = Set<PrefsOption>();
+    final prefs = <PrefsOption>{};
     final lines = LineSplitter.split(file.readAsStringSync())
         .where((line) => !_ignoreLine(line));
     bool canNotParseCaption = true;
diff --git a/test/async_alert_test.dart b/test/async_alert_test.dart
index d3a16d5..5a38b2d 100644
--- a/test/async_alert_test.dart
+++ b/test/async_alert_test.dart
@@ -59,21 +59,21 @@
 
     test('accept', () async {
       await button.click();
-      var alert = await driver.switchTo.alert;
+      var alert = driver.switchTo.alert;
       await alert.accept();
       expect(await output.text, startsWith('accepted'));
     });
 
     test('dismiss', () async {
       await button.click();
-      var alert = await driver.switchTo.alert;
+      var alert = driver.switchTo.alert;
       await alert.dismiss();
       expect(await output.text, startsWith('dismissed'));
     });
 
     test('sendKeys', () async {
       await button.click();
-      Alert alert = await driver.switchTo.alert;
+      Alert alert = driver.switchTo.alert;
       await alert.sendKeys('some keys');
       await alert.accept();
       expect(await output.text, endsWith('some keys'));
diff --git a/test/async_command_event_test.dart b/test/async_command_event_test.dart
index a75490c..8c1d012 100644
--- a/test/async_command_event_test.dart
+++ b/test/async_command_event_test.dart
@@ -52,10 +52,10 @@
       expect(events, hasLength(2));
       expect(events[1].method, 'GET');
       expect(events[1].endPoint, contains('alert'));
-      expect(events[1].exception, const isInstanceOf<WebDriverException>());
+      expect(events[1].exception, isA<WebDriverException>());
       expect(events[1].result, isNull);
       expect(events[1].startTime!.isBefore(events[1].endTime!), isTrue);
-      expect(events[1].stackTrace, const isInstanceOf<Chain>());
+      expect(events[1].stackTrace, isA<Chain>());
     });
 
     test('handles normal operation', () async {
diff --git a/test/async_web_driver_test.dart b/test/async_web_driver_test.dart
index e32a690..f504dd7 100644
--- a/test/async_web_driver_test.dart
+++ b/test/async_web_driver_test.dart
@@ -137,7 +137,7 @@
       test('windows', () async {
         var windows = await driver.windows.toList();
         expect(windows, hasLength(isPositive));
-        expect(windows, everyElement(const isInstanceOf<Window>()));
+        expect(windows, everyElement(isA<Window>()));
       });
 
       test('execute', () async {
@@ -163,7 +163,7 @@
       test('captureScreenshot', () async {
         var screenshot = await driver.captureScreenshot().toList();
         expect(screenshot, hasLength(isPositive));
-        expect(screenshot, everyElement(const isInstanceOf<int>()));
+        expect(screenshot, everyElement(isA<int>()));
       });
 
       test('captureScreenshotAsList', () async {
diff --git a/test/async_web_element_test.dart b/test/async_web_element_test.dart
index 048feb1..6fe19b8 100644
--- a/test/async_web_element_test.dart
+++ b/test/async_web_element_test.dart
@@ -61,7 +61,7 @@
 
     test('click', () async {
       await button.click();
-      var alert = await driver.switchTo.alert;
+      var alert = driver.switchTo.alert;
       await alert.accept();
     });
 
diff --git a/test/support/async_test.dart b/test/support/async_test.dart
index 6b903b5..c851ec3 100644
--- a/test/support/async_test.dart
+++ b/test/support/async_test.dart
@@ -35,7 +35,7 @@
 
     test('release without acquiring fails', () {
       var lock = Lock();
-      expect(() => lock.release(), throwsA(const isInstanceOf<StateError>()));
+      expect(() => lock.release(), throwsA(isA<StateError>()));
     });
 
     test('locking prevents acquisition of lock', () async {
@@ -107,7 +107,7 @@
     });
 
     test('throws if condition throws and timeouts', () async {
-      var exception;
+      Object? exception;
 
       try {
         await clock.waitFor(() => throw 'an exception');
@@ -118,7 +118,7 @@
     });
 
     test('throws if condition never matches', () async {
-      var exception;
+      Object? exception;
       try {
         await clock.waitFor(() => null, matcher: isNotNull);
       } catch (e) {
@@ -134,7 +134,7 @@
     });
 
     test('works with Future exceptions', () async {
-      var exception;
+      Object? exception;
 
       try {
         await clock.waitFor(() => Future.error('an exception'));
@@ -160,7 +160,7 @@
 
     test('sanity test with real Clock -- throws', () async {
       var clock = const Clock();
-      var exception;
+      Object? exception;
       try {
         await clock.waitFor(() => throw 'an exception');
       } catch (e) {
@@ -171,7 +171,7 @@
 
     test('sanity test with real Clock -- never matches', () async {
       var clock = const Clock();
-      var exception;
+      Object? exception;
       try {
         await clock.waitFor(() => null, matcher: isNotNull);
       } catch (e) {
diff --git a/test/support/firefox_profile_test.dart b/test/support/firefox_profile_test.dart
index bbb992a..f5864e3 100644
--- a/test/support/firefox_profile_test.dart
+++ b/test/support/firefox_profile_test.dart
@@ -32,7 +32,7 @@
           r'extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}\",\"e\":true,\'
           r'"v\":\"40.0\",\"st\":1439535413000,\"mt\":1438968709000}}}");';
       var option = PrefsOption.parse(value);
-      expect(option, const isInstanceOf<StringOption>());
+      expect(option, isA<StringOption>());
       expect(option.asPrefString, value);
     });
 
@@ -40,21 +40,21 @@
       const value = r'user_pref("browser.cache.disk.parent_directory", '
           r'"\\\\volume\\web\\cache\\mz");';
       var option = PrefsOption.parse(value);
-      expect(option, const isInstanceOf<StringOption>());
+      expect(option, isA<StringOption>());
       expect(option.asPrefString, value);
     });
 
     test('parse and serialize integer value', () {
       const value = r'user_pref("browser.cache.frecency_experiment", 3);';
       var option = PrefsOption.parse(value);
-      expect(option, const isInstanceOf<IntegerOption>());
+      expect(option, isA<IntegerOption>());
       expect(option.asPrefString, value);
     });
 
     test('parse and serialize negative integer value', () {
       const value = r'user_pref("browser.cache.frecency_experiment", -3);';
       var option = PrefsOption.parse(value);
-      expect(option, const isInstanceOf<IntegerOption>());
+      expect(option, isA<IntegerOption>());
       expect(option.asPrefString, value);
     });
 
@@ -62,7 +62,7 @@
       const value =
           r'user_pref("browser.cache.disk.smart_size.first_run", true);';
       var option = PrefsOption.parse(value);
-      expect(option, const isInstanceOf<BooleanOption>());
+      expect(option, isA<BooleanOption>());
       expect(option.asPrefString, value);
     });
 
@@ -70,7 +70,7 @@
       const value =
           r'user_pref("browser.cache.disk.smart_size.first_run", false);';
       var option = PrefsOption.parse(value);
-      expect(option, const isInstanceOf<BooleanOption>());
+      expect(option, isA<BooleanOption>());
       expect(option.asPrefString, value);
     });
 
@@ -78,7 +78,7 @@
       const value =
           r'user_pref("browser.cache.disk.smart_size.first_run", True);';
       var option = PrefsOption.parse(value);
-      expect(option, const isInstanceOf<BooleanOption>());
+      expect(option, isA<BooleanOption>());
       expect(option.value, true);
     });
 
diff --git a/test/sync/web_driver.dart b/test/sync/web_driver.dart
index 5ff25e6..39198f3 100644
--- a/test/sync/web_driver.dart
+++ b/test/sync/web_driver.dart
@@ -139,7 +139,7 @@
       test('windows', () {
         var windows = driver.windows.toList();
         expect(windows, hasLength(isPositive));
-        expect(windows, everyElement(const isInstanceOf<Window>()));
+        expect(windows, everyElement(isA<Window>()));
       });
 
       test('execute', () {
@@ -163,33 +163,33 @@
       test('captureScreenshot', () {
         var screenshot = driver.captureScreenshotAsList().toList();
         expect(screenshot, hasLength(isPositive));
-        expect(screenshot, everyElement(const isInstanceOf<int>()));
+        expect(screenshot, everyElement(isA<int>()));
       });
 
       test('captureScreenshotAsList', () {
         var screenshot = driver.captureScreenshotAsList();
         expect(screenshot, hasLength(isPositive));
-        expect(screenshot, everyElement(const isInstanceOf<int>()));
+        expect(screenshot, everyElement(isA<int>()));
       });
 
       test('captureElementScreenshotAsList', () {
         var element = driver.findElement(const By.tagName('tr'));
         var screenshot = driver.captureElementScreenshotAsList(element);
         expect(screenshot, hasLength(isPositive));
-        expect(screenshot, everyElement(const isInstanceOf<int>()));
+        expect(screenshot, everyElement(isA<int>()));
       });
 
       test('captureScreenshotAsBase64', () {
         var screenshot = driver.captureScreenshotAsBase64();
         expect(screenshot, hasLength(isPositive));
-        expect(screenshot, const isInstanceOf<String>());
+        expect(screenshot, isA<String>());
       });
 
       test('captureElementScreenshotAsBase64', () {
         var element = driver.findElement(const By.tagName('tr'));
         var screenshot = driver.captureElementScreenshotAsBase64(element);
         expect(screenshot, hasLength(isPositive));
-        expect(screenshot, const isInstanceOf<String>());
+        expect(screenshot, isA<String>());
       });
 
       test('event listeners work with script timeouts', () {
diff --git a/test/sync/web_element.dart b/test/sync/web_element.dart
index 2132a4a..bf51993 100644
--- a/test/sync/web_element.dart
+++ b/test/sync/web_element.dart
@@ -48,8 +48,8 @@
           driver.findElement(const By.cssSelector('input[type=checkbox]'));
       disabled =
           driver.findElement(const By.cssSelector('input[type=password]'));
-      invisible = await driver.findElement(const By.id('invisible-div'));
-      inner = await driver.findElement(const By.id('inner-div'));
+      invisible = driver.findElement(const By.id('invisible-div'));
+      inner = driver.findElement(const By.id('inner-div'));
     });
 
     tearDown(() async {
