In this video· click a step to jump to it
Test recording
Serpex — app walkthrough
30,715 ms · 220,098 pixels changed
We built this regression test for app.serpex.dev — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against app.serpex.dev. Claim it into your own workspace and re-run it on every deploy — free.
export async function test(page, baseUrl, screenshotPath, stepLogger) {
const shot = (n, s) => screenshotPath.replace('.png', '-' + n + '-' + s + '.png');
const SCROLL_THROUGH = "(async () => { const ease = t => 1 - Math.pow(1 - t, 3); const max = Math.max(0, document.body.scrollHeight - window.innerHeight); if (max < 40) return; const anim = (a, b, ms) => new Promise(res => { const t0 = performance.now(); const step = now => { const p = Math.min(1, (now - t0) / ms); window.scrollTo(0, a + (b - a) * ease(p)); p < 1 ? requestAnimationFrame(step) : res(); }; requestAnimationFrame(step); }); await anim(0, max, 1300); await new Promise(r => setTimeout(r, 300)); await anim(max, 0, 700); })()";
await page.context().setExtraHTTPHeaders({ 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' });
await page.route('**/cdn-cgi/scripts/**', function (r) { return r.abort(); }).catch(function () {});
await page.route('**/*sentry-cdn.com/**', function (r) { return r.abort(); }).catch(function () {});
await page.route('**/connect.facebook.net/**', function (r) { return r.abort(); }).catch(function () {});
let postLoginActions = 0;
// --- 1. Authenticated dashboard -----------------------------------------Checks run
Notes from the demo run
AI-generatedYour dashboard reads like an API product should: credits, keys, request volume and success rate as four tiles, then straight into the playground. We signed in with Google, generated a key, ran a live search and got a 10-result JSON payload back in under two seconds, all without touching a credit card. The 200 free credits on signup are doing a lot of work here.
- Time-to-first-request is genuinely shortGoogle sign-in to a real search response took four clicks and one keystroke. Most search APIs make you read docs and paste a key into curl before you see a single result.
- Five copy-paste integrations in the playgroundPython SDK, JS SDK, raw Python, raw JavaScript and cURL all sit under the response, pre-filled with the query you just ran. That is the right place for them.
- The playground tells you to click a button that is not thereThe empty response panel reads 'Enter a query and click "Send Request"', but no Send Request button renders. Enter in the query field is the only way to fire a request, and nothing on screen says so. Either render the button or change the copy to 'press Enter'.
- No settled state after a request firesBetween pressing Enter and the JSON arriving, the panel still says 'No Response Yet' with only a small spinner in the submit affordance. Our first capture landed there. A skeleton or an explicit 'Searching...' state would read better to a human too.
5 visual changes
Share this run
Proof your app is not AI slop
This test was built for app.serpex.dev — claim it free
One click copies the test and baseline screenshots into your own Lastest workspace. Re-run on every deploy and catch regressions before your users do — free, no card required.














