Authors and runs Appium 2.x tests against the Windows driver, the actively-maintained Node.js proxy in front of Microsoft's WinAppDriver: `appium driver install windows`, capabilities (`platformName: windows`, `appium:automationName: windows`, `appium:app`, `appium:appTopLevelWindow`, `appium:appArguments`), Windows gestures (`windows: scroll` / `clickAndDrag` / `keys`), PowerShell prerun/postrun hooks, and CI. Use when the stack already uses Appium for iOS / Android / Mac2 and Windows fits the existing client + capability model; to drive WinAppDriver directly from a Selenium-style client use winappdriver, and for a C#-only FlaUI client use flaui-tests.
74
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Per the appium-windows-driver repository:
"Appium Windows Driver is a test automation tool for Windows devices and acts as a proxy to Microsoft's WinAppDriver server."
It is the Appium-ecosystem wrapper in front of Microsoft's
WinAppDriver.exe (awd). The Node.js driver itself is
actively maintained (see awd for the current release), while
the underlying WinAppDriver service is
described on the Appium ecosystem driver page as
"has not been maintained since 2022", which is why the wrapper now
includes a built-in installer (appium driver run windows install-wad) to pin a known-good WinAppDriver version.
Sibling differentiation:
winappdriver drives the same UIA
surface directly via the Microsoft service - pick that skill if the
project does not already use Appium or wants no Node.js dependency
on the test host. Pick appium-windows-driver when the project
already runs Appium for iOS / Android / Mac2 (per
desktop-test-strategy-reference
for the Mac2 sibling) and Windows is the next platform to add.
windows: scroll,
windows: clickAndDrag) beyond raw W3C WebDriver.appium: prerun / appium:postrun).appium driver install windows), pin the underlying WinAppDriver via appium driver run windows install-wad, then launch the server on 127.0.0.1:4723 (Install). Verify: curl http://127.0.0.1:4723/status returns HTTP 200 before proceeding; if it fails, the server is not listening - re-check the appium --port 4723 launch and the driver install.appium: vendor prefix - platformName: windows, appium:automationName: windows, appium:app (Declare session capabilities).Name / AccessibilityId and drives it end to end (Worked example).windows: scroll / clickAndDrag / keys), multi-window switching, and appium:prerun / appium:postrun PowerShell hooks as the suite needs them - see references/gestures-hooks-and-ci.md.junit-xml-analysis - full workflow in references/gestures-hooks-and-ci.md.Per awd:
npm install -g appium
appium driver install windowsThen install the underlying WinAppDriver server via the driver- provided helper (awd):
appium driver run windows install-wad
# Or pin a version:
appium driver run windows install-wad 1.2.1The helper downloads the pinned WinAppDriver installer to
C:\Program Files (x86)\Windows Application Driver\ - the standard
Microsoft install path described in
winappdriver.
Launch the Appium server:
appium --port 4723Standard Appium 2.x defaults - listens on 127.0.0.1:4723. Sessions
to this port forward Windows-specific calls to the WinAppDriver
service, which Appium spawns automatically when the first session
is created.
Per awd:
| Capability | Required | Notes |
|---|---|---|
platformName | yes | "Must be set to windows (case-insensitive)" (awd) |
appium:automationName | yes | "Must be set to windows (case-insensitive)" (awd) |
appium:app | yes (unless attaching) | UWP app ID or full executable path (awd) |
appium:appTopLevelWindow | conditional | "The hexadecimal handle of an existing application top level window" (awd) |
appium:appArguments | optional | Argument string passed to the launched app (awd) |
appium:prerun | optional | PowerShell script run before session start (awd) |
appium:postrun | optional | PowerShell script run after session end (awd) |
Example capability JSON:
{
"platformName": "windows",
"appium:automationName": "windows",
"appium:app": "C:\\Windows\\System32\\notepad.exe",
"appium:appArguments": "MyTestFile.txt"
}Drive one element end to end - launch Notepad, type into its editor, read the value back, and quit the session (Python client):
from appium import webdriver
from appium.options.windows import WindowsOptions
from selenium.webdriver.common.by import By
options = WindowsOptions()
options.platform_name = 'windows'
options.automation_name = 'windows'
options.app = r'C:\Windows\System32\notepad.exe'
driver = webdriver.Remote('http://127.0.0.1:4723', options=options)
editor = driver.find_element(By.NAME, 'Text editor')
editor.send_keys('Hello from Appium Windows')
assert 'Hello from Appium Windows' in editor.text
driver.quit()Locators (AccessibilityId, Name, ClassName, etc.) carry the
same UIA semantics as in winappdriver -
the driver proxies them through to WinAppDriver unchanged.
| Anti-pattern | Why it fails | Fix |
|---|---|---|
Omitting appium: prefix on driver capabilities | Appium 2.x requires the vendor prefix on non-W3C-standard caps | Always prefix (appium:automationName, appium:app, etc.) (awd) |
Targeting automationName: WinAppDriver (legacy) | Appium 2.x driver expects windows, case-insensitive | Use windows per awd |
| Hand-installing a random WinAppDriver MSI | Version mismatch with the Node driver's proxy code | appium driver run windows install-wad [version] (awd) |
| Running PowerShell hooks that block forever | Session creation hangs on the prerun script | Hooks must be short + non-interactive (awd) |
Hard-coded appTopLevelWindow checked into the repo | Hex window handle is per-launch, not stable | Discover at runtime via windows: launchApp or fresh-launch via appium:app |
| Mixing the Mac2 driver's capability shape on Windows | appium:bundleId (Mac2) isn't valid for Windows | Per-platform capability blocks; share only the W3C-standard caps |
Using windows: scroll with positive deltaY to scroll down | Wheel-delta sign mirrors Windows convention | Negative deltaY scrolls down (see gestures reference) |
mac2, xcuitest, uiautomator2).winappdriver. For tests where session
startup time dominates (very short tests, large suites), direct
WinAppDriver is faster.winappdriver
limitations).winappdriver.desktop-test-strategy-reference.junit-xml-analysis.