fix(create-wdio): stop exiting on SIGINT at import so wdio run ends sessions gracefully by Winify · Pull Request #16158 · webdriverio/webdriverio · GitHub
Skip to content

fix(create-wdio): stop exiting on SIGINT at import so wdio run ends sessions gracefully - #16158

Open
Winify wants to merge 1 commit into
mainfrom
vg/create-wdio-sigint
Open

Winify wants to merge 1 commit into
mainfrom
vg/create-wdio-sigint

Conversation

@Winify

@Winify Winify commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Problem

create-wdio registered a SIGINT listener at module load (packages/create-wdio/src/utils.ts). @wdio/cli imports create-wdio/config/cli, so on Ctrl+C every wdio run called process.exit(1) ("Goodbye 👋") about 60 ms after the signal, before the launcher's graceful shutdown could delete the WebDriver sessions. Sessions stayed open on the grid or device until they timed out. This affects every framework and was introduced in #14618 (v10.0.0).

Fix

The listener is now added only while the wizard prompts or installs, and removed in a finally afterwards (withSigintExit):

  • npm init wdio
  • the config questionnaire (not with --yes)
  • the missing-config prompt and the install that follows it
  • the Appium installer prompt

It never reaches a test run.

Verification

  • npx vitest run packages/create-wdio packages/wdio-cli/tests/commands: 233/233. The new tests/sigint.test.ts fails on the old code.
  • New smoke suite sigintGracefulShutdown (pnpm run test:smoke sigintGracefulShutdown) sends SIGINT to a running wdio run and checks for "Ending WebDriver sessions gracefully". It fails with "Goodbye 👋" when the module-load listener is put back. It is skipped on Windows, where child.kill('SIGINT') is not a console Ctrl+C.
  • Real device (Appium + Android emulator, Mocha), group SIGINT during a test:
Exit Time Session afterwards
main 1, "Goodbye" 0.058 s leaked
this PR (3 runs) 130, graceful shutdown 1.0–1.8 s deleted

…essions gracefully

create-wdio registered a SIGINT listener at module load. @wdio/cli imports
create-wdio/config/cli, so on Ctrl+C every `wdio run` called process.exit(1)
before the launcher's graceful shutdown could delete the WebDriver sessions,
leaving them open on the grid or device until they timed out.

The listener is now added only while the wizard prompts or installs
(npm init wdio, the config questionnaire, the missing-config prompt and the
Appium installer prompt) and removed afterwards, so it never reaches a test
run. Regression from #14618.

A new smoke suite, sigintGracefulShutdown, sends SIGINT to a running
`wdio run` and checks the graceful shutdown path.
@Winify
Winify requested a review from a team as a code owner October 20, 2026 20:06
@Winify Winify added PR: Bug Fix 🐛 PRs that contain bug fixes backport-requested PRs with this label are considered to be applied to the last maintained version labels Oct 20, 2026
@pkg-pr-new

pkg-pr-new Bot commented Oct 20, 2026

Copy link
Copy Markdown

Open in StackBlitz

create-wdio

npm i https://pkg.pr.new/webdriverio/webdriverio/create-wdio@16158

eslint-plugin-wdio

npm i https://pkg.pr.new/webdriverio/webdriverio/eslint-plugin-wdio@16158

wdio

npm i https://pkg.pr.new/webdriverio/webdriverio/wdio@16158

@wdio/ai-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/ai-service@16158

@wdio/allure-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/allure-reporter@16158

@wdio/appium-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/appium-service@16158

@wdio/browser-runner

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/browser-runner@16158

@wdio/cli

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/cli@16158

@wdio/concise-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/concise-reporter@16158

@wdio/config

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/config@16158

@wdio/cucumber-framework

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/cucumber-framework@16158

@wdio/cucumberjs-json-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/cucumberjs-json-reporter@16158

@wdio/display-server

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/display-server@16158

@wdio/dot-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/dot-reporter@16158

@wdio/firefox-profile-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/firefox-profile-service@16158

@wdio/globals

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/globals@16158

@wdio/jasmine-framework

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/jasmine-framework@16158

@wdio/json-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/json-reporter@16158

@wdio/junit-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/junit-reporter@16158

@wdio/lighthouse-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/lighthouse-service@16158

@wdio/local-runner

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/local-runner@16158

@wdio/logger

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/logger@16158

@wdio/mocha-framework

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/mocha-framework@16158

@wdio/protocols

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/protocols@16158

@wdio/repl

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/repl@16158

@wdio/reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/reporter@16158

@wdio/runner

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/runner@16158

@wdio/sauce-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/sauce-service@16158

@wdio/session

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/session@16158

@wdio/shared-store-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/shared-store-service@16158

@wdio/smoke-test-cjs-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/smoke-test-cjs-service@16158

@wdio/smoke-test-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/smoke-test-reporter@16158

@wdio/smoke-test-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/smoke-test-service@16158

@wdio/snapshot

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/snapshot@16158

@wdio/spec-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/spec-reporter@16158

@wdio/static-server-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/static-server-service@16158

@wdio/sumologic-reporter

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/sumologic-reporter@16158

@wdio/testingbot-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/testingbot-service@16158

@wdio/types

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/types@16158

@wdio/utils

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/utils@16158

@wdio/webdriver-mock-service

npm i https://pkg.pr.new/webdriverio/webdriverio/@wdio/webdriver-mock-service@16158

webdriver

npm i https://pkg.pr.new/webdriverio/webdriverio/webdriver@16158

webdriverio

npm i https://pkg.pr.new/webdriverio/webdriverio@16158

commit: 2d951cb

@greptile-apps

greptile-apps Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] The change affects Ctrl+C handling across WDIO setup and test runs.

The fix appears safe to merge, with a non-blocking gap in the shutdown smoke test.

Findings

  1. P2 Forced shutdown still passes ▶

Summary

Removes the import-time SIGINT listener from create-wdio and limits the goodbye exit to wizard work.

  • Ctrl+C during test runs now lets WDIO close WebDriver sessions.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Import create-wdio] --> B[No SIGINT listener added]
    C[Start wizard work] --> D[Add scoped SIGINT listener]
    D --> E[Prompt or install]
    E --> F[Remove listener in finally]
    F --> G[Return to CLI]
    G --> H[Start test run]
    H --> I[SIGINT reaches launcher shutdown]
Loading

Reviews (1) · Last reviewed commit: "fix(create-wdio): stop exiting on SIGINT..." · Reviewed by Greptile

Comment thread tests/smoke.runner.js
Comment on lines +1456 to +1461

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Forced shutdown still passes

The smoke test ignores the child's exit code and signal, then checks only output. The launcher prints Ending WebDriver sessions gracefully before calling runner.shutdown(). A run that hangs during shutdown can print that message, reach the 30-second SIGKILL, and still pass.

Record whether the watchdog fired and reject forced termination. Also check that the session was deleted, rather than relying only on the shutdown message.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-requested PRs with this label are considered to be applied to the last maintained version PR: Bug Fix 🐛 PRs that contain bug fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant