In this video· click a step to jump to it
L
Passed ✓
Test recording
ListingLab — app walkthrough
77,879 ms · 6 pixels changed
We built this regression test for listinglab.pro — it's yours to keep, free.
Take this test with you
This is a real Playwright test, recorded against listinglab.pro. 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+'-'+((String(s).replace(/[^a-z0-9]+/gi,'-').replace(/^-|-$/g,'').toLowerCase().slice(0,22))||'view')+'.png');
const ORIGIN="https://listinglab.pro"; const MINPOST=9;
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" }).catch(function(){});
let idx=1, post=0;
const cap=async(s,full)=>{ stepLogger.log('Scenario '+idx+': '+s); await page.screenshot({ path: shot(idx,s), fullPage: full!==false }); idx++; };
const accept=async()=>{ await page.getByRole('button',{name:/^accept$|accept all|got it|^ok$|^close$|skip|maybe later|not now|dismiss/i}).first().click({timeout:1500}).catch(function(){}); await page.keyboard.press('Escape').catch(function(){}); };
const backfill=async(entry)=>{ if(post>=MINPOST) return; await page.goto(entry,{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:6000}).catch(function(){}); await page.waitForTimeout(2000); await accept(); const total=await page.evaluate(function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);}).catch(function(){return 0;}); const vh=await page.evaluate(function(){return window.innerHeight;}).catch(function(){return 900;}); let y=0,seg=1; while(post<MINPOST&&idx<=16&&y<total){ await page.evaluate(function(yy){window.scrollTo(0,yy);},y).catch(function(){}); await page.waitForTimeout(800); stepLogger.log('Scenario '+idx+': overview '+seg); await page.screenshot({path:shot(idx,'overview-'+seg),fullPage:false}); idx++;post++;seg++; y+=Math.floor(vh*0.9); } while(post<MINPOST&&idx<=16){ await page.waitForTimeout(400); stepLogger.log('Scenario '+idx+': view '+seg); await page.screenshot({path:shot(idx,'view-'+seg),fullPage:true}); idx++;post++;seg++; } };
await page.goto(ORIGIN+'/',{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:6000}).catch(function(){}); await page.waitForTimeout(1600); await accept(); await cap('home');
await page.goto(ORIGIN+'/dashboard',{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:6000}).catch(function(){}); await page.waitForTimeout(2500); await accept(); await cap('dashboard-my-listings'); post++;
await page.goto(ORIGIN+'/score',{waitUntil:'domcontentloaded'}).catch(function(){}); await page.waitForLoadState('networkidle',{timeout:6000}).catch(function(){}); await page.waitForTimeout(2500); await accept(); await cap('score-form'); post++;Checks run
6
Diff px
1m 18s
Duration
C
Accessible
WCAG 2.2 · 78
C
Fast
Web Vitals · 70
Notes from the demo run
AI-generatedListingLab nails the single-job product: a dashboard (My Listings / Bulk Score / Trending) and a score flow that takes a title, tags, description, price and category and returns an AI critique. 'Try with Demo Data' is a thoughtful zero-friction way to see the output before typing anything.
Highlights
- 'Try with Demo Data' buttonLets a first-time seller see a fully scored listing without writing a word — excellent activation pattern.
- Honest PRO gatingBulk Score and Trending are visibly PRO-badged in-nav, so the upgrade path is clear and discoverable.
- Tight Etsy focusCategory presets (Mugs / Prints / Jewelry) and dedicated tag fields speak the exact language of Etsy sellers.
Friction points
- Magic-link onlyNo password option for repeat logins; sellers checking listings daily must round-trip through email unless the session persists.
- Empty My Listings zero-stateUntil you save a scored listing the dashboard is empty — a pre-saved example would demo the saved-listing flow.
Visual change
Share this run
Earned · Lastest awards
Proof your app is not AI slop
Badges stay live, ratchet upward, only downgrade on confirmed regression.
57,761 test runs recorded · 1,174 products tested with Lastest
This test was built for listinglab.pro — 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.


