Твій тест і браузер — це два окремі процеси. Тест виконується в Node.js, браузер (Chromium/Firefox/WebKit) — окрема програма зі своєю пам’яттю. Вони спілкуються через протокол обміну повідомленнями — у Chromium це CDP (Chrome DevTools Protocol) поверх WebSocket, той самий протокол, яким користується сама вкладка DevTools.
Кожна команда, яку Playwright шле браузеру — click, goto, textContent — це JSON-повідомлення з унікальним id. CDP побудований на JSON-RPC: “every command sent by the client must have a unique id… responses from Chromium carry the same id”. Браузер, відповідаючи, включає той самий id, щоб Playwright міг зіставити відповідь із запитом навіть коли кілька команд летять одночасно.
Звідси й наслідок: жодна дія, що взаємодіє з браузером, не може виконатись миттєво в тому ж рядку коду — вона мусить дочекатись відповіді. Тому майже всі методи, які взаємодіють із браузером, повертають Promise (не буквально всі — page.locator(), getByRole(), browser.contexts() синхронні, бо нічого не питають у браузера в момент виклику).
TypeScript — команда і відповідь, спрощено за структурою CDP
// Playwright відправляє (спрощено):
{ id: 42, method: 'Input.dispatchMouseEvent', params: { /* координати кліку */ } }
// Браузер відповідає, коли клік реально стався:
{ id: 42, result: { /* ... */ } }
// id той самий — тому Playwright точно знає:
// "це відповідь саме на ТОЙ клік, а не на щось інше"
🗣 Як читати вголос Тест і браузер — два окремі процеси, які спілкуються через протокол обміну повідомленнями, а не викликають функції одне в одного напряму. У Chromium це відбувається через CDP, Chrome DevTools Protocol, поверх WebSocket — той самий протокол яким користується сама вкладка DevTools у браузері. Кожна команда, яку Playwright шле браузеру, це JSON-повідомлення з унікальним id, і браузер, відповідаючи, повертає той самий id, щоб можна було зіставити яка відповідь до якого запиту належить, навіть коли кілька команд летять одночасно. Саме тому жодна дія, що взаємодіє з браузером, не може виконатись миттєво в тому самому рядку коду — вона мусить дочекатись відповіді. І саме тому майже всі методи, які взаємодіють із браузером, повертають Promise — хоча не буквально всі: page.locator, getByRole, browser.contexts синхронні, бо нічого не питають у браузера в момент виклику.