Migrate
Puppeteer
Turn Puppeteer and jest-puppeteer tests into Autonomy test cases of outcome steps, without waitForSelector and hand-written retry loops.
Puppeteer scripts are imperative and often mix testing with scraping. Migrate only the scripts that check how your product behaves; leave data-collection scripts where they are.
Prompt
Paste this into a coding agent connected to the Autonomy MCP server, from inside the repository:
Migrate the Puppeteer tests in this repository to Autonomy with the Autonomy MCP tools.
Setup
1. Call autonomy_project_list and ask me which project to use. Call autonomy_environment_list with its projectId and ask me which environment to run in.
2. Call autonomy_test_case_list with the projectId. Skip tests that an existing test case already covers.
For each test
3. Create ONE test case with autonomy_test_case_create: projectId, name = the test title, platforms = ["web"]. Skip scripts that only collect data and check nothing; list them instead.
4. Write each step as an outcome: what is true when the step is done, in plain words ("A new account exists for a fresh email"). Say what the test proves, not how: no clicks, selectors, waits, retries or expect calls. One step can cover several actions that serve one outcome. Use 12 steps or fewer; split a longer test into several test cases.
5. Each step is {id, text, attachments[]}. Each attachment has id, kind and exact. Kinds: account {role}, inbox (no address = a fresh inbox per run), phone, file, screenshot, data {label, value} or {label, intent} for generated data.
6. Never write a password, token or key into a step. For each account the scripts sign in as, ask me to save it in the dashboard (the project's Sign-ins, New sign-in) and tell you its account name, then start the test with a step such as "The store owner is signed in" with that account attached. For other secrets in process.env, propose names and reference them as {{env.NAME}}; add them as secret values with autonomy_environment_upsert only after I agree.
7. Values the test is about (a value read with page.$eval or page.evaluate and checked by expect, a coupon that must apply, input that must be refused): a data attachment with exact: true. Other config: {{env.NAME}}.
8. Sign-up data (emails, names, passwords, random suffixes): a fresh inbox and generated data, never a fixed value.
9. Drop waitForSelector, waitForNavigation, sleeps and retry loops. Drop request interception that only stubs responses: runs test the real product. If a test only works with stubbed responses, don't migrate it; list it instead.
Afterwards
10. If the suite groups tests (describe blocks, files), offer to create a test plan per group with autonomy_test_plan_create.
11. Run one migrated test case with autonomy_run_trigger in the environment I picked. Follow it with autonomy_run_get (pass the last cursor and waitMs) until it ends. For any step that didn't pass, read autonomy_run_step_actions and tell me what happened.
12. Finish with a table: source test, test case ID, number of steps, and anything you couldn't map.Mapping
| Puppeteer | Autonomy |
|---|---|
One test() or script | One test case. |
describe() blocks, files | Optionally, a test plan. |
page.goto, page.click, page.type, selectors | Folded into the step's outcome. The agent finds the controls. |
page.$eval or page.evaluate feeding expect | The outcome, with the expected value as a data attachment marked Exact. |
waitForSelector, waitForNavigation, sleeps, retry loops | Dropped. |
| Login helpers, cookies set by hand | A signed-in step with a saved sign-in attached as an account. |
process.env.X | {{env.X}}, marked secret when it's a credential. |
| Base URL constants | The environment's Web target. |
uploadFile() | A file attachment from the project's Files. |
page.screenshot() | A screenshot attachment. |
setRequestInterception stubs | Not migrated. Runs use the real product. |
| Response listeners that check a request | An outcome about the result. The run keeps every request in its Network tab. |
| Scraping scripts | Not migrated. |
See the migration overview for a worked example.
Didn’t find it?