Merge pull request #1267 from zsh-users/add-playwright

Add playwright completion
This commit is contained in:
Shohei YOSHIDA 2026-05-21 11:48:06 +09:00 committed by GitHub
commit 45e2c02492
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 340 additions and 0 deletions

340
src/_playwright Normal file
View File

@ -0,0 +1,340 @@
#compdef playwright
# ------------------------------------------------------------------------------
# Copyright (c) 2026 Github zsh-users - https://github.com/zsh-users
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
# ------------------------------------------------------------------------------
# Description
# -----------
#
# Completion script for playwright 1.60.0 (https://playwright.dev/)
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Shohei Yoshida (https://github.com/syohex) <syohex@gmail.com>
#
# ------------------------------------------------------------------------------
_playwright() {
typeset -A opt_args
local context state line
local curcontext="$curcontext"
local ret=1
local -a browsers=(chromium firefox webkit)
local -a installable_browsers=(chromium firefox webkit chromium-headless-shell)
local -a target_languages=(javascript playwright-test python python-async python-pytest
csharp csharp-mstest csharp-nunit csharp-xunit java java-junit)
local -a channels=(chrome chrome-beta msedge-dev)
local -a pager_formats=(Letter Legal Tabloid Ledger A0 A1 A2 A3 A4 A5 A6)
local -a loop_providers=(claude copilot opencode vscode vscode-legacy)
local -a trace_modes=(on off on-first-retry on-all-retries retain-on-failure
retain-on-first-failure retain-on-failure-and-retries)
_arguments -C -A "-*" \
'(-v --verbose)'{-v,--verbose}'[output the version number]' \
'(- *)'{-h,--help}'[display help for command]' \
'1: :_playwright_subcommands' \
'*::arg:->args' \
&& ret=0
case "$state" in
(args)
local -a options=('(- *)'{-h,--help}'[display help for command]')
case $words[1] in
(help)
options+=('1: :_playwright_subcommands')
;;
(open|codegen|cr|ff|wk|screenshot|pdf|show-trace|test)
options+=(
'(-b --browser)'{-b,--browser}'[browser to use(default: chromium)]:browser:($browsers)' )
;|
(open|codegen|cr|ff|wk|screenshot|pdf)
options+=(
'--block-service-workers[block service workers]'
'--channel[Chromium distribution channel]:channel:($channels)'
'--color-scheme[emulate preferred color scheme]:scheme:(light dark)'
'--device[emulate device(e.g. "iPhone 11")]:device'
'--geolocation[specify geolocation coordinates]:coordinates'
'--ignore-https-errors[ignore https errors]'
'--load-storage[load context storage state from the file]:file:_files'
'--lang[specify language/locale(e.g. "en-GB")]:language'
'--proxy-server[specify proxy server]:proxy'
'--proxy-bypass[comma-separated domains to bypass proxy]:bypass'
'--save-har[save HAR file with all network activity at the end]:file:_files'
'--save-har-glob[filter entries in the HAR by matching URL against this glob pattern]:pattern'
'--save-storage[save context storage state at the end]:file:_files'
'--timezone[time zone to emulate]:time_zone'
'--timeout[timeout for Playwright actions in milliseconds(default: no timeout)]:timeout'
'--user-agent[specify user agent string]:user_agent'
'--user-data-dir[use the specified user data directory instead of a new context]:dir:_files -/'
'--viewport-size[specify browser viewport size in pixels(e.g. "1280, 720")]:size'
'*::url:_urls'
)
;|
(install)
options+=(
'--with-deps[install system dependencies for browsers]'
'--dry-run[do not execute installation, only print information]'
'(- *)--list[prints list of browsers from all playwright installations]'
'--force[force reinstall of already installed browsers]'
'--only-shell[only install headless shell when installing chromium]'
'--no-shell[do not install chromium headless shell]'
'*::browser:($installable_browsers)'
)
;;
(uninstall)
options+=('--all[remove all browsers used by any Playwright installation from the system]')
;;
(install-deps)
options+=('--dry-run[do not modify the system]')
;;
(screenshot|pdf)
options+=(
'--wait-for-selector[wait for selector before taking a screenshot]:selector'
'--wait-for-timeout[wait for timeout in milliseconds before taking a screenshot]:timeout'
'*:: :_files'
)
;|
(screenshot)
options+=(
'--full-page[take a full page screenshot]'
'*:: :_files'
)
;;
(pdf)
options+=(
'--pager-format[pager format]:format:($pager_formats)'
'*:: :_files'
)
;;
(show-trace)
options+=(
'(-h --host)'{-h,--host}'[host to serve trace on]:host'
'(-p --port)'{-p,--port}'[port to serve trace on]:port'
'--stdin[accept trace URLs over stdin to update the viewer]'
'*:: :_files'
)
;;
(trace)
_playwright_trace && ret=0
return ret
;;
(test)
options+=(
'(-c --config)'{-c,--config}'[configuration file or a test directory]:config:_files'
'--debug[run tests with Playwright Inspector]:mode:(inspector cli)'
'--fail-on-flaky-tests[fail if any test is flagged as flaky]'
'--forbid-only[fail if test.only is called]'
'--fully-parallel[run all tests in parallel]'
'(-g --grep)'{-g,--grep}'[only run tests matching this regular expression]:pattern'
'--global-timeout[maximum time this test suite can run in milliseconds]:timeout'
'--grep-invert[only run tests that do not match this regular expression]:pattern'
'--headed[run tests in headed browsers]'
'--ignore-snapshots[ignore screenshot and snapshot expectations]'
'(-j --workers)'{-j,--workers}'[number of concurrent workers or percentage of logical CPU cores]:workers'
'--last-failed[only re-run the failures]'
'--list[collect all the tests and report them, but do not run]'
'--max-failures[stop after the first N failures]:num'
'--no-deps[do not run project dependencies]'
'--only-changed[only run test files that have been changed between "HEAD" and "ref"]:ref'
'--output[folder for output artifacts(default: "test-results")]:dir:_files -/'
'--pass-with-no-tests[make test run succeed even if no tests were found]'
'*--project[only run tests from the specified list of projects]:project'
'--quiet[suppress stdio]'
'--repeat-each[run each test N times(default: 1)]:num'
'--reporter[reporter to use, comma-separated]:reporter:_playwright_reporters'
'--retries[maximum retry count for flaky tests(default: no retries)]:num'
'--run-agents[run agents to generate the code for page.perform]:agent:(missing all none)'
'--shard[shard tests and execute only the selected shard(e.g. "3/5")]:shard'
'--test-list[path to a file containing a list of tests to run]:file:_files'
'--test-list-invert[path to a file containing a list of tests to skip]:file:_files'
'--timeout[specify test timeout threshold in milliseconds, zero for unlimited(default: 30000)]:timeout'
'--trace[force tracing mode]:mode:($trace_modes)'
'--tsconfig[path to a single tsconfig applicable to all imported files]:file:_files'
'(-u --update-snapshots)'{-u,--update-snapshots}'[update snapshots with actual results]:mode:(all changed missing none)'
'--ui[run tests in interactive UI mode]'
'--ui-host[host to server UI on]:host'
'--ui-port[port to server UI on]:port'
'--update-source-method[choose the way source is updated(default: patch)]:method:(overwrite 3way patch)'
'-x[stop after the first failure]'
'*:: :_files'
)
;;
(show-report)
options+=(
'(-h --host)'{-h,--host}'[host to serve report on]:host'
'(-p --port)'{-p,--port}'[port to serve report on]:port'
)
;;
(merge-reports)
options+=(
'(-c --config)'{-c,--config}'[configuration file]:file:_files'
'--reporter[reporter to use, comma-separated (default: list)]:reporter:_playwright_reporters'
'*:: :_files -/'
)
;;
(clear-cache)
options+=(
'(-c --config)'{-c,--config}'[configuration file or a test directory]:file:_files'
)
;;
(init-agents)
options+=(
'--loop[agentic loop provider]:provider:($loop_providers)'
'(-c --config)'{-c,--config}'[configuration file to find a project to use for seed test]:file:_files'
'--project[project to use for seed test]:_files -/'
'--prompts[include prompts in the agent initialization]'
)
;;
esac
_arguments "$options[@]" && ret=0
;;
esac
return ret
}
(( $+functions[_playwright_subcommands] )) ||
_playwright_subcommands() {
local -a commands=(
"open:open page in browser specified via -b, --browser"
"codegen:open page and generate code for user actions"
"install:ensure browsers necessary for this version of Playwright are installed"
"uninstall:remove browsers used by this installation of Playwright from the system"
"install-deps:install dependencies necessary to run browsers"
"cr:open page in Chromium"
"ff:open page in Firefox"
"wk:open page in WebKit"
"screenshot:capture a page screenshot"
"pdf:save page as PDF"
"show-trace:show trace viewer"
"trace:inspect trace files from the command line"
"test:run tests with Playwright Test"
"show-report:show HTML report"
"merge-reports:merge multiple blob reports into a single report"
"clear-cache:clear build and test caches"
"init-agents:Initialize repository agents"
"help:display help for command"
)
_describe -t commands 'command' commands "$@"
}
(( $+functions[_playwright_trace] )) ||
_playwright_trace() {
local ret=1
_arguments -C \
'(- *)'{-h,--help}'[Print this usage information]' \
'1: :_playwright_trace_subcommands' \
'*:: :->arg' \
&& ret=0
case $state in
(arg)
local -a options=(
'(- *)'{-h,--help}'[display help for command]'
'*:: :_files'
)
case $words[1] in
(help)
options=('1:command:_playwright_trace_subcommands')
;;
(actions)
options+=(
'--grep[filter actions by title pattern]:pattern'
'--errors-only[only show failed actions]'
)
;;
(requests)
options+=(
'--grep[filter by URL pattern]:pattern'
'--method[filter by HTTP method]:method:(DELETE GET HEAD POST PUT CONNECT OPTIONS TRACE PATCH)'
'--status[filter by status code]:code'
'--failed[only show failed request(status >= 400)]'
)
;;
(console)
options+=(
'--errors-only[only show errors]'
'--warnings[show errors and warnings]'
'--browser[only browser console messages]'
'--stdio[only stdout/stderr]'
)
;;
(snapshot)
options+=(
'--name[snapshot phase]:name:(before input after)'
'--serve[serve snapshot on localhost and keep running]'
)
;;
(screenshot|attachment)
options+=('(-o --output)'{-o,--output}'[output file path]:file:_files')
;;
esac
_arguments "$options[@]" && ret=0
;;
esac
return ret
}
(( $+functions[_playwright_trace_subcommands] )) ||
_playwright_trace_subcommands() {
local -a commands=(
"open:extract trace file for inspection"
"close:remove extracted trace data"
"actions:list actions in the trace"
"action:show details of a specific action"
"requests:show network requests"
"request:show details of a specific network request"
"console:show console messages"
"errors:show errors with stack traces"
"snapshot:run a playwright-cli command against a DOM snapshot"
"screenshot:save screencast screenshot for an action"
"attachments:list trace attachments"
"attachment:extract a trace attachment by its number"
"install-skill:install SKILL.md for LLM integration"
"help:display help for command"
)
_describe -t commands 'command' commands "$@"
}
(( $+functions[_playwright_reporters] )) ||
_playwright_reporters() {
local -a reporters=(list line dot json junit null github html blob)
_values -s ',' reporter $reporters
}
_playwright "$@"
# Local Variables:
# mode: Shell-Script
# sh-indentation: 2
# indent-tabs-mode: nil
# sh-basic-offset: 2
# End:
# vim: ft=zsh sw=2 ts=2 et