Conversion Bot Test Hub

Page chrome: #brand-home and #nav-hub are always present — both are same-origin links to /. Bot click → URL change → PASS.

Conversion Bot Test Hub

Page role: Crawl entry point. The bot starts here, discovers every link below, and can follow them when crawl.max_pages allows.

Each list item is a normal <a href> click target. Clicking it changes the URL → bot scores PASS.

Badges document the intended outcome for elements on the destination page, not for the hub link itself.

Links & clicks

/links mixed

Opens the click lab: internal nav, tel/mailto/sms/whatsapp/viber/tg intents, popups, role=button, and intentional dead buttons.

/modal PASS

Button that reveals a hidden contact form (bot “opened a visible form” path), then can submit it.

Classic form submit

Standard POST form. Successful submit redirects to /forms/thanks (URL change).

Standard POST that always redirects back with server error messages (page text changes; no thanks page).

Full-page POST that re-renders the same URL with a success banner (content change, no AJAX).

Mixed controls (select, radio, checkbox, number, date) then redirect to thanks.

AJAX form submit

fetch submit; thank-you text is injected above the form (same URL, content change).

fetch submit; thank-you modal overlay appears (DOM/text change, not a browser window).

fetch returns 422; error text is shown inline. Still an observable content change for the bot.

fetch returns 422; error modal overlay appears. Still PASS for the bot via content change.

AJAX 422 with per-field errors rendered as text under each input.

Custom JS validation: messages under inputs + setCustomValidity. Promo rule usually fails bot autofill.

* Error UX still changes visible text, so the bot may treat content change as PASS unless :invalid is reported.

Broken / intentional FAIL forms

Visible fields but no submit button — bot cannot complete submit.

Pattern field that auto-fill cannot satisfy — browser keeps :invalid after click.

preventDefault on submit — URL and page text stay unchanged.

Includes required type=file, which the bot marks unsupported.

HTTP statuses

Returns HTTP 200 with a normal body. Hub link click still PASS (navigation).

Returns HTTP 404 with a custom body (not Laravel’s generic 404 page).

Returns HTTP 500 with a custom body for status-code evidence.

Server responds 302 to /. Click follows redirect → URL change.

Server responds 301 to /. Same as above with permanent redirect.

Edge cases

/slow slow

Server sleeps ~3 seconds before rendering — exercises timeouts / networkidle waits.

/js-error evidence

Throws a runtime JS error on load for console/pageerror evidence capture.

/empty empty

Almost no page-local conversion controls (only shared chrome links remain).