The honest tell
Five passive flags that real Chrome sets and most automation contexts get wrong.
What's measured on this page
-
navigator.webdriver — must be false or undefined.
- navigator.plugins.length — non-zero in real Chrome.
- navigator.languages — non-empty.
- User-Agent — does not contain HeadlessChrome.
- Notification.permission vs permissions.query({name:"notifications"}) — should agree.