Enable and fix remaining lints (#234)

Enable full null-safety

Closes https://github.com/google/webdriver.dart/pull/233

PiperOrigin-RevId: 353123127
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);
         }
       });