QA How-To
How to Fix Appium "No Chromedriver found that can automate Chrome" in a WebView
Fix Appium No Chromedriver Found for WebView by matching the Android WebView engine, enabling safe auto-download, or installing the right server-side binary.
22 min read | 3,919 words
TL;DR
Read the Chrome engine version detected for the target WebView. Enable UiAutomator2's scoped Chromedriver auto-download on the Appium server or install a compatible binary there, then prove the fix with a context switch and DOM assertion.
Key Takeaways
- Match Chromedriver to the WebView engine version in the Appium server log, not desktop Chrome.
- Use the UiAutomator2-scoped server flag to permit automatic Chromedriver downloads.
- Install a manual binary on the Appium server host and verify its path and architecture.
- Distinguish missing binaries from WebViews that are not exposed or have no loaded page.
- Run a real context switch and DOM assertion to prove the fix works.
- Capture device provider and driver versions in CI before device images update.
If you need to fix Appium No Chromedriver Found for WebView, the error usually appears when a UiAutomator2 session starts in a web context or your test switches from NATIVE_APP to WEBVIEW_*. Appium can see the WebView, but it cannot find a compatible Chromedriver executable on the machine running the Appium server.
Original error: No Chromedriver found that can automate Chrome '120.0.6099'.
The version above is from a reported Appium failure; the version in your actual log is evidence: it describes the Chromium engine Appium detected for that WebView, not necessarily the desktop Chrome installed on your laptop. Keep that log line, the device identifier, and the Appium server location together while you diagnose the failure. This guide uses an Android hybrid app and the UiAutomator2 driver; iOS WebViews follow a different automation path. For the broader setup, see the Appium Android setup guide and Appium 3 mobile automation guide.
TL;DR
- Read the detected Chrome version from the Appium server log. Check the actual WebView provider with
adb shell dumpsys webviewupdate; do not guess from desktop Chrome. - If the server can reach Google's download endpoints, start it with
appium server --allow-insecure uiautomator2:chromedriver_autodownload. Give the UiAutomator2 session a writableappium:chromedriverExecutableDir. - If downloads are blocked, install a compatible Chromedriver for the WebView engine on the Appium server host, then set
appium:chromedriverExecutableto its absolute path or expose a directory throughappium:chromedriverExecutableDir. - Re-run a context switch and a DOM assertion. A successful
chromedriver --versionalone verifies the file, not the WebView connection.
Do not use appium:chromedriverDisableBuildCheck as the fix. That option disables a compatibility guard but does not make an incompatible binary capable of controlling a different engine. The UiAutomator2 driver documentation lists the supported WebView capabilities and the automatic download feature.
What the Error Actually Means
UiAutomator2 drives native Android views through its on-device server. When you switch to a WebView, Appium starts a host-side Chromedriver process and proxies web commands through it. Appium therefore needs a Chromedriver that can speak to the Chromium build inside the WebView. It searches its available executables and checks compatibility before starting one. The quoted error means that selection failed; it does not mean your app contains no WebView.
The failure can occur at different points. With appium:autoWebview or browserName: Chrome, session creation can fail immediately. In a hybrid app that starts in NATIVE_APP, the session may be healthy until driver.switch_to.context(...). Distinguish those cases in your report: if native actions pass, Android SDK and UiAutomator2 installation are probably functioning, while the browser handoff is not.
The WebView implementation can change independently of your app APK through an Android System WebView or Chrome update. A test that worked last week may fail after the device image, system browser, or device farm image changes. Appium's version detection can also use DevTools details, so record what Appium reports alongside adb package data. Chrome's version selection guidance explains how to choose a corresponding ChromeDriver release, especially for Chrome 115 and later.
Root-Cause Decision Table
| Symptom | Root cause | Fix |
|---|---|---|
| Log names a WebView engine but no matching binary is listed | Compatible Chromedriver is absent | Enable scoped automatic download or install a matching binary |
| One manually selected binary fails only after the device updates | Pinned Chromedriver is stale | Re-resolve the engine version and replace the pin |
| Download attempt fails with network or file errors | Server cannot fetch or store the driver | Fix proxy/permissions or pre-provision the binary |
| Binary works locally but CI reports the error | CI host has a different driver cache or device image | Install or download on the CI Appium host, then verify its device |
driver.contexts contains only NATIVE_APP |
WebView is not exposed or is not ready | Enable debugging in a test build and wait for a loaded page |
| Log detects a version different from the expected app provider | Wrong WebView or Chrome process was selected | Inspect contexts and provider, then target the correct page |
--version works on the laptop but fails in Docker |
Binary is on the wrong host or architecture | Put a compatible executable inside the Appium container |
Use the table as a branch point. First collect device and server evidence, then change one variable at a time. If the actual exception says session not created: This version of ChromeDriver only supports Chrome version ..., a driver did start but was incompatible. That is adjacent to, yet later than, the exact "No Chromedriver found" selection error.
1. Fix Appium No Chromedriver Found for WebView by Measuring the Actual Engine
Connect the device and reproduce the failing screen before installing anything. adb devices -l confirms which device is attached. dumpsys webviewupdate reports the selected Android WebView provider; the provider package may be Chrome on some devices and Android System WebView on others. Its package version is useful, but Appium's detected browser version in the server log remains the value to match when the two differ.
adb devices -l
adb shell dumpsys webviewupdate
adb shell pm list packages | grep -E 'webview|chrome'
appium driver list --installed
appium driver doctor uiautomator2
Verify this step by finding the intended device in adb devices -l with state device, a current provider in dumpsys, and an installed uiautomator2 driver. If adb lists several devices, set ANDROID_UDID explicitly in the script below and add -s "$ANDROID_UDID" to later adb commands. The doctor checks Android automation prerequisites; it cannot tell you which Chromedriver will match the active WebView.
A WebView may use an embedded engine that differs from the Chrome app you open manually. Do not choose a driver from the desktop google-chrome --version output. Android's WebView provider controls rendering for ordinary android.webkit.WebView instances, while a Chrome Custom Tab and a third-party Chromium runtime can take other paths. In the Appium server output, capture the Chrome/<version> detail or the version embedded in the exception at the moment you enter the failing context. If the log shows several contexts, identify which one your test selected before resolving the driver.
You can inspect additional context details without switching into the WebView using the supported mobile: getContexts extension. The UiAutomator2 hybrid-mode reference documents that endpoint. Build the following probe once and reuse it for each fix in this guide. Supply a real APK path and the connected device ID; it installs and launches your test build through Appium.
python3 -m pip install Appium-Python-Client
export APP_APK="$PWD/path/to/your-debug-app.apk"
export ANDROID_UDID="<device-id-from-adb-devices>"
Save this as webview_probe.py:
import os
from appium import webdriver
from appium.options.android import UiAutomator2Options
from selenium.webdriver.support.ui import WebDriverWait
caps = {
"platformName": "Android",
"appium:automationName": "UiAutomator2",
"appium:udid": os.environ["ANDROID_UDID"],
"appium:app": os.environ["APP_APK"],
"appium:autoWebview": False,
"appium:showChromedriverLog": True,
}
if os.getenv("CHROMEDRIVER_EXECUTABLE"):
caps["appium:chromedriverExecutable"] = os.environ["CHROMEDRIVER_EXECUTABLE"]
if os.getenv("CHROMEDRIVER_EXECUTABLE_DIR"):
caps["appium:chromedriverExecutableDir"] = os.environ["CHROMEDRIVER_EXECUTABLE_DIR"]
options = UiAutomator2Options().load_capabilities(caps)
with webdriver.Remote("http://127.0.0.1:4723", options=options) as driver:
print("Initial context:", driver.current_context)
print("Context details:", driver.execute_script("mobile: getContexts"))
expected = os.getenv("EXPECTED_WEBVIEW")
def choose_context(current):
if expected:
return expected if expected in current.contexts else None
return next((c for c in current.contexts if c.startswith("WEBVIEW_")), None)
webview = WebDriverWait(driver, 30).until(choose_context)
print("Selected context:", webview)
driver.switch_to.context(webview)
print("WebView title:", driver.title)
print("WebView URL:", driver.current_url)
Run python3 webview_probe.py while Appium is listening locally and the app presents a loaded WebView. If the app opens on a native screen, navigate to its WebView screen before the 30-second wait expires or adapt the probe to perform that navigation. A healthy run prints NATIVE_APP, context details, a WEBVIEW_* name, then a title or URL. A failure at the switch reproduces the Chromedriver issue at the precise handoff. Use the Appium locator strategies guide when adding a reliable native action to reach the WebView.
2. Fix Appium No Chromedriver Found for WebView with Scoped Automatic Download
The fastest repair on a connected development machine is to let UiAutomator2 fetch a compatible Chromedriver when its local search finds none. Appium treats this as an insecure server feature, so the permission is a server flag, not a session capability. Scope the feature to uiautomator2; avoid enabling every insecure feature just to retrieve a driver.
In a terminal that can access Google's metadata and binary endpoints, start the Appium server:
mkdir -p "$PWD/.appium-chromedrivers"
appium server --allow-insecure uiautomator2:chromedriver_autodownload
In a second terminal, point the probe at the writable directory:
export CHROMEDRIVER_EXECUTABLE_DIR="$PWD/.appium-chromedrivers"
python3 webview_probe.py
find "$CHROMEDRIVER_EXECUTABLE_DIR" -type f -name 'chromedriver*' -print
The verification is a successful context switch, plus a downloaded executable under the directory and a server log showing which driver was selected. An empty directory and a download error mean the feature did not finish. Verify the flag appears on the server process that handled the session; setting it on an unrelated local Appium instance does nothing for a remote grid. The Appium server security guide explains driver-prefixed --allow-insecure values.
Keep appium:enableWebviewDetailsCollection at its normal enabled behavior so Appium can use DevTools data to identify the WebView engine precisely. appium:chromedriverExecutableDir lets discovery inspect and store drivers in a location you control. If your organization blocks runtime downloads, use a pre-provisioned binary instead of changing security flags or repeatedly reinstalling Appium. Installation of the Appium Python client or UiAutomator2 driver does not guarantee a matching binary for every future WebView update; current appium-chromedriver releases no longer automatically download a latest binary at module install, as its project README notes.
3. Install a Compatible Binary When Downloads Are Blocked
For an offline runner or a controlled device image, resolve and distribute a specific Chromedriver from Google's Chrome for Testing data. Use the WebView engine version observed in the Appium log, then choose a build match. Chrome's documented process for version 115 and newer first looks up MAJOR.MINOR.BUILD; if that entry is absent, consult the milestone endpoint. A driver with the same major alone is a fallback candidate, not proof of compatibility. For older engines, follow Google's separate pre-115 selection guidance rather than forcing a modern binary.
The following runnable Python script downloads the matching Linux x64 Chromedriver into a chosen folder. Run it on an authorized connected machine, transfer the resulting file to the Appium server host, and set WEBVIEW_VERSION from your log. The official JSON endpoint supplies the actual version and URL; the script does not invent either.
export WEBVIEW_VERSION="<version-from-appium-log>"
export DRIVER_DIR="$PWD/chromedrivers"
Save as fetch_chromedriver.py:
import json
import os
import pathlib
import urllib.request
import zipfile
from io import BytesIO
version = os.environ["WEBVIEW_VERSION"]
parts = version.split(".")
if len(parts) < 3 or not all(p.isdigit() for p in parts[:3]):
raise ValueError("WEBVIEW_VERSION must start with MAJOR.MINOR.BUILD")
build = ".".join(parts[:3])
base = "https://googlechromelabs.github.io/chrome-for-testing/"
with urllib.request.urlopen(base + "latest-patch-versions-per-build-with-downloads.json") as response:
data = json.load(response)
entry = data["builds"].get(build)
if entry is None:
with urllib.request.urlopen(base + "latest-versions-per-milestone-with-downloads.json") as response:
milestones = json.load(response)
entry = milestones["milestones"][parts[0]]
print("No exact build entry; using milestone candidate:", entry["version"])
else:
print("Matched build:", entry["version"])
url = next(item["url"] for item in entry["downloads"]["chromedriver"]
if item["platform"] == "linux64")
with urllib.request.urlopen(url) as response:
archive = zipfile.ZipFile(BytesIO(response.read()))
member = next(name for name in archive.namelist() if name.endswith("/chromedriver"))
target = pathlib.Path(os.environ["DRIVER_DIR"]).resolve() / "chromedriver"
target.parent.mkdir(parents=True, exist_ok=True)
target.write_bytes(archive.read(member))
target.chmod(0o755)
print(target)
python3 fetch_chromedriver.py
"$DRIVER_DIR/chromedriver" --version
export CHROMEDRIVER_EXECUTABLE="$DRIVER_DIR/chromedriver"
python3 webview_probe.py
A successful --version confirms the downloaded Linux binary executes on this host. The final probe confirms actual WebView compatibility. On macOS or Windows, choose the matching Chrome for Testing platform in the endpoint and adapt the executable name; do not run the Linux file there. If the endpoint has neither an exact build nor a milestone entry, record that gap and use an engine version with an available compatible driver or a separately vetted release. The Chrome for Testing endpoint catalog documents the JSON files. For another mismatch pattern, the Selenium Chromedriver version mismatch guide explains the browser/driver side of the same compatibility problem.
4. Repair an Incorrect Path, Permissions, or Stale Pin
appium:chromedriverExecutable names one exact host-side file. appium:chromedriverExecutableDir asks Appium to search a directory of candidates. The former is appropriate for one fixed device image; the latter is better for mixed WebView versions, especially with controlled downloads. Do not set a file path in the directory capability or a folder path in the executable capability. The probe defines both environment switches, so choose one at a time.
Check the path in the same user account and environment that launches the Appium server. A driver under your laptop's Downloads folder is invisible to a remote Appium host, even when the test client can read it. A transferred binary may also lack execute permission, or be compiled for another architecture. On Linux or macOS, these commands expose the basic problem:
export CHROMEDRIVER_EXECUTABLE="/absolute/path/on/appium-host/chromedriver"
test -f "$CHROMEDRIVER_EXECUTABLE"
test -x "$CHROMEDRIVER_EXECUTABLE"
"$CHROMEDRIVER_EXECUTABLE" --version
python3 webview_probe.py
Verify all commands return successfully. If test -x fails for a trusted binary you provisioned, run chmod +x "$CHROMEDRIVER_EXECUTABLE" on the Appium host and retry. If --version reports an execution format error, fetch the binary for the host's CPU and operating system. If it prints an older version than the engine in the log, replace the stale pin using the previous section. The executable is never copied onto the phone; Appium starts it on the server and connects it to the Android DevTools socket.
Avoid appium:chromedriverUseSystemExecutable as a speculative repair. That option forces Appium's system executable and the UiAutomator2 documentation warns it may be incompatible. Similarly, putting a random desktop chromedriver on PATH does not guarantee Appium selects it. Give Appium an explicit supported capability and confirm the chosen file in its logs. For capability syntax and the W3C prefix, see the Appium desired capabilities guide.
5. Make the WebView Discoverable Before Diagnosing Its Driver
If the probe prints only NATIVE_APP, you have a different failure from the quoted Chromedriver selection error. Appium cannot select a driver for a context it does not see. Load the WebView page, make sure the app's test build exposes debugging, and then repeat context discovery. On supported recent WebView implementations, a debuggable app may enable this automatically; explicitly setting the flag in a development build is still a clear, testable policy. Android warns that enabling WebView debugging allows inspection and modification of WebView content, so keep it out of production builds unless intentionally required.
In the app's Android initialization code, gate the real WebView API on the app's debuggable flag:
import android.content.pm.ApplicationInfo
import android.webkit.WebView
if (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0) {
WebView.setWebContentsDebuggingEnabled(true)
}
Build and install that test variant, open the WebView screen, then verify on the host:
adb devices -l
adb -s "$ANDROID_UDID" shell cat /proc/net/unix | grep webview_devtools_remote
python3 webview_probe.py
A DevTools socket and a WEBVIEW_* entry show that discovery is progressing. The socket name may vary, so chrome://inspect in a desktop Chrome browser is a second supported check for the live page. If the context appears but the probe still raises "No Chromedriver found", return to binary selection. If the context is present but contains no page, wait for the WebView navigation to finish; appium:ensureWebviewsHavePages can filter empty contexts. Turning that filtering off may reveal a socket, but it does not create a loaded page or fix a missing driver. Android's WebView debugging guide shows the supported inspection flow. For reliable waiting around native-to-web transitions, use the Appium wait strategies guide.
6. Correct a Wrong WebView Version or Context Selection
Multiple web processes can be present: your app's WebView, a Chrome Custom Tab, an authentication page, and a WebView left by another app. Selecting the first name beginning WEBVIEW_ is convenient for a one-page probe, but not a stable production locator. The mobile: getContexts result includes page and browser information that can help you choose the intended context. Record its URL and package information before forcing any Chromedriver path. If the error's engine version belongs to a different context, changing your app's WebView provider may solve nothing.
Use the same probe's Context details output and compare it with the page shown under chrome://inspect. Once you know the exact context name, use the probe's EXPECTED_WEBVIEW variable to require that name rather than relying on order:
export EXPECTED_WEBVIEW="<name-from-context-details>"
python3 webview_probe.py
The printed URL should belong to the page you meant to automate. Carry that explicit context choice into your production test. If several pages share one context, inspect driver.window_handles after a successful switch and select the intended window. Do not infer WebView identity solely from a package label when the app launches Chrome Custom Tabs. A wrong context can cause Appium to request a different Chromedriver version from the one you provisioned.
appium:enableWebviewDetailsCollection improves version detection through DevTools and is enabled by default in maintained UiAutomator2 releases. If the log and provider disagree, collect the full mobile: getContexts result and Appium debug log before overriding anything. Disabling build checks can hide evidence and then fail later during WebDriver commands. A reproducible context selection is the safer correction.
7. Fix CI Hosts That Do Not Share Your Local Driver
Chromedriver executes wherever the Appium server runs. A CI job may start Appium on a different machine than the one running the test client, and a device farm provides its own remote service. A path from your workstation is meaningless to those servers. Identify the server host, CPU architecture, writable directory, Android SDK access, and attached device before copying a local fix.
On a CI worker that hosts both Appium and the Android device, provision the matching executable before starting the server. If the device pool changes independently, enable scoped automatic download and persist a writable cache across jobs instead. Run this preflight in the same worker environment that will start Appium:
adb devices -l
adb shell dumpsys webviewupdate
test -x "$CHROMEDRIVER_EXECUTABLE"
"$CHROMEDRIVER_EXECUTABLE" --version
The expected result is the intended online device, its current provider, and a runnable host binary. Then start Appium and run python3 webview_probe.py against that server. If CI still reports a different engine version, check whether the job attached to another device or whether the WebView process is a Chrome Custom Tab. Keep the Appium server log as an artifact so both the detected engine and selected driver survive a failed job. The mobile device farm testing guide covers managing these environmental differences.
8. Fix Docker Images Missing the Host-Side Chromedriver
If Python runs on the CI host while Appium runs in a container, installing Chromedriver only on the host leaves Appium's container empty. The binary must also match the container architecture. For a Linux x64 Appium container built from an image that already contains Android SDK and Java, copy a vetted Chromedriver into the image at build time. Match the binary to the specific emulator or device WebView version used by that job. Use your own compatible base image tag rather than assuming a generic Node image includes Android tooling:
ARG APPIUM_BASE_IMAGE
FROM ${APPIUM_BASE_IMAGE}
COPY chromedriver /opt/chromedrivers/chromedriver
RUN chmod 755 /opt/chromedrivers/chromedriver \
&& /opt/chromedrivers/chromedriver --version
export APPIUM_BASE_IMAGE="<your-approved-appium-android-image:matching-tag>"
docker build --build-arg APPIUM_BASE_IMAGE="$APPIUM_BASE_IMAGE" -t hybrid-appium-test .
docker run --rm hybrid-appium-test /opt/chromedrivers/chromedriver --version
The build and run commands verify that the binary exists and executes inside the image. They do not prove a device is reachable. When launching Appium in that container, set CHROMEDRIVER_EXECUTABLE=/opt/chromedrivers/chromedriver in the test client capabilities, or provide the same value in your session configuration. If docker run uses another ENTRYPOINT, override it with --entrypoint for this diagnostic. For an online container, mount a writable Chromedriver directory and enable the scoped download feature on the container's Appium server, then run the probe against that server address.
For a containerized CI job, print adb devices -l, adb shell dumpsys webviewupdate, and /opt/chromedrivers/chromedriver --version from the Appium container before the test. A farm that updates its WebView independently cannot depend on one pinned binary indefinitely; allow matching downloads or maintain a curated directory for its known device images.
How to Verify the Fix
Run the complete handoff, not just a filesystem check. Restart the Appium server with the selected strategy, open the app's actual WebView, run python3 webview_probe.py, and confirm that driver.switch_to.context(webview) completes. The output should identify the same context and page you intended to automate. Then perform a DOM assertion against a stable element in your app, for example WebDriverWait(driver, 10).until(lambda d: d.find_element("css selector", "[data-testid='webview-ready']").is_displayed()), with a selector that exists in your test page.
Inspect the Appium server log for the detected engine version, the Chromedriver executable chosen, and Chromedriver startup. If a binary starts but returns a "This version of ChromeDriver only supports Chrome version" message, the selection stage is repaired but the binary is still incompatible. Re-check the exact WebView build and use Google's version-selection endpoint again. If the title or URL belongs to an authentication tab rather than your app page, fix context/window selection instead of changing drivers.
A compact verification sequence is:
adb -s "$ANDROID_UDID" shell dumpsys webviewupdate
"$CHROMEDRIVER_EXECUTABLE" --version
python3 webview_probe.py
For automatic discovery, omit the middle line until you identify the downloaded executable and inspect that file. On a remote Appium server, run the host-side command there, and change the probe's server URL to the reachable endpoint. Finally run one native action, one web DOM assertion, and a switch back to NATIVE_APP in the real suite. That confirms the hybrid transition works in both directions and catches a mistaken one-time probe against the wrong page.
Prevent It From Coming Back
Record three moving pieces for every device pool: WebView engine version, UiAutomator2 driver version, and available Chromedriver versions. Capture them in CI logs at the start of each mobile job. When an emulator image or farm device updates, compare the new engine before interpreting a wave of context-switch failures as app regressions. Keep a known compatible driver artifact for offline jobs, or allow scoped automatic downloads for online jobs with a writable cache.
Keep the test build's WebView debugging policy explicit and verify the page is loaded before switching contexts. Choose the target context by observed package and page data when multiple WebViews can coexist. Prefer the Appium server log over a developer laptop's browser version when investigating compatibility. A dedicated smoke test that enters one WebView and reads one DOM element is cheaper to diagnose than a full checkout flow that fails at the same handoff.
Review any use of appium:chromedriverExecutable after platform image changes because a single-file pin bypasses discovery of other candidates. Do not silence compatibility checks in a shared framework. If security policy prohibits runtime fetching, resolve drivers during image build and publish the image and device image as a tested pair. The Appium 3 driver management guide helps keep the separately installed driver itself under control.
Interview Questions and Answers
Q: At what point does Appium start Chromedriver for an Android hybrid app?
It starts a host-side Chromedriver when the session enters a web context, unless the session begins in a browser or auto-WebView context. Native commands can work before the handoff. I would capture the context name and Appium log at that boundary.
Q: Why is the Chrome version in the exception more useful than desktop Chrome's version?
The exception reports the engine Appium detected for the device's target WebView. Desktop Chrome is a separate browser and may have a different release cycle. I compare the detected version with the active Android provider and the driver candidate.
Q: How do you enable automatic Chromedriver download safely?
I start the Appium server with --allow-insecure uiautomator2:chromedriver_autodownload, provide a writable executable directory, and verify the server log. This is a server permission, not a client capability. I scope it to UiAutomator2 and use pre-provisioned binaries where the network is restricted.
Q: What distinguishes a missing driver from a mismatched driver?
A missing-driver error means Appium's selection found no compatible candidate. A "This version of ChromeDriver only supports Chrome version" response comes after a binary started and rejected the target. Both require version evidence, but the second also tells me which executable actually ran.
Q: Why might the same test pass locally and fail in Docker?
The Appium server process in Docker cannot see a binary installed only on the host. Its OS and CPU architecture may differ too. I check the executable path and --version inside the container, then run the context-switch probe against that server.
Q: How would you handle a fleet with several WebView versions?
I avoid forcing one appium:chromedriverExecutable across the fleet. I use a curated directory of compatible drivers or permitted automatic discovery, and log each device's detected engine. A smoke test validates every image before the larger suite begins.
Common Mistakes
- Downloading a driver for desktop Chrome instead of the device WebView engine shown in the Appium log.
- Adding
chromedriver_autodownloadto capabilities instead of the Appium server's scoped--allow-insecureflag. - Passing a local test-runner path to a remote Appium server or container.
- Setting
appium:chromedriverExecutableDirto a file, orappium:chromedriverExecutableto a directory. - Treating
chromedriver --versionas proof that the driver can attach to this WebView. - Using
appium:chromedriverDisableBuildCheckto suppress a real incompatibility. - Disabling WebView page filtering and assuming an empty context is ready for DOM commands.
- Selecting the first
WEBVIEW_*in a multi-app test without checking its page and package. - Reinstalling Appium without inspecting the server's actual driver cache and download permissions.
Conclusion
To fix Appium No Chromedriver Found for WebView, match a Chromedriver on the Appium server to the Chromium engine Appium detected for the target context. Enable scoped automatic download where permitted, or pre-provision a verified binary and give UiAutomator2 its absolute path. Finish with a real context switch and DOM assertion, then record the engine/driver pair so the next device update is easy to diagnose.
Interview Questions and Answers
What role does Chromedriver play in Appium Android WebView automation?
UiAutomator2 handles native UI through its on-device server. When the session enters a web context, Appium starts a compatible Chromedriver on the server host and proxies DOM commands through it. I would inspect the context switch and the server log when native actions pass but web actions fail.
How do you diagnose a No Chromedriver found error without guessing versions?
I capture the version in Appium's exception, the `mobile: getContexts` details, and `adb shell dumpsys webviewupdate` for the exact device. I then inspect available binaries on the Appium server. This separates wrong-context selection from a genuinely absent compatible driver.
What is the difference between chromedriverExecutable and chromedriverExecutableDir?
`appium:chromedriverExecutable` forces one absolute executable path. `appium:chromedriverExecutableDir` provides a directory that discovery can search and, with permission, populate through downloads. The directory approach is more suitable for a fleet with multiple WebView versions.
Why must automatic download be enabled on the Appium server?
Downloading an executable is a server-side insecure feature, so UiAutomator2 requires the scoped `--allow-insecure uiautomator2:chromedriver_autodownload` flag. A client capability cannot grant that permission. I also verify network access and write permission for the target directory.
How do you select Chromedriver for Chrome 115 and later?
I use Google's Chrome for Testing version-selection data. I look up the target `MAJOR.MINOR.BUILD` first and use the milestone endpoint if the exact build is unavailable. I download for the Appium host platform and still verify against the live WebView.
What would you check when only NATIVE_APP is returned?
I open the WebView screen and wait for a real page, then check that the test build enables WebView debugging. `chrome://inspect` and the DevTools socket provide independent evidence. Chromedriver installation is premature if there is no web context to enter.
How would you prevent this problem in an Android device farm?
I record the detected WebView version per device pool, maintain corresponding Chromedriver binaries or scoped auto-download, and run a short hybrid smoke test after image updates. A single pinned executable across all devices is fragile. Server logs must be retained so failures identify both the engine and selected binary.
Frequently Asked Questions
Why does Appium say no Chromedriver was found for my WebView?
UiAutomator2 found a web context but no compatible host-side Chromedriver among the binaries it can use. Check the engine version in the Appium server log and compare it with available drivers. The Android WebView version may change after a device update.
Which Chrome version should I use to choose Chromedriver for an Appium WebView?
Use the version Appium detected for the selected WebView, then cross-check the Android WebView provider and context details. Desktop Chrome on the test computer is unrelated. If the numbers disagree, verify that you selected the intended WebView or Custom Tab.
How do I enable Appium Chromedriver automatic download?
Start the Appium server with `--allow-insecure uiautomator2:chromedriver_autodownload` and give the session a writable `appium:chromedriverExecutableDir`. The flag belongs to the server process that handles the session. Confirm a binary was downloaded and selected in the server log.
Can I set a Chromedriver path in Appium capabilities?
Yes. `appium:chromedriverExecutable` takes the absolute path to one compatible executable on the Appium server. `appium:chromedriverExecutableDir` takes a directory of candidates and can store auto-downloaded binaries. Neither path refers to a file on the Android device.
Does chromedriverDisableBuildCheck fix a version mismatch?
No. It skips a compatibility validation but cannot make an incompatible Chromedriver understand the WebView engine. Use it only for a narrow, independently validated diagnostic and replace the binary with a matching one for normal tests.
Why is the WebView missing from driver.contexts?
The page may not be loaded, WebView debugging may be disabled in the app build, or page filtering may hide an empty context. Inspect the live page with Chrome DevTools and make a debug build expose its WebView. A missing context is a different stage from Chromedriver selection.
Why does a Chromedriver fix work locally but fail in CI?
CI may run the Appium server on another host or container that cannot see your local binary. Its device image may also carry a different WebView version. Check the executable and provider from the CI server environment, then run the same context-switch probe there.
Related Guides
- How to Debug a failing test in VS Code in Cypress (2026)
- How to Debug a failing test in VS Code in Playwright (2026)
- How to Debug a failing test in VS Code in Selenium (2026)
- How to Fix Appium "Could not find a connected Android device"
- How to Fix Appium WebDriverAgent Failed to Start on iOS
- How to Fix Playwright Tests That Pass Locally but Fail in CI