Programming model
Playwright
Playwright uses async/await — code reads like normal modern JS/TS. Test functions are async, every browser interaction is awaited explicitly. Easier for devs already comfortable with Promise-based APIs; pairs naturally with TypeScript.
Cypress
Cypress uses a chained command queue — cy.get().click().should() — that doesn't execute imperatively. Commands enqueue and the runner processes them. The model is unique; teams either love the conciseness or fight the unfamiliar control flow for the first few weeks.