Add e2e tests for embedder benchmark

Change-Id: I78b2274f00dc25dedb2911a92fad17dbbe39bd43
Reviewed-on: https://chromium-review.googlesource.com/c/crossbench/+/7472115
Auto-Submit: Mateusz Zbikowski <zbikowski@google.com>
Reviewed-by: Camillo Bruni <cbruni@chromium.org>
Commit-Queue: Mateusz Zbikowski <zbikowski@google.com>
diff --git a/crossbench/browsers/webview/webview.py b/crossbench/browsers/webview/webview.py
index 78fc7e3..61373a6 100644
--- a/crossbench/browsers/webview/webview.py
+++ b/crossbench/browsers/webview/webview.py
@@ -5,6 +5,7 @@
 from __future__ import annotations
 
 import abc
+import re
 from typing import TYPE_CHECKING, Optional
 
 from typing_extensions import override
@@ -18,6 +19,10 @@
   from crossbench.browsers.version import BrowserVersion
 
 
+_WEBVIEW_SYSUPDATE_CURRENT_PKG_RE = re.compile(
+    r"Current WebView package.*:.*\(([a-z.]*),\s+(\d+\.\d+\.\d+\.\d+)\)")
+
+
 # TODO: crbug.com/393058910 - Replace this Webview class stub placeholder
 # once Webview class is properly created.
 class Webview(ChromeWebDriverAndroid, metaclass=abc.ABCMeta):
@@ -33,4 +38,13 @@
   def _extract_version(self) -> BrowserVersion:
     webview_provider = self.platform.sh_stdout("settings", "get", "global",
                                                "webview_provider").strip()
+    if webview_provider == "null":
+      # If webview_provider is null, we need to use dumpsys webviewupdate
+      # to get the webview provider package name.
+      dumpsys_output = self.platform.adb.dumpsys("webviewupdate")
+      for line in dumpsys_output.splitlines():
+        if match := re.search(_WEBVIEW_SYSUPDATE_CURRENT_PKG_RE, line):
+          webview_provider = match.group(1)
+          break
+
     return self.version_cls().parse(self.platform.app_version(webview_provider))
diff --git a/tests/end2end/android/test_embedder.py b/tests/end2end/android/test_embedder.py
new file mode 100644
index 0000000..ec49637
--- /dev/null
+++ b/tests/end2end/android/test_embedder.py
@@ -0,0 +1,55 @@
+# Copyright 2026 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+from __future__ import annotations
+
+import json
+from typing import TYPE_CHECKING
+
+from crossbench.cli.cli import CrossBenchCLI
+from crossbench.parse import NumberParser
+from tests import test_helper
+
+if TYPE_CHECKING:
+  from tests.test_helper import TestEnv
+
+
+def _browser_config(device_id, adb_path) -> str:
+  return json.dumps({
+      "browser": "com.google.android.googlequicksearchbox",
+      "driver": {
+          "type": "adb",
+          "device_id": device_id,
+          "adb_bin": adb_path
+      }
+  })
+
+
+def _embedder_config() -> str:
+  return json.dumps({"js": "return {WSRT: google.timers.load.wsrt}"})
+
+
+def test_embedder(device_id, adb_path, test_env: TestEnv, adb_root) -> None:
+  del adb_root
+  browser_config = _browser_config(device_id, adb_path)
+  CrossBenchCLI().run((
+      "embedder", f"--browser={browser_config}",
+      "--splashscreen=skip",
+      f"--cuj-config={test_env.root_dir}/config/team/woa/embedder_cuj_config.hjson",
+      # TODO(zbikowski): Add this flag once embedder in the emulator image is
+      # updated.
+      # "--embedder-process-name=googleapp",
+      f"--probe=embedder:{_embedder_config()}",
+      f"--out-dir={test_env.results_dir}"
+   ) + test_env.cq_flags)
+
+  with (test_env.results_dir / "embedder.csv").open() as csv:
+    lines = csv.readlines()
+    error_message = f"csv content: {lines}"
+    assert "WSRT" in lines[-1], error_message
+    assert NumberParser.positive_zero_float(
+        lines[-1].split("\t")[-1]) > 0, error_message
+
+
+if __name__ == "__main__":
+  test_helper.run_pytest(__file__)