// Vérification UI du système de filtres (barre compacte + FilterSheet) — mobile iPhone. import { chromium } from "playwright"; const browser = await chromium.launch(); const page = await browser.newPage({ viewport: { width: 390, height: 844 }, hasTouch: true, isMobile: true, deviceScaleFactor: 2, }); const errors = []; page.on("pageerror", (e) => errors.push(String(e))); page.on("console", (m) => { if (m.type() === "error") errors.push(m.text()); }); await page.goto("http://localhost:8095/", { waitUntil: "networkidle" }); await page.waitForSelector(".vcard", { timeout: 15000 }); const checks = {}; checks.ancien_panneau_absent = (await page.locator(".filters").count()) === 0; checks.bouton_filtres = await page.locator(".filters-btn").textContent(); checks.compteur = await page.locator(".result-bar .count").textContent(); // la 1re carte véhicule doit être proche du haut de page (pas 2000px plus bas) checks.y_premiere_carte = Math.round(await page.locator(".vcard").first().evaluate((el) => el.getBoundingClientRect().top + window.scrollY)); await page.screenshot({ path: "/tmp/autoka-filtres-1-accueil.png" }); // — ouverture du bottom sheet — await page.locator(".filters-btn").tap(); await page.waitForSelector(".fsheet", { timeout: 5000 }); checks.sheet_ouvert = true; checks.scroll_verrouille = await page.evaluate(() => document.documentElement.classList.contains("ka-scroll-lock")); checks.sliders = await page.locator(".dr").count(); // prix + année + km = 3 // marque via select natif (attendre le chargement des facettes) await page.waitForFunction(() => { const s = document.querySelector(".fsheet select"); return s && s.options.length > 1; }, { timeout: 10000 }); await page.locator(".fsheet select").first().evaluate((el) => { const opt = [...el.options].find((o) => o.value === "Honda"); el.value = opt ? "Honda" : el.options[1].value; el.dispatchEvent(new Event("change", { bubbles: true })); }); // prix max via clavier sur la poignée max du 1er slider (2 crans = -5 000 $) const pmax = page.locator(".fs-field:has(.fs-label:text('Prix')) .dr input").nth(1); await pmax.focus(); await page.keyboard.press("ArrowLeft"); await page.keyboard.press("ArrowLeft"); checks.readout_prix = await page.locator(".fs-field:has(.fs-label:text('Prix')) .dr-readout").textContent(); // « Plus de filtres » await page.locator(".fs-more").tap(); checks.plus_de_filtres = (await page.locator(".fsheet select").count()) >= 6; // compteur en direct dans le CTA await page.waitForTimeout(900); checks.cta = (await page.locator(".fs-apply").textContent())?.trim(); await page.screenshot({ path: "/tmp/autoka-filtres-2-sheet.png" }); // — appliquer — await page.locator(".fs-apply").tap(); await page.waitForTimeout(1200); checks.url_apres_apply = page.url(); checks.chips = await page.locator(".fchip").allTextContents(); checks.badge_nb_filtres = await page.locator(".fb-n").textContent().catch(() => "ABSENT"); await page.screenshot({ path: "/tmp/autoka-filtres-3-applique.png" }); // — retirer un chip — await page.locator(".fchip").first().tap(); await page.waitForTimeout(800); checks.url_apres_retrait_chip = page.url(); checks.chips_restants = await page.locator(".fchip").allTextContents(); // — réouverture + réinitialiser — await page.locator(".filters-btn").tap(); await page.waitForSelector(".fsheet"); await page.locator(".fs-reset").tap(); await page.waitForTimeout(700); checks.cta_apres_reset = (await page.locator(".fs-apply").textContent())?.trim(); // fermeture par le voile await page.locator(".fsheet-veil").tap({ position: { x: 20, y: 60 } }); await page.waitForTimeout(300); checks.sheet_ferme = (await page.locator(".fsheet").count()) === 0; checks.scroll_deverrouille = await page.evaluate(() => !document.documentElement.classList.contains("ka-scroll-lock")); console.log(JSON.stringify(checks, null, 2)); console.log("JS errors:", errors.length ? errors : "aucune"); await browser.close();