| 229 | |
| 230 | |
| 231 | def _build_parser() -> argparse.ArgumentParser: |
| 232 | parser = argparse.ArgumentParser( |
| 233 | prog="python -m webwright.tools.persistent_local_browser", |
| 234 | description="Manage a keep-alive local Chromium session shared across bash steps.", |
| 235 | ) |
| 236 | parser.add_argument( |
| 237 | "--workspace-dir", |
| 238 | default="", |
| 239 | help="Resolve --out / --session-file / --user-data-dir relative to this directory.", |
| 240 | ) |
| 241 | |
| 242 | sub = parser.add_subparsers(dest="command", required=True) |
| 243 | |
| 244 | create = sub.add_parser("create", help="Launch a detached Chromium and persist its connectUrl.") |
| 245 | create.add_argument("--out", default=DEFAULT_SESSION_FILE, help="Where to write the session JSON.") |
| 246 | create.add_argument( |
| 247 | "--user-data-dir", |
| 248 | default="", |
| 249 | help=f"Per-session Chromium user-data-dir (default: <workspace>/{DEFAULT_USER_DATA_SUBDIR}).", |
| 250 | ) |
| 251 | create.add_argument( |
| 252 | "--headless", |
| 253 | action=argparse.BooleanOptionalAction, |
| 254 | default=True, |
| 255 | help="Launch Chromium headless (default: True).", |
| 256 | ) |
| 257 | create.add_argument( |
| 258 | "--no-sandbox", |
| 259 | action=argparse.BooleanOptionalAction, |
| 260 | default=True, |
| 261 | help="Pass --no-sandbox (often required in containers/CI).", |
| 262 | ) |
| 263 | create.add_argument("--window-width", type=int, default=1280) |
| 264 | create.add_argument("--window-height", type=int, default=1800) |
| 265 | create.add_argument( |
| 266 | "--startup-timeout", |
| 267 | type=float, |
| 268 | default=30.0, |
| 269 | help="Seconds to wait for the DevTools URL to appear on stderr.", |
| 270 | ) |
| 271 | create.add_argument( |
| 272 | "--chromium-arg", |
| 273 | action="append", |
| 274 | default=[], |
| 275 | help="Extra Chromium command-line argument; repeat for multiple.", |
| 276 | ) |
| 277 | create.set_defaults(func=_cmd_create) |
| 278 | |
| 279 | info = sub.add_parser("info", help="Print the persisted session JSON and liveness.") |
| 280 | info.add_argument("--session-file", default=DEFAULT_SESSION_FILE) |
| 281 | info.set_defaults(func=_cmd_info) |
| 282 | |
| 283 | release = sub.add_parser("release", help="Terminate the persisted session.") |
| 284 | release.add_argument("--session-file", default=DEFAULT_SESSION_FILE) |
| 285 | release.add_argument( |
| 286 | "--delete-file", |
| 287 | action=argparse.BooleanOptionalAction, |
| 288 | default=True, |