Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
98262d2
fix(deps): downgrade appium peer dependency to 3.0.0-rc.2
teo-nikolov Dec 30, 2025
3fc768d
Merge pull request #49 from AutomateThePlanet/releases/v1.2.0
teo-nikolov Jan 9, 2026
c100ffb
chore(release): 1.2.0 [skip ci]
semantic-release-bot Jan 9, 2026
6dc2125
fix: Bind commands to this instance (not prototype) so each driver in…
y-schwab Mar 6, 2026
26db919
feat(commands): add support for close app and launch app
yuri-schwab Feb 18, 2026
a8989c0
feat(tests): add unit tests and missing commands - recording, deletio…
yuri-schwab Feb 23, 2026
acf7271
fix(lint): lint
yuri-schwab Feb 23, 2026
6cce956
feat(commands): implement waitForAppLaunch and forceQuit
yuri-schwab Feb 25, 2026
9da1025
fix(recorder): fix screen recording
yuri-schwab Feb 25, 2026
073c566
fix(commands): match closeApp and launchApp implementation with appiu…
yuri-schwab Feb 25, 2026
9be6e42
test(unit): fix type issue with tests
yuri-schwab Feb 25, 2026
bdf44bc
test(unit): create unit testing for all repo
yuri-schwab Feb 26, 2026
97b57af
fix(capability): fix post run script
yuri-schwab Feb 28, 2026
47efa4c
fix: fix bugs and implemented end to end tests
yuri-schwab Mar 4, 2026
8aa49dd
fix(recorder): validate outputPath before rimraf
yuri-schwab Mar 6, 2026
4662035
fix(commands): add allow-insecure check for fs operations
yuri-schwab Mar 6, 2026
57c654a
feat(commands): add extra W3C commands
yuri-schwab Mar 5, 2026
fb6ebc8
fix(): lint
yuri-schwab Mar 6, 2026
fa52a19
Merge pull request #57 from Yuri-byte/feat/unit-testing-commands [ski…
teo-nikolov Mar 6, 2026
30cc867
Merge pull request #59 from Yuri-byte/feat/extra-w3c-commands
teo-nikolov Mar 6, 2026
c29b822
chore(release): 1.3.0 [skip ci]
semantic-release-bot Mar 6, 2026
964f94e
ci: enable npm trusted publishing
teo-nikolov Mar 6, 2026
1ea8a9b
Merge pull request #60 from AutomateThePlanet/ci/add-trusted-publishi…
teo-nikolov Mar 6, 2026
c6c91bb
ci: add registry URL for npm in release workflow
teo-nikolov Mar 6, 2026
b2db8c6
ci: fix permissions to allow workflow to push to the repository
teo-nikolov Mar 6, 2026
9f136d1
chore(release): 1.3.0 [skip ci]
semantic-release-bot Mar 6, 2026
560eb87
ci: add unit test workflow for pull requests and fix tests (#61)
teo-nikolov Mar 7, 2026
f25b000
fix: fixed not being able to attach to slow-starting classic apps on …
teo-nikolov Mar 9, 2026
cdca4a7
Merge pull request #62 from AutomateThePlanet/fix/classic-app-startup…
teo-nikolov Mar 9, 2026
a233063
fix: add stderr encoding for PowerShell session
teo-nikolov Mar 9, 2026
a0afceb
fix: fixed incorrect $pattern variable reference
teo-nikolov Mar 9, 2026
14b5e7e
Merge pull request #63 from AutomateThePlanet/fix/incorrect-variable-…
teo-nikolov Mar 9, 2026
4e37498
chore(release): 1.3.1 [skip ci]
semantic-release-bot Mar 9, 2026
d006ce0
initial enable devtools commit
teo-nikolov Apr 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ on:
- main
- develop

permissions:
contents: write
pull-requests: write
issues: write
id-token: write

jobs:
build:
runs-on: ubuntu-latest
Expand All @@ -17,6 +23,7 @@ jobs:
uses: actions/setup-node@v6
with:
node-version: 24.x
registry-url: 'https://registry.npmjs.org'
- run: npm install --no-package-lock
name: Install dependencies
- run: npm run build
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/unit-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Unit Tests

on:
pull_request:
branches:
- main
- develop

jobs:
test:

runs-on: windows-latest

steps:
- uses: actions/checkout@v6

- uses: actions/setup-node@v6
with:
node-version: '24.x'

- name: Install dev dependencies
run: npm install --no-package-lock

- name: Run unit tests
run: npm run test
77 changes: 77 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,80 @@
## [1.3.1](https://github.com/AutomateThePlanet/appium-novawindows-driver/compare/v1.3.0...v1.3.1) (2026-03-09)

### Bug Fixes

* add stderr encoding for PowerShell session ([a233063](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/a233063b4509e41c047fcc3603b29b944c5ac374))
* fixed incorrect $pattern variable reference ([a0afceb](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/a0afceb7e682219b5e82759c52e20c59bff1225f))
* fixed not being able to attach to slow-starting classic apps on session creation ([f25b000](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/f25b000533be1ef2a7c0bc350bf62a3cd1b60a45))

## [1.3.0](https://github.com/AutomateThePlanet/appium-novawindows-driver/compare/v1.2.0...v1.3.0) (2026-03-06)

### Features

* **commands:** add extra W3C commands ([57c654a](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/57c654a1e1e43c8a5d31ed8103aba338883efaa9))
* **commands:** add support for close app and launch app ([26db919](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/26db919c17ce74ff3c5ef2776544affecb32e2fc))
* **commands:** implement waitForAppLaunch and forceQuit ([6cce956](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/6cce9565ce51b9f0e354b14819f41a6fc39ffc50))
* **tests:** add unit tests and missing commands - recording, deletion and click and drag ([a8989c0](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/a8989c06816b3f9b5b5de82d85895106ab062aca))

### Bug Fixes

* Bind commands to this instance (not prototype) so each driver instance uses its own powershell session ([#56](https://github.com/AutomateThePlanet/appium-novawindows-driver/issues/56)) [skip ci] ([6dc2125](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/6dc2125c505b392f100036d532326202c0a9c8d4))
* **capability:** fix post run script ([97b57af](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/97b57af2fe05803ecb66548b8a32202fbe9a45e6))
* **commands:** add allow-insecure check for fs operations ([4662035](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/466203585796fe08fdb4b119991363246cb00dab))
* **commands:** match closeApp and launchApp implementation with appium windows driver ([073c566](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/073c566edb3528380196640eb33ee803b4fe2029))
* fix bugs and implemented end to end tests ([47efa4c](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/47efa4cf00fbac2e15e07e572cdf3e4453ec1020))
* lint ([fb6ebc8](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/fb6ebc83b1ed5c0fd0c5230d2948d4f5cb156b17))
* **lint:** lint ([acf7271](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/acf727179dfe1380d42a33a6d38f5175b22cb90d))
* **recorder:** fix screen recording ([9da1025](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/9da1025c994cb0c3221119690f01a0584b3cf333))
* **recorder:** validate outputPath before rimraf ([8aa49dd](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/8aa49dd27b2b9bb54329efa0555bb5ef21dc36b5))

### Miscellaneous Chores

* **release:** 1.3.0 [skip ci] ([c29b822](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/c29b8223fc6f0435363d6207af0ab1185b811b60))

## [1.3.0](https://github.com/AutomateThePlanet/appium-novawindows-driver/compare/v1.2.0...v1.3.0) (2026-03-06)

### Features

* **commands:** add extra W3C commands ([57c654a](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/57c654a1e1e43c8a5d31ed8103aba338883efaa9))
* **commands:** add support for close app and launch app ([26db919](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/26db919c17ce74ff3c5ef2776544affecb32e2fc))
* **commands:** implement waitForAppLaunch and forceQuit ([6cce956](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/6cce9565ce51b9f0e354b14819f41a6fc39ffc50))
* **tests:** add unit tests and missing commands - recording, deletion and click and drag ([a8989c0](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/a8989c06816b3f9b5b5de82d85895106ab062aca))

### Bug Fixes

* Bind commands to this instance (not prototype) so each driver instance uses its own powershell session ([#56](https://github.com/AutomateThePlanet/appium-novawindows-driver/issues/56)) [skip ci] ([6dc2125](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/6dc2125c505b392f100036d532326202c0a9c8d4))
* **capability:** fix post run script ([97b57af](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/97b57af2fe05803ecb66548b8a32202fbe9a45e6))
* **commands:** add allow-insecure check for fs operations ([4662035](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/466203585796fe08fdb4b119991363246cb00dab))
* **commands:** match closeApp and launchApp implementation with appium windows driver ([073c566](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/073c566edb3528380196640eb33ee803b4fe2029))
* fix bugs and implemented end to end tests ([47efa4c](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/47efa4cf00fbac2e15e07e572cdf3e4453ec1020))
* lint ([fb6ebc8](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/fb6ebc83b1ed5c0fd0c5230d2948d4f5cb156b17))
* **lint:** lint ([acf7271](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/acf727179dfe1380d42a33a6d38f5175b22cb90d))
* **recorder:** fix screen recording ([9da1025](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/9da1025c994cb0c3221119690f01a0584b3cf333))
* **recorder:** validate outputPath before rimraf ([8aa49dd](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/8aa49dd27b2b9bb54329efa0555bb5ef21dc36b5))

## [1.2.0](https://github.com/AutomateThePlanet/appium-novawindows-driver/compare/v1.1.0...v1.2.0) (2026-01-09)

### Features

* add "none" session option to start without attaching to any element ([22586a2](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/22586a237f20e975adee25c13fba8c649420574d))
* add appWorkingDir, prerun, postrun, and isolatedScriptExecution capabilities ([5a581ae](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/5a581ae7ae1e1a013cb8e332454f70762f8749c7))

### Bug Fixes

* allow elementId with optional x/y offsets for click/hover ([2d01246](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/2d01246e009e2c7fd67165fc1d313446870021d3))
* **deps:** downgrade appium peer dependency to 3.0.0-rc.2 ([98262d2](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/98262d297268cf40259946e4a52038103618f3b4))
* make modifierKeys case-insensitive ([7a05300](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/7a05300ef4a0792a9c1160dfab55537c96967f08))
* update ESLint config ([2e08f8d](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/2e08f8d5a1df9bf277b2c521584dddb5b0935e72))
* version bump ([a872a23](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/a872a23fec5f10f692b9c61ba7f8d671f360211f))

### Miscellaneous Chores

* add extra logging ([5da452f](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/5da452fa71608d3f52a92c7ea6f82a78ff3139a6))
* bump peerDependency appium to ^3.1.0 ([cdee0ca](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/cdee0ca44a1423312351449b3227035976ba396f))
* configure semantic-release branches for stable and preview releases ([a4a1fa2](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/a4a1fa2b0b20c4494919699e8d307793cf18dc04))
* remove unnecessary ESLint ignore comments ([4c70038](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/4c7003809c6b6668315ed7e036b5ee6cf3595e51))
* upgrade dependencies and devDependencies to latest versions ([4fd016c](https://github.com/AutomateThePlanet/appium-novawindows-driver/commit/4fd016c5adc091305974b3a41c22423cadf6e3ab))

## [1.1.0](https://github.com/AutomateThePlanet/appium-novawindows-driver/compare/v1.0.1...v1.1.0) (2025-08-06)

### Features
Expand Down
62 changes: 55 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ appWorkingDir | Optional working directory path for the application.
prerun | An object containing either `script` or `command` key. The value of each key must be a valid PowerShell script or command to be executed prior to the WinAppDriver session startup. See [Power Shell commands execution](#power-shell-commands-execution) for more details. Example: `{script: 'Get-Process outlook -ErrorAction SilentlyContinue'}`
postrun | An object containing either `script` or `command` key. The value of each key must be a valid PowerShell script or command to be executed after WinAppDriver session is stopped. See [Power Shell commands execution](#power-shell-commands-execution) for more details.
isolatedScriptExecution | Whether PowerShell scripts are executed in an isolated session. Default is `false`.
webviewDevtoolsPort | The local port number to use for devtools communication. By default the first free port from 10900..11000 range is selected. Consider setting the custom value if you are running parallel tests.

Please note that more capabilities will be added as the development of this driver progresses. Since it is still in its early stages, some features may be missing or subject to change. If you need a specific capability or encounter any issues, please feel free to open an issue.

Expand Down Expand Up @@ -516,31 +517,78 @@ Position | Type | Description | Example

### windows: startRecordingScreen

To be implemented.
Starts screen recording using the **bundled ffmpeg** included with the driver. There is no system PATH fallback: if the bundle is not present (e.g. driver was not installed via npm with dependencies), screen recording is not available and the driver reports a clear error.

### windows: stopRecordingScreen

To be implemented.
Stops the current screen recording and returns the video (base64 or uploads to a remote path if specified).

### windows: deleteFile

To be implemented.
Deletes a file on the Windows machine. Uses PowerShell `Remove-Item -Path ... -Force`. Paths containing `[`, `]`, or `?` use `-LiteralPath` for correct interpretation.

#### Arguments

Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
path | string | yes | Absolute or relative path to the file to delete. | `C:\Temp\file.txt`

### windows: deleteFolder

To be implemented.
Deletes a folder on the Windows machine. Uses PowerShell `Remove-Item -Path ... -Force` with optional `-Recurse`. Paths containing `[`, `]`, or `?` use `-LiteralPath`.

#### Arguments

Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
path | string | yes | Absolute or relative path to the folder to delete. | `C:\Temp\MyFolder`
recursive | boolean | no | If true (default), delete contents recursively. If false, only remove the folder when empty. | `true`

### windows: launchApp

To be implemented.
Re-launches the application configured in the `app` session capability. The app path or App User Model ID (AUMID) must have been set when the session was created. Typically used to reopen an app after it has been closed with `windows: closeApp`.

This command takes no arguments.

#### Example

```javascript
// Re-launch the app set in the session capability
await driver.executeScript('windows: launchApp', []);
```

### windows: closeApp

To be implemented.
Closes the current root application window by sending a close command via the Windows UI Automation WindowPattern. Clears the root element reference in the session afterward. Throws a `NoSuchWindowError` if no active window is found.

This command takes no arguments.

#### Example

```javascript
// Close the current app window
await driver.executeScript('windows: closeApp', []);
```

### windows: clickAndDrag

To be implemented.
Performs a click-and-drag: move to the start position, press the mouse button, move to the end position over the given duration, then release. Start and end can be specified by element (center or offset) or by screen coordinates. Uses the same Windows input APIs as other pointer actions.

#### Arguments

Name | Type | Required | Description | Example
--- | --- | --- | --- | ---
startElementId | string | no* | Element ID for drag start. Use *or* startX/startY. | `1.2.3.4.5`
startX | number | no* | X coordinate for drag start (with startY). | `100`
startY | number | no* | Y coordinate for drag start (with startX). | `200`
endElementId | string | no* | Element ID for drag end. Use *or* endX/endY. | `1.2.3.4.6`
endX | number | no* | X coordinate for drag end (with endY). | `300`
endY | number | no* | Y coordinate for drag end (with endX). | `400`
modifierKeys | string or string[] | no | Keys to hold during drag: `shift`, `ctrl`, `alt`, `win`. | `["ctrl"]`
durationMs | number | no | Duration of the move from start to end (default: 500). | `300`
button | string | no | Mouse button: `left` (default), `middle`, `right`, `back`, `forward`. | `left`

\* Provide either startElementId or both startX and startY; and either endElementId or both endX and endY.

## Development

Expand Down
3 changes: 3 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@ import appiumConfig from '@appium/eslint-config-appium-ts';
export default defineConfig(
eslint.configs.recommended,
...appiumConfig,
{
files: ['test/e2e/**/*.ts'],
},
);
30 changes: 30 additions & 0 deletions lib/commands/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,3 +227,33 @@ export async function handleKeyAction(this: NovaWindowsDriver, action: KeyAction
}
}
}

export async function releaseActions(this: NovaWindowsDriver): Promise<void> {
if (this.keyboardState.shift) {
keyUp(Key.SHIFT);
keyUp(Key.R_SHIFT);
this.keyboardState.shift = false;
}
if (this.keyboardState.ctrl) {
keyUp(Key.CONTROL);
keyUp(Key.R_CONTROL);
this.keyboardState.ctrl = false;
}
if (this.keyboardState.meta) {
keyUp(Key.META);
keyUp(Key.R_META);
this.keyboardState.meta = false;
}
if (this.keyboardState.alt) {
keyUp(Key.ALT);
keyUp(Key.R_ALT);
this.keyboardState.alt = false;
}
for (const key of this.keyboardState.pressed) {
keyUp(key);
}
this.keyboardState.pressed.clear();
mouseUp(0);
mouseUp(1);
mouseUp(2);
}
Loading