diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 4fba63d..b6a3092 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -13,8 +13,6 @@
   PUB_ENVIRONMENT: bot.github
 
 jobs:
-  # Check code formatting and static analysis on a single OS (linux)
-  # against Dart dev.
   analyze:
     runs-on: ubuntu-latest
     strategy:
@@ -33,19 +31,14 @@
       run: dart format --output=none --set-exit-if-changed .
       if: always() && steps.install.outcome == 'success'
     - name: Analyze code
-      run: dart analyze # More cleanup-needed --fatal-infos
+      run: dart analyze --fatal-infos
       if: always() && steps.install.outcome == 'success'
 
-  # Run tests on a matrix consisting of two dimensions:
-  # 1. OS: ubuntu-latest, (macos-latest, windows-latest)
-  # 2. release channel: dev
-  test:
-    #needs: analyze
+  test_chrome:
     runs-on: ${{ matrix.os }}
     strategy:
       fail-fast: false
       matrix:
-        # Add macos-latest and/or windows-latest if relevant for this package.
         os: [ubuntu-latest]
         sdk: [dev]
     steps:
@@ -54,7 +47,6 @@
       with:
         sdk: ${{ matrix.sdk }}
     - uses: nanasess/setup-chromedriver@v1.0.1
-    - uses: browser-actions/setup-geckodriver@v0.0.0
     - id: install
       name: Install dependencies
       run: dart pub get
@@ -62,11 +54,32 @@
       run: |
         export DISPLAY=:99
         chromedriver --port=4444 --url-base=/wd/hub &
-        geckodriver --port=4445 &
         sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
-        pub run test -j 1
+        pub run test --exclude-tags ff
       if: always() && steps.install.outcome == 'success'
       env:
-        # until sync_http is migrated to null safety
-        DART_VM_OPTIONS: "--no-sound-null-safety"
         CHROMEDRIVER_ARGS: '--no-sandbox --headless'
+
+  test_firefox:
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [ubuntu-latest]
+        sdk: [dev]
+    steps:
+    - uses: actions/checkout@v2
+    - uses: dart-lang/setup-dart@v0.3
+      with:
+        sdk: ${{ matrix.sdk }}
+    - uses: browser-actions/setup-geckodriver@v0.0.0
+    - id: install
+      name: Install dependencies
+      run: dart pub get
+    - name: test
+      run: |
+        export DISPLAY=:99
+        geckodriver --port=4445 &
+        sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
+        pub run test --tags ff
+      if: always() && steps.install.outcome == 'success'
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 6f8b463..a5a3a99 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,15 +1,22 @@
+include: package:pedantic/analysis_options.yaml
+
+analyzer:
+  strong-mode:
+    implicit-casts: false
+
 linter:
   rules:
-    - always_declare_return_types
-    - always_require_non_null_named_parameters
-    - annotate_overrides
     - avoid_empty_else
     - avoid_init_to_null
     - avoid_null_checks_in_equality_operators
-    - avoid_return_types_on_setters
+    - avoid_unused_constructor_parameters
     - await_only_futures
+    - camel_case_types
     - cancel_subscriptions
+    - constant_identifier_names
     - control_flow_in_finally
+    - directives_ordering
+    - empty_catches
     - empty_constructor_bodies
     - empty_statements
     - hash_and_equals
@@ -18,37 +25,23 @@
     - library_names
     - library_prefixes
     - list_remove_unrelated_type
-    - no_adjacent_strings_in_list
-    - no_duplicate_case_values
     - non_constant_identifier_names
-    - one_member_abstracts
     - overridden_fields
     - package_api_docs
     - package_names
     - package_prefixed_library_names
-    - prefer_asserts_in_initializer_lists
-    - prefer_collection_literals
-    - prefer_conditional_assignment
-    - prefer_const_constructors
-    - prefer_const_constructors_in_immutables
-    - prefer_contains
+    - prefer_equal_for_default_values
+    - prefer_expression_function_bodies
     - prefer_final_fields
-    - prefer_initializing_formals
-    - prefer_is_empty
+    - prefer_generic_function_type_aliases
     - prefer_is_not_empty
-    - prefer_single_quotes
-    - prefer_typing_uninitialized_variables
-    - recursive_getters
+    - prefer_relative_imports
     - slash_for_doc_comments
     - test_types_in_equals
     - throw_in_finally
     - type_init_formals
-    - unawaited_futures
     - unnecessary_brace_in_string_interps
-    - unnecessary_getters_setters
-    - unnecessary_lambdas
-    - unnecessary_null_aware_assignments
-    - unnecessary_null_in_if_null_operators
-    - unnecessary_overrides
-    - unnecessary_statements
+    - unnecessary_const
+    - unnecessary_new
     - unrelated_type_equality_checks
+    - valid_regexps
diff --git a/dart_test.yaml b/dart_test.yaml
new file mode 100644
index 0000000..6c3da2b
--- /dev/null
+++ b/dart_test.yaml
@@ -0,0 +1,3 @@
+# See https://github.com/dart-lang/test/blob/master/pkgs/test/doc/configuration.md
+tags:
+  ff: # tests that run on Firefox. Others tests are assumed to run on Chrome
diff --git a/lib/async_core.dart b/lib/async_core.dart
index 37be98b..b33067d 100644
--- a/lib/async_core.dart
+++ b/lib/async_core.dart
@@ -17,11 +17,11 @@
 import 'dart:async' show Future;
 import 'dart:collection' show UnmodifiableMapView;
 
-import 'package:webdriver/src/async/web_driver.dart';
-import 'package:webdriver/src/common/capabilities.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/utils.dart';
+import 'src/async/web_driver.dart';
+import 'src/common/capabilities.dart';
+import 'src/common/request_client.dart';
+import 'src/common/spec.dart';
+import 'src/common/utils.dart';
 
 export 'package:webdriver/src/async/alert.dart';
 export 'package:webdriver/src/async/common.dart';
diff --git a/lib/async_html.dart b/lib/async_html.dart
index ad83a6f..21f86b0 100644
--- a/lib/async_html.dart
+++ b/lib/async_html.dart
@@ -16,10 +16,10 @@
 
 import 'dart:async' show Future;
 
-import 'package:webdriver/async_core.dart' as core
+import 'async_core.dart' as core
     show createDriver, fromExistingSession, fromExistingSessionSync, WebDriver;
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/request/async_xhr_request_client.dart';
+import 'src/common/spec.dart';
+import 'src/request/async_xhr_request_client.dart';
 
 export 'package:webdriver/async_core.dart'
     hide createDriver, fromExistingSession, fromExistingSessionSync;
diff --git a/lib/async_io.dart b/lib/async_io.dart
index d14cf90..0001692 100644
--- a/lib/async_io.dart
+++ b/lib/async_io.dart
@@ -16,14 +16,14 @@
 
 import 'dart:async' show Future;
 
-import 'package:webdriver/async_core.dart' as core
+import 'async_core.dart' as core
     show
         createDriver,
         fromExistingSession,
         fromExistingSessionSync,
         WebDriver,
         WebDriverSpec;
-import 'package:webdriver/src/request/async_io_request_client.dart';
+import 'src/request/async_io_request_client.dart';
 
 export 'package:webdriver/async_core.dart'
     hide createDriver, fromExistingSession, fromExistingSessionSync;
diff --git a/lib/src/async/alert.dart b/lib/src/async/alert.dart
index 18b9190..2f6c526 100644
--- a/lib/src/async/alert.dart
+++ b/lib/src/async/alert.dart
@@ -14,8 +14,8 @@
 
 import 'dart:async';
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 /// A JavaScript alert(), confirm(), or prompt() dialog
 class Alert {
diff --git a/lib/src/async/common.dart b/lib/src/async/common.dart
index 52ddc55..4d6d6f1 100644
--- a/lib/src/async/common.dart
+++ b/lib/src/async/common.dart
@@ -14,9 +14,9 @@
 
 import 'dart:async';
 
-import 'package:webdriver/src/common/by.dart';
-import 'package:webdriver/src/async/web_driver.dart';
-import 'package:webdriver/src/async/web_element.dart';
+import '../common/by.dart';
+import 'web_driver.dart';
+import 'web_element.dart';
 
 typedef GetAttribute = Future<String?> Function(String name);
 
diff --git a/lib/src/async/common_io.dart b/lib/src/async/common_io.dart
index 941cc18..e3d3909 100644
--- a/lib/src/async/common_io.dart
+++ b/lib/src/async/common_io.dart
@@ -1,6 +1,6 @@
-import 'package:webdriver/src/async/web_driver.dart';
-import 'package:webdriver/src/request/sync_http_request_client.dart';
-import 'package:webdriver/sync_core.dart' as sync_core;
+import '../../sync_core.dart' as sync_core;
+import '../request/sync_http_request_client.dart';
+import 'web_driver.dart';
 
 /// Returns a [sync_core.WebDriver] with the same URI + session ID.
 sync_core.WebDriver createSyncWebDriver(WebDriver driver) =>
diff --git a/lib/src/async/common_stub.dart b/lib/src/async/common_stub.dart
index 004a39a..ce29249 100644
--- a/lib/src/async/common_stub.dart
+++ b/lib/src/async/common_stub.dart
@@ -1,5 +1,5 @@
-import 'package:webdriver/src/async/web_driver.dart';
-import 'package:webdriver/sync_core.dart' as sync_core;
+import '../../sync_core.dart' as sync_core;
+import 'web_driver.dart';
 
 /// Returns a [sync_core.WebDriver] with the same URI + session ID.
 sync_core.WebDriver createSyncWebDriver(WebDriver driver) =>
diff --git a/lib/src/async/cookies.dart b/lib/src/async/cookies.dart
index 082e36b..1b34be3 100644
--- a/lib/src/async/cookies.dart
+++ b/lib/src/async/cookies.dart
@@ -14,9 +14,9 @@
 
 import 'dart:async';
 
-import 'package:webdriver/src/common/cookie.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/cookie.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 class Cookies {
   final AsyncRequestClient _client;
diff --git a/lib/src/async/logs.dart b/lib/src/async/logs.dart
index 3611d14..e7a26fc 100644
--- a/lib/src/async/logs.dart
+++ b/lib/src/async/logs.dart
@@ -14,10 +14,10 @@
 
 import 'dart:async';
 
-import 'package:webdriver/src/common/exception.dart';
-import 'package:webdriver/src/common/log.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/exception.dart';
+import '../common/log.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 class Logs {
   final AsyncRequestClient _client;
diff --git a/lib/src/async/mouse.dart b/lib/src/async/mouse.dart
index 1e6b0c7..d72647b 100644
--- a/lib/src/async/mouse.dart
+++ b/lib/src/async/mouse.dart
@@ -14,12 +14,12 @@
 
 import 'dart:async';
 
-import 'package:webdriver/src/async/web_element.dart';
-import 'package:webdriver/src/common/mouse.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire_handler.dart';
-import 'package:webdriver/src/handler/w3c_handler.dart';
+import '../common/mouse.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
+import '../handler/json_wire_handler.dart';
+import '../handler/w3c_handler.dart';
+import 'web_element.dart';
 
 class Mouse {
   final AsyncRequestClient _client;
diff --git a/lib/src/async/target_locator.dart b/lib/src/async/target_locator.dart
index ac87651..cfe07ca 100644
--- a/lib/src/async/target_locator.dart
+++ b/lib/src/async/target_locator.dart
@@ -14,9 +14,9 @@
 
 import 'dart:async';
 
-import 'package:webdriver/async_core.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../../async_core.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 class TargetLocator {
   final WebDriver _driver;
@@ -36,7 +36,7 @@
   ///
   ///   Throws [NoSuchFrameException] if the specified frame can't be found.
   Future<void> frame([/* int | WebElement | String */ frame]) async {
-    if (frame == null || frame is int) {
+    if (frame is int?) {
       await _client.send(_handler.frame.buildSwitchByIdRequest(frame),
           _handler.frame.parseSwitchByIdResponse);
     } else if (frame is WebElement) {
diff --git a/lib/src/async/timeouts.dart b/lib/src/async/timeouts.dart
index be1f416..7f48fe4 100644
--- a/lib/src/async/timeouts.dart
+++ b/lib/src/async/timeouts.dart
@@ -14,8 +14,8 @@
 
 import 'dart:async';
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 class Timeouts {
   final AsyncRequestClient _client;
diff --git a/lib/src/async/web_driver.dart b/lib/src/async/web_driver.dart
index 566a906..5a29d51 100644
--- a/lib/src/async/web_driver.dart
+++ b/lib/src/async/web_driver.dart
@@ -15,30 +15,29 @@
 import 'dart:async';
 import 'dart:convert';
 
-import 'package:webdriver/src/async/common.dart';
-
-import 'package:webdriver/src/async/cookies.dart';
-import 'package:webdriver/src/async/keyboard.dart';
-import 'package:webdriver/src/async/mouse.dart';
-import 'package:webdriver/src/async/logs.dart';
-import 'package:webdriver/src/async/stepper.dart' show Stepper;
-import 'package:webdriver/src/async/target_locator.dart';
-import 'package:webdriver/src/async/timeouts.dart';
-import 'package:webdriver/src/async/web_element.dart';
-import 'package:webdriver/src/async/window.dart';
-import 'package:webdriver/src/common/by.dart';
-import 'package:webdriver/src/common/command_event.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/utils.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/sync_core.dart' as sync_core;
+import '../../sync_core.dart' as sync_core;
+import '../common/by.dart';
+import '../common/command_event.dart';
+import '../common/request.dart';
+import '../common/request_client.dart';
+import '../common/spec.dart';
+import '../common/utils.dart';
+import '../common/webdriver_handler.dart';
+import 'common.dart';
 
 // ignore: uri_does_not_exist
 import 'common_stub.dart'
-    // ignore: uri_does_not_exist
+// ignore: uri_does_not_exist
     if (dart.library.io) 'common_io.dart';
+import 'cookies.dart';
+import 'keyboard.dart';
+import 'logs.dart';
+import 'mouse.dart';
+import 'stepper.dart' show Stepper;
+import 'target_locator.dart';
+import 'timeouts.dart';
+import 'web_element.dart';
+import 'window.dart';
 
 class WebDriver implements SearchContext {
   final WebDriverSpec spec;
@@ -57,7 +56,7 @@
   final AsyncRequestClient _client;
 
   WebDriver(this.uri, this.id, this.capabilities, this._client, this.spec)
-      : this._handler = getHandler(spec);
+      : _handler = getHandler(spec);
 
   /// Produces a [sync_core.WebDriver] with the same session ID. Allows
   /// forwards compatibility with other frameworks.
@@ -77,8 +76,9 @@
 
   /// Navigates to the specified url
   Future<void> get(/* Uri | String */ url) => _client.send(
-      _handler.navigation
-          .buildNavigateToRequest((url is Uri) ? url.toString() : url),
+      _handler.navigation.buildNavigateToRequest(
+        (url is Uri) ? url.toString() : url as String,
+      ),
       _handler.navigation.parseNavigateToResponse);
 
   ///  Navigates forwards in the browser history, if possible.
@@ -105,7 +105,7 @@
     final ids = await _client.send(
         _handler.elementFinder.buildFindElementsRequest(by),
         _handler.elementFinder.parseFindElementsResponse);
-    int i = 0;
+    var i = 0;
 
     for (var id in ids) {
       yield getElement(id, this, by, i);
@@ -169,8 +169,7 @@
     return null;
   }
 
-  TargetLocator get switchTo =>
-      TargetLocator(this, this._client, this._handler);
+  TargetLocator get switchTo => TargetLocator(this, _client, _handler);
 
   Cookies get cookies => Cookies(_client, _handler);
 
@@ -184,9 +183,9 @@
 
   Timeouts get timeouts => Timeouts(_client, _handler);
 
-  Keyboard get keyboard => Keyboard(this._client, this._handler);
+  Keyboard get keyboard => Keyboard(_client, _handler);
 
-  Mouse get mouse => Mouse(this._client, this._handler);
+  Mouse get mouse => Mouse(_client, _handler);
 
   /// Take a screenshot of the current page as PNG and return it as
   /// base64-encoded string.
@@ -258,26 +257,43 @@
   /// the corresponding DOM element. Likewise, any DOM Elements in the script
   /// result will be converted to WebElements.
   Future<dynamic> execute(String script, List args) => _client.send(
-      _handler.core.buildExecuteRequest(script, args),
-      (response) => _handler.core.parseExecuteResponse(
-          response, (elementId) => getElement(elementId, this, 'javascript')));
+        _handler.core.buildExecuteRequest(script, args),
+        (response) => _handler.core.parseExecuteResponse(
+          response,
+          (elementId) => getElement(elementId, this, 'javascript'),
+        ),
+      );
 
   Future<dynamic> postRequest(String command, [params]) => _client.send(
-      _handler.buildGeneralRequest(HttpMethod.httpPost, command, params),
-      (response) => _handler.parseGeneralResponse(
-          response, (elementId) => getElement(elementId, this)));
+        _handler.buildGeneralRequest(HttpMethod.httpPost, command, params),
+        (response) => _handler.parseGeneralResponse(
+          response,
+          (elementId) => getElement(elementId, this),
+        ),
+      );
 
   Future<dynamic> getRequest(String command) => _client.send(
-      _handler.buildGeneralRequest(HttpMethod.httpGet, command),
-      (response) => _handler.parseGeneralResponse(
-          response, (elementId) => getElement(elementId, this)));
+        _handler.buildGeneralRequest(HttpMethod.httpGet, command),
+        (response) => _handler.parseGeneralResponse(
+          response,
+          (elementId) => getElement(elementId, this),
+        ),
+      );
 
   Future<dynamic> deleteRequest(String command) => _client.send(
-      _handler.buildGeneralRequest(HttpMethod.httpDelete, command),
-      (response) => _handler.parseGeneralResponse(
-          response, (elementId) => getElement(elementId, this)));
+        _handler.buildGeneralRequest(HttpMethod.httpDelete, command),
+        (response) => _handler.parseGeneralResponse(
+          response,
+          (elementId) => getElement(elementId, this),
+        ),
+      );
 
-  WebElement getElement(String elementId, [context, locator, index]) =>
+  WebElement getElement(
+    String elementId, [
+    SearchContext? context,
+    locator,
+    int? index,
+  ]) =>
       WebElement(this, _client, _handler, elementId, context, locator, index);
 
   @override
diff --git a/lib/src/async/web_element.dart b/lib/src/async/web_element.dart
index e5b9a6d..7eb1211 100644
--- a/lib/src/async/web_element.dart
+++ b/lib/src/async/web_element.dart
@@ -15,12 +15,12 @@
 import 'dart:async';
 import 'dart:math';
 
-import 'package:webdriver/src/async/common.dart';
-import 'package:webdriver/src/async/web_driver.dart';
-import 'package:webdriver/src/common/by.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/web_element.dart' as common;
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/by.dart';
+import '../common/request_client.dart';
+import '../common/web_element.dart' as common;
+import '../common/webdriver_handler.dart';
+import 'common.dart';
+import 'web_driver.dart';
 
 class WebElement extends common.WebElement implements SearchContext {
   @override
@@ -115,7 +115,7 @@
         _handler.elementFinder.buildFindElementsRequest(by, id),
         _handler.elementFinder.parseFindElementsResponse);
 
-    int i = 0;
+    var i = 0;
     for (var id in ids) {
       yield driver.getElement(id, this, by, i);
       i++;
@@ -151,14 +151,14 @@
       _handler.element.parseCssPropertyResponse));
 
   Future<bool> equals(WebElement other) async =>
-      other is WebElement && other.driver == this.driver && other.id == this.id;
+      other is WebElement && other.driver == driver && other.id == id;
 
   @override
   int get hashCode => driver.hashCode * 3 + id.hashCode;
 
   @override
   bool operator ==(other) =>
-      other is WebElement && other.driver == this.driver && other.id == this.id;
+      other is WebElement && other.driver == driver && other.id == id;
 
   @override
   String toString() {
diff --git a/lib/src/async/window.dart b/lib/src/async/window.dart
index 60cb0ac..436e7a8 100644
--- a/lib/src/async/window.dart
+++ b/lib/src/async/window.dart
@@ -15,8 +15,8 @@
 import 'dart:async';
 import 'dart:math';
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 class Window {
   final AsyncRequestClient _client;
@@ -104,9 +104,9 @@
   @override
   bool operator ==(other) =>
       other is Window &&
-      other._client == this._client &&
-      other._handler == this._handler &&
-      other.id == this.id;
+      other._client == _client &&
+      other._handler == _handler &&
+      other.id == id;
 
   @override
   String toString() => '$_handler.windows($_client)[$id]';
diff --git a/lib/src/common/by.dart b/lib/src/common/by.dart
index d5c1a11..87e05ab 100644
--- a/lib/src/common/by.dart
+++ b/lib/src/common/by.dart
@@ -61,5 +61,5 @@
 
   @override
   bool operator ==(other) =>
-      other is By && other.using == this.using && other.value == this.value;
+      other is By && other.using == using && other.value == value;
 }
diff --git a/lib/src/common/command_event.dart b/lib/src/common/command_event.dart
index 2f57aa1..fa66a48 100644
--- a/lib/src/common/command_event.dart
+++ b/lib/src/common/command_event.dart
@@ -34,5 +34,5 @@
 
   @override
   String toString() => '[$startTime - $endTime] $method $endPoint($params) => '
-      '${exception != null ? exception : result}';
+      '${exception ?? result}';
 }
diff --git a/lib/src/common/cookie.dart b/lib/src/common/cookie.dart
index 6e2b29d..0207c11 100644
--- a/lib/src/common/cookie.dart
+++ b/lib/src/common/cookie.dart
@@ -32,21 +32,31 @@
   /// (Optional) When the cookie expires.
   final DateTime? expiry;
 
-  Cookie(this.name, this.value,
-      {this.path, this.domain, this.secure, this.expiry});
+  Cookie(
+    this.name,
+    this.value, {
+    this.path,
+    this.domain,
+    this.secure,
+    this.expiry,
+  });
 
   factory Cookie.fromJson(Map<String, dynamic> json) {
     DateTime? expiry;
     if (json['expiry'] is num) {
       expiry = DateTime.fromMillisecondsSinceEpoch(
-          json['expiry'].toInt() * 1000,
-          isUtc: true);
+        (json['expiry'] as num).toInt() * 1000,
+        isUtc: true,
+      );
     }
-    return Cookie(json['name'], json['value'],
-        path: json['path'],
-        domain: json['domain'],
-        secure: json['secure'],
-        expiry: expiry);
+    return Cookie(
+      json['name'] as String?,
+      json['value'] as String?,
+      path: json['path'] as String?,
+      domain: json['domain'] as String?,
+      secure: json['secure'] as bool?,
+      expiry: expiry,
+    );
   }
 
   Map<String, dynamic> toJson() {
diff --git a/lib/src/common/exception.dart b/lib/src/common/exception.dart
index 9faf7cf..961f967 100644
--- a/lib/src/common/exception.dart
+++ b/lib/src/common/exception.dart
@@ -283,18 +283,27 @@
 }
 
 /// Temporary method to emulate the original w3c exception parsing logic.
-WebDriverException getExceptionFromW3cResponse(
-    {int? httpStatusCode, String? httpReasonPhrase, dynamic jsonResp}) {
+WebDriverException getExceptionFromW3cResponse({
+  int? httpStatusCode,
+  String? httpReasonPhrase,
+  dynamic jsonResp,
+}) {
   if (jsonResp is Map && jsonResp.keys.contains('value')) {
     final value = jsonResp['value'];
 
     switch (value['error']) {
       case 'invalid argument':
-        return InvalidArgumentException(httpStatusCode, value['message']);
+        return InvalidArgumentException(
+          httpStatusCode,
+          value['message'] as String?,
+        );
       case 'no such element':
-        return NoSuchElementException(httpStatusCode, value['message']);
+        return NoSuchElementException(
+          httpStatusCode,
+          value['message'] as String?,
+        );
       default:
-        return WebDriverException(httpStatusCode, value['message']);
+        return WebDriverException(httpStatusCode, value['message'] as String?);
     }
   }
 
diff --git a/lib/src/common/log.dart b/lib/src/common/log.dart
index c06badd..0322a51 100644
--- a/lib/src/common/log.dart
+++ b/lib/src/common/log.dart
@@ -7,10 +7,12 @@
 
   LogEntry.fromMap(Map map)
       : this(
-            map['message'],
-            DateTime.fromMillisecondsSinceEpoch(map['timestamp'].toInt(),
-                isUtc: true),
-            map['level']);
+            map['message'] as String?,
+            DateTime.fromMillisecondsSinceEpoch(
+              (map['timestamp'] as num).toInt(),
+              isUtc: true,
+            ),
+            map['level'] as String?);
 
   @override
   String toString() => '$level[$timestamp]: $message';
diff --git a/lib/src/common/request.dart b/lib/src/common/request.dart
index c68ac00..d310520 100644
--- a/lib/src/common/request.dart
+++ b/lib/src/common/request.dart
@@ -29,24 +29,24 @@
   WebDriverRequest(this.method, this.uri, this.body);
 
   WebDriverRequest.postRequest(this.uri, [params])
-      : this.method = HttpMethod.httpPost,
-        this.body = params == null ? '{}' : json.encode(params);
+      : method = HttpMethod.httpPost,
+        body = params == null ? '{}' : json.encode(params);
 
   WebDriverRequest.getRequest(this.uri)
-      : this.method = HttpMethod.httpGet,
-        this.body = null;
+      : method = HttpMethod.httpGet,
+        body = null;
 
   WebDriverRequest.deleteRequest(this.uri)
-      : this.method = HttpMethod.httpDelete,
-        this.body = null;
+      : method = HttpMethod.httpDelete,
+        body = null;
 
   /// Represents request that has no http request to make.
   ///
   /// Useful when the endpoint is not supported but can be inferred in some
   /// degree locally.
   WebDriverRequest.nullRequest(this.body)
-      : this.method = null,
-        this.uri = null;
+      : method = null,
+        uri = null;
 
   @override
   String toString() => '${method!.name} $uri: $body';
diff --git a/lib/src/common/request_client.dart b/lib/src/common/request_client.dart
index 6ca12d0..31ff9d9 100644
--- a/lib/src/common/request_client.dart
+++ b/lib/src/common/request_client.dart
@@ -1,7 +1,7 @@
 import 'dart:async';
 
 import 'package:stack_trace/stack_trace.dart';
-import 'package:webdriver/src/common/command_event.dart';
+import 'command_event.dart';
 
 import 'request.dart';
 
diff --git a/lib/src/common/session.dart b/lib/src/common/session.dart
index afa5840..d4cdccc 100644
--- a/lib/src/common/session.dart
+++ b/lib/src/common/session.dart
@@ -1,4 +1,4 @@
-import 'package:webdriver/src/common/spec.dart';
+import 'spec.dart';
 
 class SessionInfo {
   /// Id of the session.
diff --git a/lib/src/common/spec.dart b/lib/src/common/spec.dart
index 061845c..f5e7903 100644
--- a/lib/src/common/spec.dart
+++ b/lib/src/common/spec.dart
@@ -1,3 +1,5 @@
+// ignore_for_file: constant_identifier_names
+
 /// Defines the WebDriver spec to use. Auto = try to infer the spec based on
 /// the response during session creation.
 enum WebDriverSpec { Auto, JsonWire, W3c }
diff --git a/lib/src/common/utils.dart b/lib/src/common/utils.dart
index 1221929..0046085 100644
--- a/lib/src/common/utils.dart
+++ b/lib/src/common/utils.dart
@@ -1,8 +1,8 @@
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/infer_handler.dart';
-import 'package:webdriver/src/handler/json_wire_handler.dart';
-import 'package:webdriver/src/handler/w3c_handler.dart';
+import '../handler/infer_handler.dart';
+import '../handler/json_wire_handler.dart';
+import '../handler/w3c_handler.dart';
+import 'spec.dart';
+import 'webdriver_handler.dart';
 
 WebDriverHandler getHandler(WebDriverSpec spec) {
   switch (spec) {
diff --git a/lib/src/common/webdriver_handler.dart b/lib/src/common/webdriver_handler.dart
index 58a6c0b..62f6306 100644
--- a/lib/src/common/webdriver_handler.dart
+++ b/lib/src/common/webdriver_handler.dart
@@ -1,9 +1,8 @@
 import 'dart:math';
 
-import 'package:webdriver/async_core.dart';
-import 'package:webdriver/src/common/session.dart';
-
+import '../../async_core.dart';
 import 'request.dart';
+import 'session.dart';
 
 /// Handler for spec related request building and response parsing.
 ///
diff --git a/lib/src/handler/infer_handler.dart b/lib/src/handler/infer_handler.dart
index 3cb5270..3ccdb2a 100644
--- a/lib/src/handler/infer_handler.dart
+++ b/lib/src/handler/infer_handler.dart
@@ -1,13 +1,13 @@
 import 'dart:convert';
 
-import 'package:webdriver/src/common/capabilities.dart';
-import 'package:webdriver/src/common/exception.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/session.dart';
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/session.dart';
-import 'package:webdriver/src/handler/w3c/session.dart';
+import '../common/capabilities.dart';
+import '../common/exception.dart';
+import '../common/request.dart';
+import '../common/session.dart';
+import '../common/spec.dart';
+import '../common/webdriver_handler.dart';
+import 'json_wire/session.dart';
+import 'w3c/session.dart';
 
 /// A [WebDriverHandler] that is only used when creating new session /
 /// getting existing session info without given the spec.
@@ -84,9 +84,9 @@
 
   @override
   SessionInfo parseCreateResponse(WebDriverResponse response) {
-    Map responseBody;
+    Map<String, dynamic> responseBody;
     try {
-      responseBody = json.decode(response.body!);
+      responseBody = json.decode(response.body!) as Map<String, dynamic>;
     } catch (e) {
       final rawBody = response.body == null || response.body!.isEmpty
           ? '<empty response>'
@@ -104,7 +104,9 @@
     }
 
     throw WebDriverException(
-        response.statusCode, 'Unexpected response structure: ${response.body}');
+      response.statusCode,
+      'Unexpected response structure: ${response.body}',
+    );
   }
 
   @override
@@ -116,24 +118,27 @@
       [String? sessionId]) {
     if (response.statusCode == 404) {
       // May be W3C, as it will throw an unknown command exception.
-      Map? body;
+      Map<String, dynamic>? body;
       try {
-        body = json.decode(response.body!)['value'];
+        body = json.decode(response.body!)['value'] as Map<String, dynamic>?;
       } catch (e) {
         final rawBody = response.body?.isEmpty != false
             ? '<empty response>'
             : response.body;
         throw WebDriverException(
-            response.statusCode, 'Error parsing response body: $rawBody');
+          response.statusCode,
+          'Error parsing response body: $rawBody',
+        );
       }
 
       if (body == null ||
           body['error'] != 'unknown command' ||
           body['message'] is! String) {
         throw WebDriverException(
-            response.statusCode,
-            'Unexpected response body (expecting `unexpected command error` '
-            'produced by W3C WebDriver): ${response.body}');
+          response.statusCode,
+          'Unexpected response body (expecting `unexpected command error` '
+          'produced by W3C WebDriver): ${response.body}',
+        );
       }
 
       return SessionInfo(sessionId!, WebDriverSpec.W3c, Capabilities.empty);
diff --git a/lib/src/handler/json_wire/alert.dart b/lib/src/handler/json_wire/alert.dart
index a9f8873..fd95ab4 100644
--- a/lib/src/handler/json_wire/alert.dart
+++ b/lib/src/handler/json_wire/alert.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireAlertHandler implements AlertHandler {
   @override
@@ -23,7 +23,7 @@
 
   @override
   String parseGetTextResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response);
+      parseJsonWireResponse(response) as String;
 
   @override
   WebDriverRequest buildAcceptRequest() =>
diff --git a/lib/src/handler/json_wire/cookies.dart b/lib/src/handler/json_wire/cookies.dart
index 51a8461..8e50b05 100644
--- a/lib/src/handler/json_wire/cookies.dart
+++ b/lib/src/handler/json_wire/cookies.dart
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/cookie.dart';
-import 'package:webdriver/src/common/exception.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/cookie.dart';
+import '../../common/exception.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireCookiesHandler extends CookiesHandler {
   @override
@@ -64,7 +64,9 @@
 
   @override
   List<Cookie> parseGetAllCookiesResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response).map<Cookie>(_deserialize).toList();
+      (parseJsonWireResponse(response) as List)
+          .map<Cookie>(_deserialize)
+          .toList();
 
   /// Serializes the cookie to json object according to the spec.
   ///
@@ -74,5 +76,6 @@
   /// Deserializes the json object to get the cookie according to the spec.
   ///
   /// The spec is deserializing the same we do in [Cookie.fromJson].
-  Cookie _deserialize(dynamic content) => Cookie.fromJson(content);
+  Cookie _deserialize(dynamic content) =>
+      Cookie.fromJson(content as Map<String, dynamic>);
 }
diff --git a/lib/src/handler/json_wire/core.dart b/lib/src/handler/json_wire/core.dart
index 4de1af5..72ca850 100644
--- a/lib/src/handler/json_wire/core.dart
+++ b/lib/src/handler/json_wire/core.dart
@@ -1,6 +1,6 @@
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireCoreHandler extends CoreHandler {
   @override
@@ -9,14 +9,14 @@
 
   @override
   String parseCurrentUrlResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response);
+      parseJsonWireResponse(response) as String;
 
   @override
   WebDriverRequest buildTitleRequest() => WebDriverRequest.getRequest('title');
 
   @override
   String parseTitleResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response);
+      parseJsonWireResponse(response) as String;
 
   @override
   WebDriverRequest buildPageSourceRequest() =>
@@ -24,7 +24,7 @@
 
   @override
   String parsePageSourceResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response);
+      parseJsonWireResponse(response) as String;
 
   @override
   WebDriverRequest buildScreenshotRequest() =>
@@ -32,11 +32,11 @@
 
   @override
   WebDriverRequest buildElementScreenshotRequest(String elementId) =>
-      new WebDriverRequest.getRequest('${elementPrefix(elementId)}screenshot');
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}screenshot');
 
   @override
   String parseScreenshotResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response);
+      parseJsonWireResponse(response) as String;
 
   @override
   WebDriverRequest buildExecuteAsyncRequest(String script, List args) =>
diff --git a/lib/src/handler/json_wire/element.dart b/lib/src/handler/json_wire/element.dart
index aa363e0..54b1438 100644
--- a/lib/src/handler/json_wire/element.dart
+++ b/lib/src/handler/json_wire/element.dart
@@ -1,15 +1,14 @@
 import 'dart:math';
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
 
 import 'utils.dart';
 
 class JsonWireElementHandler extends ElementHandler {
   @override
-  WebDriverRequest buildClickRequest(String elementId) {
-    return WebDriverRequest.postRequest('${elementPrefix(elementId)}click');
-  }
+  WebDriverRequest buildClickRequest(String elementId) =>
+      WebDriverRequest.postRequest('${elementPrefix(elementId)}click');
 
   @override
   void parseClickResponse(WebDriverResponse response) {
@@ -17,11 +16,10 @@
   }
 
   @override
-  WebDriverRequest buildSendKeysRequest(String elementId, String keysToSend) {
-    return WebDriverRequest.postRequest('${elementPrefix(elementId)}value', {
-      'value': [keysToSend]
-    });
-  }
+  WebDriverRequest buildSendKeysRequest(String elementId, String keysToSend) =>
+      WebDriverRequest.postRequest('${elementPrefix(elementId)}value', {
+        'value': [keysToSend]
+      });
 
   @override
   void parseSendKeysResponse(WebDriverResponse response) {
@@ -29,9 +27,8 @@
   }
 
   @override
-  WebDriverRequest buildClearRequest(String elementId) {
-    return WebDriverRequest.postRequest('${elementPrefix(elementId)}clear');
-  }
+  WebDriverRequest buildClearRequest(String elementId) =>
+      WebDriverRequest.postRequest('${elementPrefix(elementId)}clear');
 
   @override
   void parseClearResponse(WebDriverResponse response) {
@@ -39,81 +36,74 @@
   }
 
   @override
-  WebDriverRequest buildSelectedRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}selected');
-  }
+  WebDriverRequest buildSelectedRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}selected');
 
   @override
-  bool parseSelectedResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response);
-  }
+  bool parseSelectedResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response) as bool;
 
   @override
-  WebDriverRequest buildEnabledRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}enabled');
-  }
+  WebDriverRequest buildEnabledRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}enabled');
 
   @override
-  bool parseEnabledResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response);
-  }
+  bool parseEnabledResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response) as bool;
 
   @override
-  WebDriverRequest buildDisplayedRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}displayed');
-  }
+  WebDriverRequest buildDisplayedRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}displayed');
 
   @override
-  bool parseDisplayedResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response);
-  }
+  bool parseDisplayedResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response) as bool;
 
   @override
-  WebDriverRequest buildLocationRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}location');
-  }
+  WebDriverRequest buildLocationRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}location');
 
   @override
   Point<int> parseLocationResponse(WebDriverResponse response) {
     final point = parseJsonWireResponse(response);
-    return Point(point['x'].toInt(), point['y'].toInt());
+    return Point((point['x'] as num).toInt(), (point['y'] as num).toInt());
   }
 
   @override
-  WebDriverRequest buildSizeRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}size');
-  }
+  WebDriverRequest buildSizeRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}size');
 
   @override
   Rectangle<int> parseSizeResponse(WebDriverResponse response) {
     final size = parseJsonWireResponse(response);
-    return Rectangle<int>(0, 0, size['width'].toInt(), size['height'].toInt());
+    return Rectangle<int>(
+      0,
+      0,
+      (size['width'] as num).toInt(),
+      (size['height'] as num).toInt(),
+    );
   }
 
   @override
-  WebDriverRequest buildNameRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}name');
-  }
+  WebDriverRequest buildNameRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}name');
 
   @override
-  String parseNameResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response);
-  }
+  String parseNameResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response) as String;
 
   @override
-  WebDriverRequest buildTextRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}text');
-  }
+  WebDriverRequest buildTextRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}text');
 
   @override
-  String parseTextResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response);
-  }
+  String parseTextResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response) as String;
 
   @override
-  WebDriverRequest buildAttributeRequest(String elementId, String name) {
-    return WebDriverRequest.postRequest('execute', {
-      'script': '''
+  WebDriverRequest buildAttributeRequest(String elementId, String name) =>
+      WebDriverRequest.postRequest('execute', {
+        'script': '''
     var attr = arguments[0].attributes["$name"];
     if(attr) {
       return attr.value;
@@ -121,61 +111,52 @@
 
     return null;
     ''',
-      'args': [
-        {jsonWireElementStr: elementId}
-      ]
-    });
-  }
+        'args': [
+          {jsonWireElementStr: elementId}
+        ]
+      });
 
   @override
-  String? parseAttributeResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response)?.toString();
-  }
+  String? parseAttributeResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response)?.toString();
 
   @override
   @deprecated
   WebDriverRequest buildSeleniumAttributeRequest(
-      String elementId, String name) {
-    return WebDriverRequest.getRequest(
-        '${elementPrefix(elementId)}attribute/$name');
-  }
+          String elementId, String name) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}attribute/$name');
 
   @override
   @deprecated
-  String? parseSeleniumAttributeResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response)?.toString();
-  }
+  String? parseSeleniumAttributeResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response)?.toString();
 
   @override
-  WebDriverRequest buildCssPropertyRequest(String elementId, String name) {
-    return WebDriverRequest.postRequest('execute', {
-      'script':
-          'return window.getComputedStyle(arguments[0]).${_cssPropName(name)};',
-      'args': [
-        {jsonWireElementStr: elementId}
-      ]
-    });
-  }
+  WebDriverRequest buildCssPropertyRequest(String elementId, String name) =>
+      WebDriverRequest.postRequest('execute', {
+        'script':
+            'return window.getComputedStyle(arguments[0]).${_cssPropName(name)};',
+        'args': [
+          {jsonWireElementStr: elementId}
+        ]
+      });
 
   @override
-  String? parseCssPropertyResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response)?.toString();
-  }
+  String? parseCssPropertyResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response)?.toString();
 
   @override
-  WebDriverRequest buildPropertyRequest(String elementId, String name) {
-    return WebDriverRequest.postRequest('execute', {
-      'script': 'return arguments[0]["$name"];',
-      'args': [
-        {jsonWireElementStr: elementId}
-      ]
-    });
-  }
+  WebDriverRequest buildPropertyRequest(String elementId, String name) =>
+      WebDriverRequest.postRequest('execute', {
+        'script': 'return arguments[0]["$name"];',
+        'args': [
+          {jsonWireElementStr: elementId}
+        ]
+      });
 
   @override
-  String? parsePropertyResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response)?.toString();
-  }
+  String? parsePropertyResponse(WebDriverResponse response) =>
+      parseJsonWireResponse(response)?.toString();
 
   /// Convert hyphenated-properties to camelCase.
   String _cssPropName(String name) => name.splitMapJoin(RegExp(r'-(\w)'),
diff --git a/lib/src/handler/json_wire/element_finder.dart b/lib/src/handler/json_wire/element_finder.dart
index c340dff..d35add5 100644
--- a/lib/src/handler/json_wire/element_finder.dart
+++ b/lib/src/handler/json_wire/element_finder.dart
@@ -1,7 +1,7 @@
-import 'package:webdriver/src/common/by.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/by.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireElementFinder extends ElementFinder {
   /// Converts [By] instances into JSON params.
@@ -10,40 +10,36 @@
 
   @override
   WebDriverRequest buildFindElementsRequest(By by, [String? contextElementId]) {
-    String uri = contextElementId == null
+    var uri = contextElementId == null
         ? 'elements'
         : 'element/$contextElementId/elements';
     return WebDriverRequest.postRequest(uri, _byToJson(by));
   }
 
   @override
-  List<String> parseFindElementsResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response)
-        .map((e) => e[jsonWireElementStr])
-        .toList()
-        .cast<String>();
-  }
+  List<String> parseFindElementsResponse(WebDriverResponse response) =>
+      (parseJsonWireResponse(response) as List)
+          .map((e) => e[jsonWireElementStr])
+          .toList()
+          .cast<String>();
 
   @override
   WebDriverRequest buildFindElementRequest(By by, [String? contextElementId]) {
-    String uri = contextElementId == null
+    var uri = contextElementId == null
         ? 'element'
         : 'element/$contextElementId/element';
     return WebDriverRequest.postRequest(uri, _byToJson(by));
   }
 
   @override
-  String? parseFindActiveElementResponse(WebDriverResponse response) {
-    return parseJsonWireResponse(response)[jsonWireElementStr];
-  }
+  String? parseFindActiveElementResponse(WebDriverResponse response) =>
+      (parseJsonWireResponse(response) as Map)[jsonWireElementStr] as String?;
 
   @override
-  WebDriverRequest buildFindActiveElementRequest() {
-    return WebDriverRequest.getRequest('element/active');
-  }
+  WebDriverRequest buildFindActiveElementRequest() =>
+      WebDriverRequest.getRequest('element/active');
 
   @override
-  String parseFindElementResponse(WebDriverResponse response) {
-    return (parseJsonWireResponse(response) ?? {})[jsonWireElementStr];
-  }
+  String parseFindElementResponse(WebDriverResponse response) =>
+      (parseJsonWireResponse(response) ?? {})[jsonWireElementStr] as String;
 }
diff --git a/lib/src/handler/json_wire/frame.dart b/lib/src/handler/json_wire/frame.dart
index 1b1da10..b17558b 100644
--- a/lib/src/handler/json_wire/frame.dart
+++ b/lib/src/handler/json_wire/frame.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireFrameHandler extends FrameHandler {
   @override
diff --git a/lib/src/handler/json_wire/keyboard.dart b/lib/src/handler/json_wire/keyboard.dart
index b4f3a93..95ff6eb 100644
--- a/lib/src/handler/json_wire/keyboard.dart
+++ b/lib/src/handler/json_wire/keyboard.dart
@@ -6,16 +6,14 @@
   static const String nullChar = '\uE000';
 
   @override
-  WebDriverRequest buildSendChordRequest(Iterable<String> chordToSend) {
-    return buildSendKeysRequest(_createChord(chordToSend));
-  }
+  WebDriverRequest buildSendChordRequest(Iterable<String> chordToSend) =>
+      buildSendKeysRequest(_createChord(chordToSend));
 
   @override
-  WebDriverRequest buildSendKeysRequest(String keysToSend) {
-    return WebDriverRequest.postRequest('keys', {
-      'value': [keysToSend]
-    });
-  }
+  WebDriverRequest buildSendKeysRequest(String keysToSend) =>
+      WebDriverRequest.postRequest('keys', {
+        'value': [keysToSend]
+      });
 
   @override
   void parseSendKeysResponse(WebDriverResponse response) {
@@ -23,8 +21,8 @@
   }
 
   String _createChord(Iterable<String> chord) {
-    StringBuffer chordString = StringBuffer();
-    for (String s in chord) {
+    var chordString = StringBuffer();
+    for (var s in chord) {
       chordString.write(s);
     }
     chordString.write(nullChar);
diff --git a/lib/src/handler/json_wire/logs.dart b/lib/src/handler/json_wire/logs.dart
index 55f743a..eece349 100644
--- a/lib/src/handler/json_wire/logs.dart
+++ b/lib/src/handler/json_wire/logs.dart
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/log.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/log.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireLogsHandler extends LogsHandler {
   @override
@@ -24,7 +24,7 @@
 
   @override
   List<LogEntry> parseGetLogsResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response)
-          .map<LogEntry>((e) => LogEntry.fromMap(e))
+      (parseJsonWireResponse(response) as List)
+          .map<LogEntry>((e) => LogEntry.fromMap(e as Map))
           .toList();
 }
diff --git a/lib/src/handler/json_wire/mouse.dart b/lib/src/handler/json_wire/mouse.dart
index 20c83fa..ed0fe25 100644
--- a/lib/src/handler/json_wire/mouse.dart
+++ b/lib/src/handler/json_wire/mouse.dart
@@ -1,8 +1,8 @@
-import 'package:webdriver/src/common/exception.dart';
-import 'package:webdriver/src/common/mouse.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/exception.dart';
+import '../../common/mouse.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireMouseHandler extends MouseHandler {
   @override
diff --git a/lib/src/handler/json_wire/navigation.dart b/lib/src/handler/json_wire/navigation.dart
index e481405..b02eabb 100644
--- a/lib/src/handler/json_wire/navigation.dart
+++ b/lib/src/handler/json_wire/navigation.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireNavigationHandler extends NavigationHandler {
   @override
diff --git a/lib/src/handler/json_wire/session.dart b/lib/src/handler/json_wire/session.dart
index f87a61b..5954ec5 100644
--- a/lib/src/handler/json_wire/session.dart
+++ b/lib/src/handler/json_wire/session.dart
@@ -1,9 +1,9 @@
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/session.dart';
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/common/capabilities.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/capabilities.dart';
+import '../../common/request.dart';
+import '../../common/session.dart';
+import '../../common/spec.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireSessionHandler extends SessionHandler {
   @override
@@ -26,6 +26,9 @@
       [String? sessionId]) {
     final session = parseJsonWireResponse(response, valueOnly: false);
     return SessionInfo(
-        session['sessionId'], WebDriverSpec.JsonWire, session['value']);
+      session['sessionId'] as String,
+      WebDriverSpec.JsonWire,
+      session['value'] as Map<String, dynamic>?,
+    );
   }
 }
diff --git a/lib/src/handler/json_wire/timeouts.dart b/lib/src/handler/json_wire/timeouts.dart
index 9ae177c..ee3b7e4 100644
--- a/lib/src/handler/json_wire/timeouts.dart
+++ b/lib/src/handler/json_wire/timeouts.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireTimeoutsHandler extends TimeoutsHandler {
   WebDriverRequest _buildSetTimeoutRequest(String type, Duration timeout) =>
diff --git a/lib/src/handler/json_wire/utils.dart b/lib/src/handler/json_wire/utils.dart
index aedafdf..8d4cd56 100644
--- a/lib/src/handler/json_wire/utils.dart
+++ b/lib/src/handler/json_wire/utils.dart
@@ -1,9 +1,8 @@
 import 'dart:convert';
 
-import 'package:webdriver/src/common/web_element.dart';
-
 import '../../common/exception.dart';
 import '../../common/request.dart';
+import '../../common/web_element.dart';
 
 /// Magic constants -- identifiers indicating a value is an element.
 /// Source: https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
@@ -11,9 +10,9 @@
 
 dynamic parseJsonWireResponse(WebDriverResponse response,
     {bool valueOnly = true}) {
-  Map? responseBody;
+  Map<String, dynamic> responseBody;
   try {
-    responseBody = json.decode(response.body!);
+    responseBody = json.decode(response.body!) as Map<String, dynamic>;
   } catch (e) {
     final rawBody = response.body == null || response.body!.isEmpty
         ? '<empty response>'
@@ -27,7 +26,7 @@
       (responseBody is Map &&
           responseBody['status'] != null &&
           responseBody['status'] != 0)) {
-    final status = responseBody!['status'] as int?;
+    final status = responseBody['status'] as int?;
     final message = responseBody['value']['message'] as String?;
 
     switch (status) {
@@ -105,7 +104,7 @@
 dynamic deserialize(result, dynamic Function(String) createElement) {
   if (result is Map) {
     if (result.containsKey(jsonWireElementStr)) {
-      return createElement(result[jsonWireElementStr]);
+      return createElement(result[jsonWireElementStr] as String);
     } else {
       final newResult = {};
       result.forEach((key, value) {
@@ -128,7 +127,7 @@
   if (obj is Map) {
     final newResult = <String, dynamic>{};
     for (final item in obj.entries) {
-      newResult[item.key] = serialize(item.value);
+      newResult[item.key as String] = serialize(item.value);
     }
 
     return newResult;
diff --git a/lib/src/handler/json_wire/window.dart b/lib/src/handler/json_wire/window.dart
index 323d2ce..cb307a2 100644
--- a/lib/src/handler/json_wire/window.dart
+++ b/lib/src/handler/json_wire/window.dart
@@ -14,9 +14,9 @@
 
 import 'dart:math';
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class JsonWireWindowHandler extends WindowHandler {
   @override
@@ -25,7 +25,7 @@
 
   @override
   List<String> parseGetWindowsResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response).cast<String>();
+      (parseJsonWireResponse(response) as List).cast<String>();
 
   @override
   WebDriverRequest buildGetActiveWindowRequest() =>
@@ -33,7 +33,7 @@
 
   @override
   String parseGetActiveWindowResponse(WebDriverResponse response) =>
-      parseJsonWireResponse(response);
+      parseJsonWireResponse(response) as String;
 
   @override
   WebDriverRequest buildSetActiveRequest(String windowId) =>
@@ -51,7 +51,10 @@
   @override
   Point<int> parseLocationResponse(WebDriverResponse response) {
     final point = parseJsonWireResponse(response);
-    return Point(point['x'].toInt(), point['y'].toInt());
+    return Point(
+      (point['x'] as num).toInt(),
+      (point['y'] as num).toInt(),
+    );
   }
 
   @override
@@ -61,7 +64,12 @@
   @override
   Rectangle<int> parseSizeResponse(WebDriverResponse response) {
     final size = parseJsonWireResponse(response);
-    return Rectangle<int>(0, 0, size['width'].toInt(), size['height'].toInt());
+    return Rectangle<int>(
+      0,
+      0,
+      (size['width'] as num).toInt(),
+      (size['height'] as num).toInt(),
+    );
   }
 
   @override
@@ -140,6 +148,6 @@
   @override
   Rectangle<int> parseInnerSizeResponse(WebDriverResponse response) {
     final size = parseJsonWireResponse(response);
-    return Rectangle(0, 0, size['width'], size['height']);
+    return Rectangle(0, 0, size['width'] as int, size['height'] as int);
   }
 }
diff --git a/lib/src/handler/json_wire_handler.dart b/lib/src/handler/json_wire_handler.dart
index 4bcd061..c29f337 100644
--- a/lib/src/handler/json_wire_handler.dart
+++ b/lib/src/handler/json_wire_handler.dart
@@ -1,21 +1,21 @@
 import 'dart:convert';
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire/alert.dart';
-import 'package:webdriver/src/handler/json_wire/cookies.dart';
-import 'package:webdriver/src/handler/json_wire/core.dart';
-import 'package:webdriver/src/handler/json_wire/element.dart';
-import 'package:webdriver/src/handler/json_wire/element_finder.dart';
-import 'package:webdriver/src/handler/json_wire/frame.dart';
-import 'package:webdriver/src/handler/json_wire/keyboard.dart';
-import 'package:webdriver/src/handler/json_wire/logs.dart';
-import 'package:webdriver/src/handler/json_wire/mouse.dart';
-import 'package:webdriver/src/handler/json_wire/navigation.dart';
-import 'package:webdriver/src/handler/json_wire/session.dart';
-import 'package:webdriver/src/handler/json_wire/timeouts.dart';
-import 'package:webdriver/src/handler/json_wire/utils.dart';
-import 'package:webdriver/src/handler/json_wire/window.dart';
+import '../common/request.dart';
+import '../common/webdriver_handler.dart';
+import 'json_wire/alert.dart';
+import 'json_wire/cookies.dart';
+import 'json_wire/core.dart';
+import 'json_wire/element.dart';
+import 'json_wire/element_finder.dart';
+import 'json_wire/frame.dart';
+import 'json_wire/keyboard.dart';
+import 'json_wire/logs.dart';
+import 'json_wire/mouse.dart';
+import 'json_wire/navigation.dart';
+import 'json_wire/session.dart';
+import 'json_wire/timeouts.dart';
+import 'json_wire/utils.dart';
+import 'json_wire/window.dart';
 
 class JsonWireWebDriverHandler extends WebDriverHandler {
   @override
diff --git a/lib/src/handler/w3c/alert.dart b/lib/src/handler/w3c/alert.dart
index 74c2580..850bcae 100644
--- a/lib/src/handler/w3c/alert.dart
+++ b/lib/src/handler/w3c/alert.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cAlertHandler implements AlertHandler {
   @override
@@ -23,7 +23,7 @@
 
   @override
   String parseGetTextResponse(WebDriverResponse response) =>
-      parseW3cResponse(response);
+      parseW3cResponse(response) as String;
 
   @override
   WebDriverRequest buildAcceptRequest() =>
diff --git a/lib/src/handler/w3c/cookies.dart b/lib/src/handler/w3c/cookies.dart
index c4d1185..33c254a 100644
--- a/lib/src/handler/w3c/cookies.dart
+++ b/lib/src/handler/w3c/cookies.dart
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/cookie.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/cookie.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cCookiesHandler extends CookiesHandler {
   @override
@@ -59,7 +59,7 @@
 
   @override
   List<Cookie> parseGetAllCookiesResponse(WebDriverResponse response) =>
-      parseW3cResponse(response).map<Cookie>(_deserialize).toList();
+      (parseW3cResponse(response) as List).map<Cookie>(_deserialize).toList();
 
   /// Serializes the cookie to json object according to the spec.
   ///
@@ -69,5 +69,6 @@
   /// Deserializes the json object to get the cookie according to the spec.
   ///
   /// The spec is deserializing the same we do in [Cookie.fromJson].
-  Cookie _deserialize(dynamic content) => Cookie.fromJson(content);
+  Cookie _deserialize(dynamic content) =>
+      Cookie.fromJson(content as Map<String, dynamic>);
 }
diff --git a/lib/src/handler/w3c/core.dart b/lib/src/handler/w3c/core.dart
index bf852e8..9a54954 100644
--- a/lib/src/handler/w3c/core.dart
+++ b/lib/src/handler/w3c/core.dart
@@ -1,6 +1,6 @@
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cCoreHandler extends CoreHandler {
   @override
@@ -9,14 +9,14 @@
 
   @override
   String parseCurrentUrlResponse(WebDriverResponse response) =>
-      parseW3cResponse(response);
+      parseW3cResponse(response) as String;
 
   @override
   WebDriverRequest buildTitleRequest() => WebDriverRequest.getRequest('title');
 
   @override
   String parseTitleResponse(WebDriverResponse response) =>
-      parseW3cResponse(response);
+      parseW3cResponse(response) as String;
 
   @override
   WebDriverRequest buildPageSourceRequest() =>
@@ -24,7 +24,7 @@
 
   @override
   String parsePageSourceResponse(WebDriverResponse response) =>
-      parseW3cResponse(response);
+      parseW3cResponse(response) as String;
 
   @override
   WebDriverRequest buildScreenshotRequest() =>
@@ -32,11 +32,11 @@
 
   @override
   WebDriverRequest buildElementScreenshotRequest(String elementId) =>
-      new WebDriverRequest.getRequest('${elementPrefix(elementId)}screenshot');
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}screenshot');
 
   @override
   String parseScreenshotResponse(WebDriverResponse response) =>
-      parseW3cResponse(response);
+      parseW3cResponse(response) as String;
 
   @override
   WebDriverRequest buildExecuteAsyncRequest(String script, List args) =>
diff --git a/lib/src/handler/w3c/element.dart b/lib/src/handler/w3c/element.dart
index 9d84e21..13f21e8 100644
--- a/lib/src/handler/w3c/element.dart
+++ b/lib/src/handler/w3c/element.dart
@@ -1,15 +1,14 @@
 import 'dart:math';
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
 
 import 'utils.dart';
 
 class W3cElementHandler extends ElementHandler {
   @override
-  WebDriverRequest buildClickRequest(String elementId) {
-    return WebDriverRequest.postRequest('${elementPrefix(elementId)}click');
-  }
+  WebDriverRequest buildClickRequest(String elementId) =>
+      WebDriverRequest.postRequest('${elementPrefix(elementId)}click');
 
   @override
   void parseClickResponse(WebDriverResponse response) {
@@ -17,12 +16,11 @@
   }
 
   @override
-  WebDriverRequest buildSendKeysRequest(String elementId, String keysToSend) {
-    return WebDriverRequest.postRequest('${elementPrefix(elementId)}value', {
-      'text': keysToSend, // What geckodriver really wants.
-      'value': keysToSend // Actual W3C spec.
-    });
-  }
+  WebDriverRequest buildSendKeysRequest(String elementId, String keysToSend) =>
+      WebDriverRequest.postRequest('${elementPrefix(elementId)}value', {
+        'text': keysToSend, // What geckodriver really wants.
+        'value': keysToSend // Actual W3C spec.
+      });
 
   @override
   void parseSendKeysResponse(WebDriverResponse response) {
@@ -30,9 +28,8 @@
   }
 
   @override
-  WebDriverRequest buildClearRequest(String elementId) {
-    return WebDriverRequest.postRequest('${elementPrefix(elementId)}clear');
-  }
+  WebDriverRequest buildClearRequest(String elementId) =>
+      WebDriverRequest.postRequest('${elementPrefix(elementId)}clear');
 
   @override
   void parseClearResponse(WebDriverResponse response) {
@@ -40,49 +37,40 @@
   }
 
   @override
-  WebDriverRequest buildSelectedRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}selected');
-  }
+  WebDriverRequest buildSelectedRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}selected');
 
   @override
-  bool parseSelectedResponse(WebDriverResponse response) {
-    return parseW3cResponse(response);
-  }
+  bool parseSelectedResponse(WebDriverResponse response) =>
+      parseW3cResponse(response) as bool;
 
   @override
-  WebDriverRequest buildEnabledRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}enabled');
-  }
+  WebDriverRequest buildEnabledRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}enabled');
 
   @override
-  bool parseEnabledResponse(WebDriverResponse response) {
-    return parseW3cResponse(response);
-  }
+  bool parseEnabledResponse(WebDriverResponse response) =>
+      parseW3cResponse(response) as bool;
 
   @override
-  WebDriverRequest buildDisplayedRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}displayed');
-  }
+  WebDriverRequest buildDisplayedRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}displayed');
 
   @override
-  bool parseDisplayedResponse(WebDriverResponse response) {
-    return parseW3cResponse(response);
-  }
+  bool parseDisplayedResponse(WebDriverResponse response) =>
+      parseW3cResponse(response) as bool;
 
   @override
-  WebDriverRequest buildLocationRequest(String elementId) {
-    return _buildRectRequest(elementId);
-  }
+  WebDriverRequest buildLocationRequest(String elementId) =>
+      _buildRectRequest(elementId);
 
   @override
-  Point<int> parseLocationResponse(WebDriverResponse response) {
-    return _parseRectResponse(response).topLeft;
-  }
+  Point<int> parseLocationResponse(WebDriverResponse response) =>
+      _parseRectResponse(response).topLeft;
 
   @override
-  WebDriverRequest buildSizeRequest(String elementId) {
-    return _buildRectRequest(elementId);
-  }
+  WebDriverRequest buildSizeRequest(String elementId) =>
+      _buildRectRequest(elementId);
 
   @override
   Rectangle<int> parseSizeResponse(WebDriverResponse response) {
@@ -90,79 +78,67 @@
     return Rectangle(0, 0, rect.width, rect.height);
   }
 
-  WebDriverRequest _buildRectRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}rect');
-  }
+  WebDriverRequest _buildRectRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}rect');
 
   Rectangle<int> _parseRectResponse(WebDriverResponse response) {
     final rect = parseW3cResponse(response);
-    return Rectangle(rect['x'].toInt(), rect['y'].toInt(),
-        rect['width'].toInt(), rect['height'].toInt());
+    return Rectangle(
+      (rect['x'] as num).toInt(),
+      (rect['y'] as num).toInt(),
+      (rect['width'] as num).toInt(),
+      (rect['height'] as num).toInt(),
+    );
   }
 
   @override
-  WebDriverRequest buildNameRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}name');
-  }
+  WebDriverRequest buildNameRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}name');
 
   @override
-  String parseNameResponse(WebDriverResponse response) {
-    return parseW3cResponse(response);
-  }
+  String parseNameResponse(WebDriverResponse response) =>
+      parseW3cResponse(response) as String;
 
   @override
-  WebDriverRequest buildTextRequest(String elementId) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}text');
-  }
+  WebDriverRequest buildTextRequest(String elementId) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}text');
 
   @override
-  String parseTextResponse(WebDriverResponse response) {
-    return parseW3cResponse(response);
-  }
+  String parseTextResponse(WebDriverResponse response) =>
+      parseW3cResponse(response) as String;
 
   @override
-  WebDriverRequest buildAttributeRequest(String elementId, String name) {
-    return WebDriverRequest.getRequest(
-        '${elementPrefix(elementId)}attribute/$name');
-  }
+  WebDriverRequest buildAttributeRequest(String elementId, String name) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}attribute/$name');
 
   @override
-  String? parseAttributeResponse(WebDriverResponse response) {
-    return parseW3cResponse(response)?.toString();
-  }
+  String? parseAttributeResponse(WebDriverResponse response) =>
+      parseW3cResponse(response)?.toString();
 
   @override
   @deprecated
   WebDriverRequest buildSeleniumAttributeRequest(
-      String elementId, String name) {
-    return WebDriverRequest.getRequest(
-        '${elementPrefix(elementId)}attribute/$name');
-  }
+          String elementId, String name) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}attribute/$name');
 
   @override
   @deprecated
-  String? parseSeleniumAttributeResponse(WebDriverResponse response) {
-    return parseW3cResponse(response)?.toString();
-  }
+  String? parseSeleniumAttributeResponse(WebDriverResponse response) =>
+      parseW3cResponse(response)?.toString();
 
   @override
-  WebDriverRequest buildCssPropertyRequest(String elementId, String name) {
-    return WebDriverRequest.getRequest('${elementPrefix(elementId)}css/$name');
-  }
+  WebDriverRequest buildCssPropertyRequest(String elementId, String name) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}css/$name');
 
   @override
-  String? parseCssPropertyResponse(WebDriverResponse response) {
-    return parseW3cResponse(response)?.toString();
-  }
+  String? parseCssPropertyResponse(WebDriverResponse response) =>
+      parseW3cResponse(response)?.toString();
 
   @override
-  WebDriverRequest buildPropertyRequest(String elementId, String name) {
-    return WebDriverRequest.getRequest(
-        '${elementPrefix(elementId)}property/$name');
-  }
+  WebDriverRequest buildPropertyRequest(String elementId, String name) =>
+      WebDriverRequest.getRequest('${elementPrefix(elementId)}property/$name');
 
   @override
-  String? parsePropertyResponse(WebDriverResponse response) {
-    return parseW3cResponse(response)?.toString();
-  }
+  String? parsePropertyResponse(WebDriverResponse response) =>
+      parseW3cResponse(response)?.toString();
 }
diff --git a/lib/src/handler/w3c/element_finder.dart b/lib/src/handler/w3c/element_finder.dart
index 5ce6769..02578b5 100644
--- a/lib/src/handler/w3c/element_finder.dart
+++ b/lib/src/handler/w3c/element_finder.dart
@@ -1,7 +1,7 @@
-import 'package:webdriver/src/common/by.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/by.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cElementFinder extends ElementFinder {
   /// Here we massage [By] instances into viable W3C /element requests.
@@ -40,35 +40,31 @@
 
   @override
   WebDriverRequest buildFindElementsRequest(By by, [String? contextElementId]) {
-    String uri = '${elementPrefix(contextElementId)}elements';
+    var uri = '${elementPrefix(contextElementId)}elements';
     return WebDriverRequest.postRequest(uri, _byToJson(by));
   }
 
   @override
-  List<String> parseFindElementsResponse(WebDriverResponse response) {
-    return (parseW3cResponse(response) as List)
-        .map<String>((e) => e[w3cElementStr]!)
-        .toList();
-  }
+  List<String> parseFindElementsResponse(WebDriverResponse response) =>
+      (parseW3cResponse(response) as List)
+          .map<String>((e) => e[w3cElementStr] as String)
+          .toList();
 
   @override
   WebDriverRequest buildFindElementRequest(By by, [String? contextElementId]) {
-    String uri = '${elementPrefix(contextElementId)}element';
+    var uri = '${elementPrefix(contextElementId)}element';
     return WebDriverRequest.postRequest(uri, _byToJson(by));
   }
 
   @override
-  String? parseFindActiveElementResponse(WebDriverResponse response) {
-    return parseW3cResponse(response)[w3cElementStr];
-  }
+  String? parseFindActiveElementResponse(WebDriverResponse response) =>
+      parseW3cResponse(response)[w3cElementStr] as String;
 
   @override
-  WebDriverRequest buildFindActiveElementRequest() {
-    return WebDriverRequest.getRequest('element/active');
-  }
+  WebDriverRequest buildFindActiveElementRequest() =>
+      WebDriverRequest.getRequest('element/active');
 
   @override
-  String parseFindElementResponse(WebDriverResponse response) {
-    return (parseW3cResponse(response) ?? {})[w3cElementStr];
-  }
+  String parseFindElementResponse(WebDriverResponse response) =>
+      (parseW3cResponse(response) ?? {})[w3cElementStr] as String;
 }
diff --git a/lib/src/handler/w3c/frame.dart b/lib/src/handler/w3c/frame.dart
index 19ab343..3449987 100644
--- a/lib/src/handler/w3c/frame.dart
+++ b/lib/src/handler/w3c/frame.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cFrameHandler extends FrameHandler {
   @override
diff --git a/lib/src/handler/w3c/keyboard.dart b/lib/src/handler/w3c/keyboard.dart
index e957e18..cf27de6 100644
--- a/lib/src/handler/w3c/keyboard.dart
+++ b/lib/src/handler/w3c/keyboard.dart
@@ -7,7 +7,7 @@
   WebDriverRequest buildSendChordRequest(Iterable<String> chordToSend) {
     final keyDownActions = <Map<String, String>>[];
     final keyUpActions = <Map<String, String>>[];
-    for (String s in chordToSend) {
+    for (var s in chordToSend) {
       keyDownActions.add({'type': 'keyDown', 'value': s});
       keyUpActions.add({'type': 'keyUp', 'value': s});
     }
@@ -32,7 +32,7 @@
   @override
   WebDriverRequest buildSendKeysRequest(String keysToSend) {
     final keyActions = <Map<String, String>>[];
-    for (int i = 0; i < keysToSend.length; ++i) {
+    for (var i = 0; i < keysToSend.length; ++i) {
       keyActions.add({'type': 'keyDown', 'value': keysToSend[i]});
       keyActions.add({'type': 'keyUp', 'value': keysToSend[i]});
     }
diff --git a/lib/src/handler/w3c/mouse.dart b/lib/src/handler/w3c/mouse.dart
index 58de698..ecdfa87 100644
--- a/lib/src/handler/w3c/mouse.dart
+++ b/lib/src/handler/w3c/mouse.dart
@@ -1,7 +1,7 @@
-import 'package:webdriver/src/common/mouse.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/mouse.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cMouseHandler extends MouseHandler {
   @override
diff --git a/lib/src/handler/w3c/navigation.dart b/lib/src/handler/w3c/navigation.dart
index 12c3b1b..7deba88 100644
--- a/lib/src/handler/w3c/navigation.dart
+++ b/lib/src/handler/w3c/navigation.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cNavigationHandler extends NavigationHandler {
   @override
diff --git a/lib/src/handler/w3c/session.dart b/lib/src/handler/w3c/session.dart
index cd3e239..ba36d77 100644
--- a/lib/src/handler/w3c/session.dart
+++ b/lib/src/handler/w3c/session.dart
@@ -1,9 +1,9 @@
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/session.dart';
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/common/capabilities.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/capabilities.dart';
+import '../../common/request.dart';
+import '../../common/session.dart';
+import '../../common/spec.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cSessionHandler extends SessionHandler {
   @override
@@ -18,7 +18,10 @@
   SessionInfo parseCreateResponse(WebDriverResponse response) {
     final session = parseW3cResponse(response);
     return SessionInfo(
-        session['sessionId'], WebDriverSpec.W3c, session['capabilities']);
+      session['sessionId'] as String,
+      WebDriverSpec.W3c,
+      session['capabilities'] as Map<String, dynamic>,
+    );
   }
 
   /// Requesting existing session info is not supported in W3c.
@@ -27,7 +30,9 @@
       WebDriverRequest.nullRequest(id);
 
   @override
-  SessionInfo parseInfoResponse(WebDriverResponse response,
-          [String? sessionId]) =>
+  SessionInfo parseInfoResponse(
+    WebDriverResponse response, [
+    String? sessionId,
+  ]) =>
       SessionInfo(response.body!, WebDriverSpec.W3c, Capabilities.empty);
 }
diff --git a/lib/src/handler/w3c/timeouts.dart b/lib/src/handler/w3c/timeouts.dart
index 7efff02..724d277 100644
--- a/lib/src/handler/w3c/timeouts.dart
+++ b/lib/src/handler/w3c/timeouts.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cTimeoutsHandler extends TimeoutsHandler {
   WebDriverRequest _buildSetTimeoutRequest(String type, Duration timeout) =>
diff --git a/lib/src/handler/w3c/utils.dart b/lib/src/handler/w3c/utils.dart
index 2d367a0..3e72081 100644
--- a/lib/src/handler/w3c/utils.dart
+++ b/lib/src/handler/w3c/utils.dart
@@ -1,18 +1,17 @@
 import 'dart:convert';
 
-import 'package:webdriver/src/common/web_element.dart';
-
 import '../../common/exception.dart';
 import '../../common/request.dart';
+import '../../common/web_element.dart';
 
 // Source: https://www.w3.org/TR/webdriver/#elements
 const String w3cElementStr = 'element-6066-11e4-a52e-4f735466cecf';
 
 dynamic parseW3cResponse(WebDriverResponse response) {
-  final int statusCode = response.statusCode!;
-  Map? responseBody;
+  final statusCode = response.statusCode!;
+  Map responseBody;
   try {
-    responseBody = json.decode(response.body!);
+    responseBody = json.decode(response.body!) as Map;
   } catch (e) {
     final rawBody = response.body == null || response.body!.isEmpty
         ? '<empty response>'
@@ -22,8 +21,8 @@
   }
 
   if (statusCode < 200 || statusCode > 299) {
-    final Map value = responseBody!['value'];
-    final String? message = value['message'];
+    final value = responseBody['value'] as Map;
+    final message = value['message'] as String?;
 
     // See https://www.w3.org/TR/webdriver/#handling-errors
     switch (value['error']) {
@@ -110,7 +109,7 @@
     }
   }
 
-  return responseBody == null ? null : responseBody['value'];
+  return responseBody['value'];
 }
 
 /// Prefix to represent element in webdriver uri.
@@ -122,7 +121,7 @@
 dynamic deserialize(result, dynamic Function(String) createElement) {
   if (result is Map) {
     if (result.containsKey(w3cElementStr)) {
-      return createElement(result[w3cElementStr]);
+      return createElement(result[w3cElementStr] as String);
     } else {
       final newResult = {};
       result.forEach((key, value) {
@@ -145,7 +144,7 @@
   if (obj is Map) {
     final newResult = <String, dynamic>{};
     for (final item in obj.entries) {
-      newResult[item.key] = serialize(item.value);
+      newResult[item.key as String] = serialize(item.value);
     }
 
     return newResult;
diff --git a/lib/src/handler/w3c/window.dart b/lib/src/handler/w3c/window.dart
index 9b1829a..f4802e6 100644
--- a/lib/src/handler/w3c/window.dart
+++ b/lib/src/handler/w3c/window.dart
@@ -14,9 +14,9 @@
 
 import 'dart:math';
 
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
+import '../../common/request.dart';
+import '../../common/webdriver_handler.dart';
+import 'utils.dart';
 
 class W3cWindowHandler extends WindowHandler {
   @override
@@ -25,7 +25,7 @@
 
   @override
   List<String> parseGetWindowsResponse(WebDriverResponse response) =>
-      parseW3cResponse(response).cast<String>();
+      (parseW3cResponse(response) as List).cast<String>();
 
   @override
   WebDriverRequest buildGetActiveWindowRequest() =>
@@ -33,7 +33,7 @@
 
   @override
   String parseGetActiveWindowResponse(WebDriverResponse response) =>
-      parseW3cResponse(response);
+      parseW3cResponse(response) as String;
 
   @override
   WebDriverRequest buildSetActiveRequest(String windowId) =>
@@ -67,14 +67,20 @@
   @override
   Rectangle<int> parseRectResponse(WebDriverResponse response) {
     final rect = parseW3cResponse(response);
-    return Rectangle(rect['x'].toInt(), rect['y'].toInt(),
-        rect['width'].toInt(), rect['height'].toInt());
+    return Rectangle(
+      (rect['x'] as num).toInt(),
+      (rect['y'] as num).toInt(),
+      (rect['width'] as num).toInt(),
+      (rect['height'] as num).toInt(),
+    );
   }
 
   @override
   WebDriverRequest buildSetLocationRequest(Point<int> location) =>
-      WebDriverRequest.postRequest(
-          'window/rect', {'x': location.x, 'y': location.y});
+      WebDriverRequest.postRequest('window/rect', {
+        'x': location.x,
+        'y': location.y,
+      });
 
   @override
   void parseSetLocationResponse(WebDriverResponse response) {
@@ -143,6 +149,6 @@
   @override
   Rectangle<int> parseInnerSizeResponse(WebDriverResponse response) {
     final size = parseW3cResponse(response);
-    return Rectangle(0, 0, size['width'], size['height']);
+    return Rectangle(0, 0, size['width'] as int, size['height'] as int);
   }
 }
diff --git a/lib/src/handler/w3c_handler.dart b/lib/src/handler/w3c_handler.dart
index 913a778..82c94c8 100644
--- a/lib/src/handler/w3c_handler.dart
+++ b/lib/src/handler/w3c_handler.dart
@@ -1,21 +1,21 @@
 import 'dart:convert';
 
-import 'package:webdriver/src/common/log.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/w3c/alert.dart';
-import 'package:webdriver/src/handler/w3c/cookies.dart';
-import 'package:webdriver/src/handler/w3c/core.dart';
-import 'package:webdriver/src/handler/w3c/element.dart';
-import 'package:webdriver/src/handler/w3c/element_finder.dart';
-import 'package:webdriver/src/handler/w3c/frame.dart';
-import 'package:webdriver/src/handler/w3c/keyboard.dart';
-import 'package:webdriver/src/handler/w3c/mouse.dart';
-import 'package:webdriver/src/handler/w3c/navigation.dart';
-import 'package:webdriver/src/handler/w3c/session.dart';
-import 'package:webdriver/src/handler/w3c/timeouts.dart';
-import 'package:webdriver/src/handler/w3c/utils.dart';
-import 'package:webdriver/src/handler/w3c/window.dart';
+import '../common/log.dart';
+import '../common/request.dart';
+import '../common/webdriver_handler.dart';
+import 'w3c/alert.dart';
+import 'w3c/cookies.dart';
+import 'w3c/core.dart';
+import 'w3c/element.dart';
+import 'w3c/element_finder.dart';
+import 'w3c/frame.dart';
+import 'w3c/keyboard.dart';
+import 'w3c/mouse.dart';
+import 'w3c/navigation.dart';
+import 'w3c/session.dart';
+import 'w3c/timeouts.dart';
+import 'w3c/utils.dart';
+import 'w3c/window.dart';
 
 class W3cWebDriverHandler extends WebDriverHandler {
   @override
@@ -79,7 +79,7 @@
 
   @override
   List<LogEntry> parseGetLogsResponse(WebDriverResponse response) =>
-      parseW3cResponse(response)
-          .map<LogEntry>((e) => LogEntry.fromMap(e))
+      (parseW3cResponse(response) as List)
+          .map<LogEntry>((e) => LogEntry.fromMap(e as Map))
           .toList();
 }
diff --git a/lib/src/request/async_io_request_client.dart b/lib/src/request/async_io_request_client.dart
index a14850f..02bd2c2 100644
--- a/lib/src/request/async_io_request_client.dart
+++ b/lib/src/request/async_io_request_client.dart
@@ -2,7 +2,7 @@
 import 'dart:convert';
 import 'dart:io' show ContentType, HttpClient, HttpHeaders, HttpClientRequest;
 
-import 'package:webdriver/support/async.dart';
+import '../../support/async.dart';
 
 import '../common/request.dart';
 import '../common/request_client.dart';
diff --git a/lib/src/request/async_xhr_request_client.dart b/lib/src/request/async_xhr_request_client.dart
index 41d18ca..f3464b2 100644
--- a/lib/src/request/async_xhr_request_client.dart
+++ b/lib/src/request/async_xhr_request_client.dart
@@ -1,7 +1,7 @@
 import 'dart:async';
 import 'dart:html';
 
-import 'package:webdriver/support/async.dart';
+import '../../support/async.dart';
 
 import '../common/request.dart';
 import '../common/request_client.dart';
@@ -42,7 +42,10 @@
     }
 
     return WebDriverResponse(
-        httpRequest.status, httpRequest.statusText, httpRequest.response);
+      httpRequest.status,
+      httpRequest.statusText,
+      httpRequest.response as String?,
+    );
   }
 
   @override
diff --git a/lib/src/sync/alert.dart b/lib/src/sync/alert.dart
index c2e62ab..6d7d7c4 100644
--- a/lib/src/sync/alert.dart
+++ b/lib/src/sync/alert.dart
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 /// A JavaScript alert(), confirm(), or prompt() dialog.
 class Alert {
diff --git a/lib/src/sync/common.dart b/lib/src/sync/common.dart
index 0255a44..fb3a0da 100644
--- a/lib/src/sync/common.dart
+++ b/lib/src/sync/common.dart
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/async_core.dart' as async_core;
-import 'package:webdriver/src/common/by.dart';
+import '../../async_core.dart' as async_core;
+import '../common/by.dart';
 
 import 'web_driver.dart';
 import 'web_element.dart';
diff --git a/lib/src/sync/common_io.dart b/lib/src/sync/common_io.dart
index 0467982..ee3b008 100644
--- a/lib/src/sync/common_io.dart
+++ b/lib/src/sync/common_io.dart
@@ -1,6 +1,5 @@
-import 'package:webdriver/src/request/async_io_request_client.dart';
-import 'package:webdriver/async_core.dart' as async_core;
-
+import '../../async_core.dart' as async_core;
+import '../request/async_io_request_client.dart';
 import 'web_driver.dart';
 import 'web_element.dart';
 
diff --git a/lib/src/sync/common_stub.dart b/lib/src/sync/common_stub.dart
index 59c1a93..834bbbb 100644
--- a/lib/src/sync/common_stub.dart
+++ b/lib/src/sync/common_stub.dart
@@ -1,4 +1,4 @@
-import 'package:webdriver/async_core.dart' as async_core;
+import '../../async_core.dart' as async_core;
 
 import 'web_driver.dart';
 import 'web_element.dart';
diff --git a/lib/src/sync/cookies.dart b/lib/src/sync/cookies.dart
index a5586ee..0653070 100644
--- a/lib/src/sync/cookies.dart
+++ b/lib/src/sync/cookies.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/cookie.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/cookie.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 /// Interacts with browser's cookies.
 class Cookies {
diff --git a/lib/src/sync/logs.dart b/lib/src/sync/logs.dart
index 4a51473..c00ad2d 100644
--- a/lib/src/sync/logs.dart
+++ b/lib/src/sync/logs.dart
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/exception.dart';
-import 'package:webdriver/src/common/log.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/exception.dart';
+import '../common/log.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 class Logs {
   final SyncRequestClient _client;
diff --git a/lib/src/sync/mouse.dart b/lib/src/sync/mouse.dart
index 481a2b0..77b9a2f 100644
--- a/lib/src/sync/mouse.dart
+++ b/lib/src/sync/mouse.dart
@@ -12,11 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/mouse.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/handler/json_wire_handler.dart';
-import 'package:webdriver/src/handler/w3c_handler.dart';
+import '../common/mouse.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
+import '../handler/json_wire_handler.dart';
+import '../handler/w3c_handler.dart';
 
 import 'web_element.dart';
 
diff --git a/lib/src/sync/target_locator.dart b/lib/src/sync/target_locator.dart
index 9926f1b..1ecb7bf 100644
--- a/lib/src/sync/target_locator.dart
+++ b/lib/src/sync/target_locator.dart
@@ -12,9 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/by.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/by.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 import 'alert.dart';
 import 'web_driver.dart';
@@ -39,7 +39,7 @@
   ///
   ///   Throws [NoSuchFrameException] if the specified frame can't be found.
   void frame([/* int | WebElement | String */ frame]) {
-    if (frame == null || frame is int) {
+    if (frame is int?) {
       _client.send(_handler.frame.buildSwitchByIdRequest(frame),
           _handler.frame.parseSwitchByIdResponse);
     } else if (frame is WebElement) {
diff --git a/lib/src/sync/timeouts.dart b/lib/src/sync/timeouts.dart
index 8587722..bd35e1f 100644
--- a/lib/src/sync/timeouts.dart
+++ b/lib/src/sync/timeouts.dart
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 /// Sets WebDriver timeouts.
 class Timeouts {
diff --git a/lib/src/sync/web_driver.dart b/lib/src/sync/web_driver.dart
index 5cee3df..004e306 100644
--- a/lib/src/sync/web_driver.dart
+++ b/lib/src/sync/web_driver.dart
@@ -14,27 +14,27 @@
 
 import 'dart:convert' show base64;
 
-import 'package:webdriver/async_core.dart' as async_core;
-import 'package:webdriver/src/common/by.dart';
-import 'package:webdriver/src/common/request.dart';
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/utils.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/sync/common.dart';
-import 'package:webdriver/src/sync/cookies.dart';
-import 'package:webdriver/src/sync/keyboard.dart';
-import 'package:webdriver/src/sync/logs.dart';
-import 'package:webdriver/src/sync/mouse.dart';
-import 'package:webdriver/src/sync/target_locator.dart';
-import 'package:webdriver/src/sync/timeouts.dart';
-import 'package:webdriver/src/sync/web_element.dart';
-import 'package:webdriver/src/sync/window.dart';
+import '../../async_core.dart' as async_core;
+import '../common/by.dart';
+import '../common/request.dart';
+import '../common/request_client.dart';
+import '../common/spec.dart';
+import '../common/utils.dart';
+import '../common/webdriver_handler.dart';
+import 'common.dart';
 
 // ignore: uri_does_not_exist
 import 'common_stub.dart'
-    // ignore: uri_does_not_exist
+// ignore: uri_does_not_exist
     if (dart.library.io) 'common_io.dart';
+import 'cookies.dart';
+import 'keyboard.dart';
+import 'logs.dart';
+import 'mouse.dart';
+import 'target_locator.dart';
+import 'timeouts.dart';
+import 'web_element.dart';
+import 'window.dart';
 
 /// Interacts with WebDriver.
 class WebDriver implements SearchContext {
@@ -51,7 +51,7 @@
   final Uri uri;
 
   WebDriver(this.uri, this.id, this.capabilities, this._client, this.spec)
-      : this._handler = getHandler(spec);
+      : _handler = getHandler(spec);
 
   /// Produces a [async_core.WebDriver] with the same session ID. Allows
   /// backwards compatibility with other frameworks.
@@ -73,8 +73,9 @@
   /// Navigates to the specified url
   void get(/* Uri | String */ url) {
     _client.send(
-        _handler.navigation
-            .buildNavigateToRequest((url is Uri) ? url.toString() : url),
+        _handler.navigation.buildNavigateToRequest(
+          (url is Uri) ? url.toString() : url as String,
+        ),
         _handler.navigation.parseNavigateToResponse);
   }
 
@@ -108,7 +109,7 @@
         _handler.elementFinder.parseFindElementsResponse);
 
     final elements = <WebElement>[];
-    int i = 0;
+    var i = 0;
     for (final id in ids) {
       elements.add(WebElement(this, _client, _handler, id, this, by, i++));
     }
@@ -288,12 +289,28 @@
   ///
   /// For use by supporting WebDriver packages.
   dynamic deleteRequest(String command) => _client.send(
-      _handler.buildGeneralRequest(HttpMethod.httpDelete, command),
-      (response) => _handler.parseGeneralResponse(
-          response, (elementId) => getElement(elementId, this)));
+        _handler.buildGeneralRequest(HttpMethod.httpDelete, command),
+        (response) => _handler.parseGeneralResponse(
+          response,
+          (elementId) => getElement(elementId, this),
+        ),
+      );
 
-  WebElement getElement(String elementId, [context, locator, index]) =>
-      WebElement(this, _client, _handler, elementId, context, locator, index);
+  WebElement getElement(
+    String elementId, [
+    SearchContext? context,
+    locator,
+    int? index,
+  ]) =>
+      WebElement(
+        this,
+        _client,
+        _handler,
+        elementId,
+        context,
+        locator,
+        index,
+      );
 
   @override
   WebDriver get driver => this;
diff --git a/lib/src/sync/web_element.dart b/lib/src/sync/web_element.dart
index 9c8d9c8..5f3ffe5 100644
--- a/lib/src/sync/web_element.dart
+++ b/lib/src/sync/web_element.dart
@@ -14,19 +14,18 @@
 
 import 'dart:math' show Point, Rectangle;
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
-import 'package:webdriver/src/common/web_element.dart' as common;
-
 import '../../async_core.dart' as async_core;
 import '../common/by.dart';
+import '../common/request_client.dart';
+import '../common/web_element.dart' as common;
+import '../common/webdriver_handler.dart';
 import 'common.dart';
-import 'web_driver.dart';
 
 // ignore: uri_does_not_exist
 import 'common_stub.dart'
 // ignore: uri_does_not_exist
     if (dart.library.io) 'common_io.dart';
+import 'web_driver.dart';
 
 /// WebDriver representation and interactions with an HTML element.
 class WebElement extends common.WebElement implements SearchContext {
@@ -57,8 +56,15 @@
   /// used to find this element always returns one element, then this is null.
   final int? index;
 
-  WebElement(this.driver, this._client, this._handler, this.id,
-      [this.context, this.locator, this.index]);
+  WebElement(
+    this.driver,
+    this._client,
+    this._handler,
+    this.id, [
+    this.context,
+    this.locator,
+    this.index,
+  ]);
 
   WebElement get parent => WebElement(
         driver,
@@ -74,7 +80,7 @@
 
   /// Gets a chain of parent elements, including the element itself.
   List<String> get parents {
-    WebElement p = this;
+    var p = this;
     final result = <String>[];
     while (p.id != null) {
       var id = p.id;
@@ -175,7 +181,7 @@
         _handler.elementFinder.parseFindElementsResponse);
 
     final elements = <WebElement>[];
-    int i = 0;
+    var i = 0;
     for (final id in ids) {
       elements.add(WebElement(driver, _client, _handler, id, this, by, i++));
     }
@@ -200,14 +206,14 @@
 
   /// Are these two elements the same underlying element in the DOM.
   bool equals(WebElement other) =>
-      other is WebElement && other.driver == this.driver && other.id == this.id;
+      other is WebElement && other.driver == driver && other.id == id;
 
   @override
   int get hashCode => driver.hashCode * 3 + id.hashCode;
 
   @override
   bool operator ==(other) =>
-      other is WebElement && other.driver == this.driver && other.id == this.id;
+      other is WebElement && other.driver == driver && other.id == id;
 
   @override
   String toString() {
diff --git a/lib/src/sync/window.dart b/lib/src/sync/window.dart
index 3cdfba3..1002f7e 100644
--- a/lib/src/sync/window.dart
+++ b/lib/src/sync/window.dart
@@ -14,8 +14,8 @@
 
 import 'dart:math' show Point, Rectangle;
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/webdriver_handler.dart';
+import '../common/request_client.dart';
+import '../common/webdriver_handler.dart';
 
 /// Handle to window.
 ///
@@ -65,7 +65,7 @@
   ///
   /// TODO(jingbian): Remove this, prefer setter.
   void setLocation(Point<int> point) {
-    this.location = point;
+    location = point;
   }
 
   /// Sets the window location.
@@ -127,9 +127,9 @@
   @override
   bool operator ==(other) =>
       other is Window &&
-      other._client == this._client &&
-      other._handler == this._handler &&
-      other.id == this.id;
+      other._client == _client &&
+      other._handler == _handler &&
+      other.id == id;
 
   @override
   String toString() => '$_handler.windows($_client)[$id]';
diff --git a/lib/support/async.dart b/lib/support/async.dart
index 2f71642..5111713 100644
--- a/lib/support/async.dart
+++ b/lib/support/async.dart
@@ -24,7 +24,7 @@
 
 const clock = Clock();
 
-Future<T?> waitFor<T>(FutureOr<T> condition(),
+Future<T?> waitFor<T>(FutureOr<T> Function() condition,
         {matcher,
         Duration timeout = defaultTimeout,
         Duration interval = defaultInterval}) =>
@@ -49,15 +49,15 @@
   /// is returned. Otherwise, if [condition] throws, then that exception is
   /// rethrown. If [condition] doesn't throw then an [expect] exception is
   /// thrown.
-  Future<T?> waitFor<T>(FutureOr<T>? condition(),
+  Future<T?> waitFor<T>(FutureOr<T>? Function() condition,
       {matcher,
       Duration timeout = defaultTimeout,
       Duration interval = defaultInterval}) async {
-    m.Matcher? mMatcher = matcher == null ? null : m.wrapMatcher(matcher);
+    var mMatcher = matcher == null ? null : m.wrapMatcher(matcher);
     var endTime = now.add(timeout);
     while (true) {
       try {
-        T? value = await condition();
+        var value = await condition();
         if (mMatcher != null) {
           _matcherExpect(value, mMatcher);
         }
diff --git a/lib/support/firefox_profile.dart b/lib/support/firefox_profile.dart
index ed3b4ff..370c7a0 100644
--- a/lib/support/firefox_profile.dart
+++ b/lib/support/firefox_profile.dart
@@ -12,10 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// We should migrate this file to Null Safety once package:archive is migrated,
-// but for now annotate it with the older language version.
-// @dart = 2.9
-
 library webdriver.support.firefox_profile;
 
 import 'dart:collection';
@@ -103,7 +99,7 @@
 /// Creates a Firefox profile in a format so it can be passed using the
 /// `desired` capabilities map.
 class FirefoxProfile {
-  final io.Directory profileDirectory;
+  final io.Directory? profileDirectory;
 
   Set<PrefsOption> _prefs = <PrefsOption>{};
 
@@ -135,13 +131,13 @@
     _userPrefs.addAll(defaultUserPrefs);
     if (profileDirectory != null) {
       final prefsFile =
-          io.File(path.join(profileDirectory.absolute.path, 'prefs.js'));
+          io.File(path.join(profileDirectory!.absolute.path, 'prefs.js'));
       if (prefsFile.existsSync()) {
         _prefs = loadPrefsFile(prefsFile);
       }
 
       final userPrefsFile =
-          io.File(path.join(profileDirectory.absolute.path, 'user.js'));
+          io.File(path.join(profileDirectory!.absolute.path, 'user.js'));
       if (userPrefsFile.existsSync()) {
         _userPrefs = loadPrefsFile(userPrefsFile)
             .where((option) => !lockedPrefs.contains(option))
@@ -181,7 +177,6 @@
 
   /// Helper for [loadPrefsFile]
   static bool _ignoreLine(String line) {
-    line ??= '';
     line = line.trim();
     if (line.isEmpty ||
         line.startsWith('//') ||
@@ -202,7 +197,7 @@
     final prefs = <PrefsOption>{};
     final lines = LineSplitter.split(file.readAsStringSync())
         .where((line) => !_ignoreLine(line));
-    bool canNotParseCaption = true;
+    var canNotParseCaption = true;
 
     for (final line in lines) {
       final option = PrefsOption.parse(line);
@@ -227,11 +222,11 @@
   /// It can be uses like
   /// `var desired = Capabilities.firefox..addAll(firefoxProfile.toJson()}`
   Map<String, dynamic> toJson() {
-    Archive archive = Archive();
+    var archive = Archive();
     if (profileDirectory != null) {
-      profileDirectory.listSync(recursive: true).forEach((f) {
+      profileDirectory!.listSync(recursive: true).forEach((f) {
         ArchiveFile archiveFile;
-        final name = path.relative(f.path, from: profileDirectory.path);
+        final name = path.relative(f.path, from: profileDirectory!.path);
         if (f is io.Directory) {
           archiveFile = ArchiveFile('$name/', 0, <int>[]);
         } else if (f is io.File) {
@@ -257,7 +252,7 @@
     archive
         .addFile(ArchiveFile('user.js', userJsContent.length, userJsContent));
 
-    final zipData = ZipEncoder().encode(archive);
+    final zipData = ZipEncoder().encode(archive)!;
     return {'firefox_profile': base64.encode(zipData)};
   }
 }
@@ -274,7 +269,7 @@
       RegExp(r'user_pref\("([^"]+)", ("?.+?"?)\);');
 
   final String name;
-  final T value;
+  final T? value;
 
   factory PrefsOption(String name, T value) {
     if (value is bool) {
@@ -294,8 +289,8 @@
       return InvalidOption('Not a valid prefs option: "$prefs".')
           as PrefsOption<T>;
     }
-    final name = match.group(1);
-    final valueString = match.group(2);
+    final name = match.group(1)!;
+    final valueString = match.group(2)!;
     if (valueString.startsWith('"') && valueString.endsWith('"')) {
       final value = valueString
           .substring(1, valueString.length - 1)
@@ -309,7 +304,7 @@
       return BooleanOption(name, false) as PrefsOption<T>;
     }
     try {
-      int value = int.parse(valueString);
+      var value = int.parse(valueString);
       return IntegerOption(name, value) as PrefsOption<T>;
     } catch (_) {}
     return InvalidOption('Not a valid prefs option: "$prefs".')
@@ -323,7 +318,7 @@
     if (identical(this, other)) {
       return true;
     }
-    return other is PrefsOption && this.name == other.name;
+    return other is PrefsOption && name == other.name;
   }
 
   @override
@@ -368,7 +363,5 @@
       value.replaceAll(r'\', r'\\').replaceAll('"', r'\"');
 
   @override
-  String get _valueAsPrefString {
-    return '"${_escape(value)}"';
-  }
+  String get _valueAsPrefString => '"${_escape(value!)}"';
 }
diff --git a/lib/support/stdio_stepper.dart b/lib/support/stdio_stepper.dart
index b2cb904..0d262b9 100644
--- a/lib/support/stdio_stepper.dart
+++ b/lib/support/stdio_stepper.dart
@@ -18,7 +18,7 @@
 import 'dart:convert' show Encoding, json;
 import 'dart:io' show exit, Stdin, stdin, systemEncoding;
 
-import 'package:webdriver/src/async/stepper.dart';
+import '../src/async/stepper.dart';
 
 LineReader? _stdinLineReader;
 
@@ -80,8 +80,8 @@
 /// Converts a Stream<List<int> | int> to Stream<String> that fires an event
 /// for every line of data in the original Stream.
 class LineReader {
-  static const CR = 13;
-  static const LF = 10;
+  static const cr = 13;
+  static const lf = 10;
 
   bool _crPrevious = false;
   final _bytes = <int>[];
@@ -104,17 +104,17 @@
     if (data is List<int>) {
       data.forEach(_addByte);
     } else {
-      _addByte(data);
+      _addByte(data as int);
     }
   }
 
   void _addByte(int byte) {
-    if (_crPrevious && byte == LF) {
+    if (_crPrevious && byte == lf) {
       _crPrevious = false;
       return;
     }
-    _crPrevious = byte == CR;
-    if (byte == CR || byte == LF) {
+    _crPrevious = byte == cr;
+    if (byte == cr || byte == lf) {
       _controller.add(encoding.decode(_bytes));
       _bytes.clear();
     } else {
diff --git a/lib/sync_core.dart b/lib/sync_core.dart
index 51ffe4b..5de6f1c 100644
--- a/lib/sync_core.dart
+++ b/lib/sync_core.dart
@@ -16,11 +16,11 @@
 
 import 'dart:collection' show UnmodifiableMapView;
 
-import 'package:webdriver/src/common/request_client.dart';
-import 'package:webdriver/src/common/session.dart';
-import 'package:webdriver/src/common/spec.dart';
-import 'package:webdriver/src/common/utils.dart';
-import 'package:webdriver/src/sync/web_driver.dart' show WebDriver;
+import 'src/common/request_client.dart';
+import 'src/common/session.dart';
+import 'src/common/spec.dart';
+import 'src/common/utils.dart';
+import 'src/sync/web_driver.dart' show WebDriver;
 
 export 'package:webdriver/src/common/by.dart';
 export 'package:webdriver/src/common/capabilities.dart';
diff --git a/lib/sync_io.dart b/lib/sync_io.dart
index cb32e56..a2bb6fb 100644
--- a/lib/sync_io.dart
+++ b/lib/sync_io.dart
@@ -14,9 +14,9 @@
 
 library webdriver.sync_io;
 
-import 'package:webdriver/src/request/sync_http_request_client.dart';
+import 'src/request/sync_http_request_client.dart';
 
-import 'package:webdriver/sync_core.dart' as core
+import 'sync_core.dart' as core
     show createDriver, fromExistingSession, WebDriver, WebDriverSpec;
 
 export 'package:webdriver/sync_core.dart'
diff --git a/pubspec.yaml b/pubspec.yaml
index a8ba465..48d7f72 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -15,8 +15,13 @@
   archive: ^3.0.0-nullsafety.0
   matcher: ^0.12.10-nullsafety.0
   path: ^1.8.0-nullsafety.0
+  pedantic: ^1.10.0-nullsafety.0
   stack_trace: ^1.10.0-nullsafety.0
   sync_http: '>=0.1.1 <0.3.0'
 
 dev_dependencies:
   test: ^1.16.0-nullsafety.0
+
+dependency_overrides:
+  sync_http:
+    git: https://github.com/dart-lang/sync_http
diff --git a/test/async_alert_test.dart b/test/async_alert_test.dart
index 7988041..e877821 100644
--- a/test/async_alert_test.dart
+++ b/test/async_alert_test.dart
@@ -66,7 +66,7 @@
 
     test('sendKeys', () async {
       await button.click();
-      Alert alert = driver.switchTo.alert;
+      var 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 52ab877..f27cac6 100644
--- a/test/async_command_event_test.dart
+++ b/test/async_command_event_test.dart
@@ -43,7 +43,9 @@
     test('handles exceptions', () async {
       try {
         await driver.switchTo.alert.text;
-      } catch (e) {}
+      } catch (e) {
+        // noop
+      }
       expect(events, hasLength(2));
       expect(events[1].method, 'GET');
       expect(events[1].endPoint, contains('alert'));
diff --git a/test/async_cookies_test.dart b/test/async_cookies_test.dart
index 1403973..02fe5cf 100644
--- a/test/async_cookies_test.dart
+++ b/test/async_cookies_test.dart
@@ -58,7 +58,7 @@
           secure: false,
           expiry: _expiryDate));
 
-      bool found = false;
+      var found = false;
       await for (var cookie in driver.cookies.all) {
         if (cookie.name == 'mycookie') {
           found = true;
@@ -85,7 +85,7 @@
     test('delete cookie', () async {
       await driver.cookies.add(Cookie('mycookie', 'myvalue'));
       await driver.cookies.delete('mycookie');
-      bool found = false;
+      var found = false;
       await for (var cookie in driver.cookies.all) {
         if (cookie.name == 'mycookie') {
           found = true;
diff --git a/test/async_keyboard_test.dart b/test/async_keyboard_test.dart
index c030884..130ff74 100644
--- a/test/async_keyboard_test.dart
+++ b/test/async_keyboard_test.dart
@@ -26,7 +26,7 @@
   group('Keyboard', () {
     late WebDriver driver;
     late WebElement textInput;
-    String ctrlCmdKey = '';
+    var ctrlCmdKey = '';
 
     setUp(() async {
       if (Platform.isMacOS) {
diff --git a/test/async_logs_test.dart b/test/async_logs_test.dart
index 87875bb..c301dce 100644
--- a/test/async_logs_test.dart
+++ b/test/async_logs_test.dart
@@ -25,7 +25,7 @@
     late WebDriver driver;
 
     setUp(() async {
-      Map<String, dynamic> capabilities = {
+      var capabilities = <String, dynamic>{
         // ignore: deprecated_member_use_from_same_package
         Capabilities.loggingPrefs: {LogType.performance: LogLevel.info}
       };
@@ -36,7 +36,7 @@
     });
 
     test('get logs', () async {
-      List<LogEntry> logs = await driver.logs.get(LogType.performance).toList();
+      var logs = await driver.logs.get(LogType.performance).toList();
       if (driver.capabilities['browserName'] == 'firefox') {
         expect(logs, isEmpty);
         return;
diff --git a/test/async_web_driver_test.dart b/test/async_web_driver_test.dart
index 7a7de7f..6303f05 100644
--- a/test/async_web_driver_test.dart
+++ b/test/async_web_driver_test.dart
@@ -26,7 +26,7 @@
   group('WebDriver', () {
     group('create', () {
       test('default', () async {
-        WebDriver driver = await config.createTestDriver();
+        var driver = await config.createTestDriver();
         await config.createTestServerAndGoToTestPage(driver);
         var element = await driver.findElement(const By.tagName('button'));
         expect(await element.name, 'button');
@@ -60,7 +60,9 @@
         try {
           await driver.findElement(const By.id('non-existent-id'));
           throw 'expected NoSuchElementException';
-        } on NoSuchElementException {}
+        } on NoSuchElementException {
+          // noop
+        }
       });
 
       test('findElements -- 1 found', () async {
@@ -89,7 +91,7 @@
       });
 
       test('close/windows', () async {
-        int numHandles = (await driver.windows.toList()).length;
+        var numHandles = (await driver.windows.toList()).length;
         await (await driver.findElement(const By.partialLinkText('Open copy')))
             .click();
         expect(await driver.windows.toList(), hasLength(numHandles + 1));
@@ -98,7 +100,7 @@
       });
 
       test('window', () async {
-        Window orig = await driver.window;
+        var orig = await driver.window;
         Window? next;
 
         await (await driver.findElement(const By.partialLinkText('Open copy')))
@@ -131,9 +133,8 @@
       });
 
       test('execute', () async {
-        WebElement button =
-            await driver.findElement(const By.tagName('button'));
-        String script = '''
+        var button = await driver.findElement(const By.tagName('button'));
+        var script = '''
             arguments[1].textContent = arguments[0];
             return arguments[1];''';
         var e = await driver.execute(script, ['new text', button]);
@@ -141,9 +142,8 @@
       });
 
       test('executeAsync', () async {
-        WebElement button =
-            await driver.findElement(const By.tagName('button'));
-        String script = '''
+        var button = await driver.findElement(const By.tagName('button'));
+        var script = '''
             arguments[1].textContent = arguments[0];
             arguments[2](arguments[1]);''';
         var e = await driver.executeAsync(script, ['new text', button]);
@@ -184,13 +184,11 @@
       });
 
       test('future based event listeners work with script timeouts', () async {
-        driver.addEventListener((WebDriverCommandEvent e) async {
-          return await Future.delayed(
-              const Duration(milliseconds: 1000), (() {}));
-        });
+        driver.addEventListener((WebDriverCommandEvent e) async =>
+            await Future.delayed(const Duration(milliseconds: 1000), (() {})));
 
         try {
-          driver.timeouts.setScriptTimeout(const Duration(seconds: 1));
+          await driver.timeouts.setScriptTimeout(const Duration(seconds: 1));
           await driver.executeAsync('', []);
           fail('Did not throw timeout as expected');
         } catch (e) {
@@ -200,20 +198,19 @@
 
       test('future based event listeners ordered appropriately', () async {
         var eventList = <int>[];
-        int millisDelay = 2000;
-        int current = 0;
-        driver.addEventListener((WebDriverCommandEvent e) async {
-          return await Future.delayed(Duration(milliseconds: millisDelay), (() {
-            eventList.add(current++);
-            millisDelay = (millisDelay / 2).round();
-          }));
-        });
+        var millisDelay = 2000;
+        var current = 0;
+        driver.addEventListener((WebDriverCommandEvent e) async =>
+            await Future.delayed(Duration(milliseconds: millisDelay), (() {
+              eventList.add(current++);
+              millisDelay = (millisDelay / 2).round();
+            })));
 
-        for (int i = 0; i < 10; i++) {
+        for (var i = 0; i < 10; i++) {
           await driver.title; // GET request.
         }
         expect(eventList, hasLength(10));
-        for (int i = 0; i < 10; i++) {
+        for (var i = 0; i < 10; i++) {
           expect(eventList[i], i);
         }
       });
diff --git a/test/async_web_element_test.dart b/test/async_web_element_test.dart
index 9a85aff..1247278 100644
--- a/test/async_web_element_test.dart
+++ b/test/async_web_element_test.dart
@@ -145,7 +145,9 @@
       try {
         await button.findElement(const By.tagName('tr'));
         throw 'Expected NoSuchElementException';
-      } on NoSuchElementException {}
+      } on NoSuchElementException {
+        // noop
+      }
     });
 
     test('findElements -- 1 found', () async {
diff --git a/test/configs/async_io_config.dart b/test/configs/async_io_config.dart
index d4141e0..fd45010 100644
--- a/test/configs/async_io_config.dart
+++ b/test/configs/async_io_config.dart
@@ -52,8 +52,8 @@
   final server = await createLocalServer();
   server.listen((request) {
     if (request.method == 'GET' && request.uri.path.endsWith('.html')) {
-      String testPagePath = '$testHomePath${request.uri.path}';
-      File file = File(testPagePath);
+      var testPagePath = '$testHomePath${request.uri.path}';
+      var file = File(testPagePath);
       if (file.existsSync()) {
         request.response
           ..statusCode = HttpStatus.ok
diff --git a/test/configs/common_config.dart b/test/configs/common_config.dart
index 9b07f6c..c292065 100644
--- a/test/configs/common_config.dart
+++ b/test/configs/common_config.dart
@@ -54,7 +54,7 @@
       var capabilities = Capabilities.chrome;
       Map env = Platform.environment;
 
-      Map chromeOptions = {};
+      var chromeOptions = {};
 
       if (env['CHROMEDRIVER_BINARY'] != null) {
         chromeOptions['binary'] = env['CHROMEDRIVER_BINARY'];
diff --git a/test/configs/sync_io_config.dart b/test/configs/sync_io_config.dart
index 46abb5c..3fdef80 100644
--- a/test/configs/sync_io_config.dart
+++ b/test/configs/sync_io_config.dart
@@ -51,8 +51,8 @@
   final server = await createLocalServer();
   server.listen((request) {
     if (request.method == 'GET' && request.uri.path.endsWith('.html')) {
-      String testPagePath = '$testHomePath${request.uri.path}';
-      File file = File(testPagePath);
+      var testPagePath = '$testHomePath${request.uri.path}';
+      var file = File(testPagePath);
       if (file.existsSync()) {
         request.response
           ..statusCode = HttpStatus.ok
diff --git a/test/firefox_alert_test.dart b/test/firefox_alert_test.dart
index a5cf1de..312b196 100644
--- a/test/firefox_alert_test.dart
+++ b/test/firefox_alert_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/alert.dart';
diff --git a/test/firefox_command_event.dart b/test/firefox_command_event.dart
index 5b0cd8d..e41fb44 100644
--- a/test/firefox_command_event.dart
+++ b/test/firefox_command_event.dart
@@ -12,9 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import 'sync/command_event.dart';
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
+import 'sync/command_event.dart';
+
 void main() {
   runTests(spec: WebDriverSpec.W3c);
 }
diff --git a/test/firefox_cookies_test.dart b/test/firefox_cookies_test.dart
index 23cd5f2..a9bfcc9 100644
--- a/test/firefox_cookies_test.dart
+++ b/test/firefox_cookies_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/cookies.dart';
diff --git a/test/firefox_navigation_test.dart b/test/firefox_navigation_test.dart
index 647287a..34677a5 100644
--- a/test/firefox_navigation_test.dart
+++ b/test/firefox_navigation_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/navigation.dart';
diff --git a/test/firefox_target_locator_test.dart b/test/firefox_target_locator_test.dart
index aca29ad..37dde4e 100644
--- a/test/firefox_target_locator_test.dart
+++ b/test/firefox_target_locator_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/target_locator.dart';
diff --git a/test/firefox_timeouts_test.dart b/test/firefox_timeouts_test.dart
index ea690f8..a86d475 100644
--- a/test/firefox_timeouts_test.dart
+++ b/test/firefox_timeouts_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/timeouts.dart';
diff --git a/test/firefox_w3c_basic_sync_test.dart b/test/firefox_w3c_basic_sync_test.dart
index caada3a..5546038 100644
--- a/test/firefox_w3c_basic_sync_test.dart
+++ b/test/firefox_w3c_basic_sync_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/basic_sync.dart';
diff --git a/test/firefox_w3c_keyboard_test.dart b/test/firefox_w3c_keyboard_test.dart
index e53df2d..cdb6f42 100644
--- a/test/firefox_w3c_keyboard_test.dart
+++ b/test/firefox_w3c_keyboard_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/keyboard.dart';
diff --git a/test/firefox_w3c_mouse_test.dart b/test/firefox_w3c_mouse_test.dart
index b0ef673..d73164d 100644
--- a/test/firefox_w3c_mouse_test.dart
+++ b/test/firefox_w3c_mouse_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/mouse.dart';
diff --git a/test/firefox_web_driver_test.dart b/test/firefox_web_driver_test.dart
index 3e3ff1e..fe36d6b 100644
--- a/test/firefox_web_driver_test.dart
+++ b/test/firefox_web_driver_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/web_driver.dart';
diff --git a/test/firefox_web_element_test.dart b/test/firefox_web_element_test.dart
index 1ca9eec..5a73c55 100644
--- a/test/firefox_web_element_test.dart
+++ b/test/firefox_web_element_test.dart
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/web_element.dart';
diff --git a/test/firefox_window_test.dart b/test/firefox_window_test.dart
index 1a87cbd..517b858 100644
--- a/test/firefox_window_test.dart
+++ b/test/firefox_window_test.dart
@@ -12,6 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
+import 'package:test/test.dart';
+
 import 'package:webdriver/sync_core.dart';
 
 import 'sync/window.dart';
diff --git a/test/support/async_test.dart b/test/support/async_test.dart
index c851ec3..5c9d78e 100644
--- a/test/support/async_test.dart
+++ b/test/support/async_test.dart
@@ -16,6 +16,7 @@
 
 import 'dart:async' show Future;
 
+import 'package:pedantic/pedantic.dart';
 import 'package:test/test.dart';
 import 'package:webdriver/support/async.dart';
 
@@ -42,7 +43,7 @@
       var lock = Lock();
       var secondLockAcquired = false;
       await lock.acquire();
-      lock.acquire().then((_) => secondLockAcquired = true);
+      unawaited(lock.acquire().then((_) => secondLockAcquired = true));
       // Make sure that lock is not unacquired just because of timing
       await Future.delayed(const Duration(seconds: 1));
       expect(secondLockAcquired, isFalse);
diff --git a/test/support/firefox_profile_test.dart b/test/support/firefox_profile_test.dart
index 5388404..587cee0 100644
--- a/test/support/firefox_profile_test.dart
+++ b/test/support/firefox_profile_test.dart
@@ -12,6 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+@Tags(['ff'])
 @TestOn('vm')
 library webdriver.support.firefox_profile_test;
 
@@ -141,7 +142,8 @@
 
       var prefs = FirefoxProfile.loadPrefsFile(MockFile(
         String.fromCharCodes(
-          archive.files.firstWhere((f) => f.name == 'user.js').content,
+          archive.files.firstWhere((f) => f.name == 'user.js').content
+              as List<int>,
         ),
       ));
       expect(
@@ -180,7 +182,8 @@
       var prefs = FirefoxProfile.loadPrefsFile(
         MockFile(
           String.fromCharCodes(
-            archive.files.firstWhere((f) => f.name == 'user.js').content,
+            archive.files.firstWhere((f) => f.name == 'user.js').content
+                as List<int>,
           ),
         ),
       );
@@ -197,7 +200,7 @@
 }
 
 Archive unpackArchiveData(Map profileData) {
-  var zipArchive = base64.decode(profileData['firefox_profile']);
+  var zipArchive = base64.decode(profileData['firefox_profile'] as String);
   return ZipDecoder().decodeBytes(zipArchive, verify: true);
 }
 
diff --git a/test/sync/alert.dart b/test/sync/alert.dart
index d85dbc3..e2a6ace 100644
--- a/test/sync/alert.dart
+++ b/test/sync/alert.dart
@@ -66,7 +66,7 @@
 
     test('sendKeys', () {
       button.click();
-      Alert alert = driver.switchTo.alert;
+      var alert = driver.switchTo.alert;
       alert.sendKeys('some keys');
       alert.accept();
       expect(output.text, endsWith('some keys'));
diff --git a/test/sync/command_event.dart b/test/sync/command_event.dart
index 631d509..8bad594 100644
--- a/test/sync/command_event.dart
+++ b/test/sync/command_event.dart
@@ -42,7 +42,9 @@
       try {
         driver.switchTo.alert.text;
         fail('Expected exception on no alert');
-      } catch (NoSuchAlertException) {}
+      } on NoSuchAlertException {
+        // noop
+      }
       // TODO(b/140553567): There should be two events.
       expect(events, hasLength(1));
       expect(events[0].method, 'GET');
diff --git a/test/sync/cookies.dart b/test/sync/cookies.dart
index b19e47a..fda6d8e 100644
--- a/test/sync/cookies.dart
+++ b/test/sync/cookies.dart
@@ -58,7 +58,7 @@
           secure: false,
           expiry: _expiryDate));
 
-      bool found = false;
+      var found = false;
       for (var cookie in driver.cookies.all) {
         if (cookie.name == 'mycookie') {
           found = true;
@@ -84,7 +84,7 @@
     test('delete cookie', () {
       driver.cookies.add(Cookie('mycookie', 'myvalue'));
       driver.cookies.delete('mycookie');
-      bool found = false;
+      var found = false;
       for (var cookie in driver.cookies.all) {
         if (cookie.name == 'mycookie') {
           found = true;
diff --git a/test/sync/keyboard.dart b/test/sync/keyboard.dart
index fca001e..0a4b299 100644
--- a/test/sync/keyboard.dart
+++ b/test/sync/keyboard.dart
@@ -26,7 +26,7 @@
   group('Keyboard', () {
     late WebDriver driver;
     late WebElement textInput;
-    String ctrlCmdKey = '';
+    var ctrlCmdKey = '';
 
     setUp(() async {
       if (Platform.isMacOS) {
diff --git a/test/sync/logs.dart b/test/sync/logs.dart
index 0cbbad4..d5f3bcd 100644
--- a/test/sync/logs.dart
+++ b/test/sync/logs.dart
@@ -25,7 +25,7 @@
     late WebDriver driver;
 
     setUp(() async {
-      Map<String, dynamic> capabilities = {
+      var capabilities = <String, dynamic>{
         // ignore: deprecated_member_use_from_same_package
         Capabilities.loggingPrefs: {LogType.performance: LogLevel.info}
       };
@@ -38,7 +38,7 @@
     });
 
     test('get logs', () {
-      List<LogEntry> logs = driver.logs.get(LogType.performance).toList();
+      var logs = driver.logs.get(LogType.performance).toList();
       if (driver.capabilities['browserName'] == 'firefox') {
         expect(logs, isEmpty);
         return;
diff --git a/test/sync/spec_inference_test.dart b/test/sync/spec_inference_test.dart
index 2120943..156edf4 100644
--- a/test/sync/spec_inference_test.dart
+++ b/test/sync/spec_inference_test.dart
@@ -22,12 +22,12 @@
 
 void main() {
   group('Spec inference', () {
-    WebDriver? driver;
+    late WebDriver driver;
 
     test('chrome works', () async {
       driver = config.createTestDriver(spec: WebDriverSpec.W3c);
-      await config.createTestServerAndGoToTestPage(driver!);
-      final button = driver!.findElement(const By.tagName('button'));
+      await config.createTestServerAndGoToTestPage(driver);
+      final button = driver.findElement(const By.tagName('button'));
       try {
         button.findElement(const By.tagName('tr'));
         throw 'Expected NoSuchElementException';
@@ -35,12 +35,12 @@
         expect(e, const TypeMatcher<NoSuchElementException>());
         expect(e.toString(), contains('Unable to locate element'));
       }
-    });
+    }, tags: ['ff']);
 
     test('firefox work', () async {
       driver = config.createTestDriver(spec: WebDriverSpec.JsonWire);
-      await config.createTestServerAndGoToTestPage(driver!);
-      final button = driver!.findElement(const By.tagName('button'));
+      await config.createTestServerAndGoToTestPage(driver);
+      final button = driver.findElement(const By.tagName('button'));
       try {
         button.findElement(const By.tagName('tr'));
         throw 'Expected W3cWebDriverException';
diff --git a/test/sync/web_driver.dart b/test/sync/web_driver.dart
index ad9317b..10c3b37 100644
--- a/test/sync/web_driver.dart
+++ b/test/sync/web_driver.dart
@@ -26,7 +26,7 @@
   group('WebDriver', () {
     group('create', () {
       test('default', () async {
-        WebDriver driver = config.createTestDriver(spec: spec);
+        var driver = config.createTestDriver(spec: spec);
         await config.createTestServerAndGoToTestPage(driver);
         var element = driver.findElement(const By.tagName('button'));
         expect(element.name, 'button');
@@ -95,7 +95,7 @@
       });
 
       test('close/windows', () {
-        int numHandles = (driver.windows.toList()).length;
+        var numHandles = (driver.windows.toList()).length;
         (driver.findElement(const By.partialLinkText('Open copy'))).click();
         sleep(const Duration(milliseconds: 500)); // Bit slow on Firefox.
         expect(driver.windows.toList(), hasLength(numHandles + 1));
@@ -104,7 +104,7 @@
       });
 
       test('window', () {
-        Window orig = driver.window;
+        var orig = driver.window;
         Window? next;
 
         (driver.findElement(const By.partialLinkText('Open copy'))).click();
@@ -135,8 +135,8 @@
       });
 
       test('execute', () {
-        WebElement button = driver.findElement(const By.tagName('button'));
-        String script = '''
+        var button = driver.findElement(const By.tagName('button'));
+        var script = '''
             arguments[1].textContent = arguments[0];
             return arguments[1];''';
         var e = driver.execute(script, ['new text', button]);
@@ -144,8 +144,8 @@
       });
 
       test('executeAsync', () {
-        WebElement button = driver.findElement(const By.tagName('button'));
-        String script = '''
+        var button = driver.findElement(const By.tagName('button'));
+        var script = '''
             arguments[1].textContent = arguments[0];
             arguments[2](arguments[1]);''';
         var e = driver.executeAsync(script, ['new text', button]);
@@ -196,16 +196,16 @@
 
       test('event listeners ordered appropriately', () {
         var eventList = <int>[];
-        int current = 0;
+        var current = 0;
         driver.addEventListener((e) {
           eventList.add(current++);
         });
 
-        for (int i = 0; i < 10; i++) {
+        for (var i = 0; i < 10; i++) {
           driver.title; // GET request.
         }
         expect(eventList, hasLength(10));
-        for (int i = 0; i < 10; i++) {
+        for (var i = 0; i < 10; i++) {
           expect(eventList[i], i);
         }
       });
