import path from "node:path" import { BrowserManager } from "../dist/browser/manager.js" const browser = new BrowserManager(path.resolve("./artifacts")) const out = {} const sleep = (ms) => new Promise((r) => setTimeout(r, ms)) const appBaseUrl = process.env.APP_BASE_URL ?? "https://app.drmoralestorres.com" const loginEmail = process.env.LOGIN_EMAIL const loginPassword = process.env.LOGIN_PASSWORD const newUserName = process.env.NEW_USER_NAME ?? "Nuevo Usuario" const newUserEmail = process.env.NEW_USER_EMAIL const newUserPassword = process.env.NEW_USER_PASSWORD const newUserRoleValue = process.env.NEW_USER_ROLE_VALUE ?? "1" if (!loginEmail || !loginPassword || !newUserEmail || !newUserPassword) { throw new Error( "Missing required env vars: LOGIN_EMAIL, LOGIN_PASSWORD, NEW_USER_EMAIL, NEW_USER_PASSWORD", ) } const run = async () => { out.open = await browser.open({ headless: false, width: 1366, height: 900, browserKind: "testing", persistentProfile: true, userDataDir: "/home/pancho/.chromium-perfil-google", startUrl: `${appBaseUrl}/usuarios/altas`, recordVideo: false, }) out.start = await browser.observe().catch((e) => ({ error: e.message })) const currentUrl = browser.getState().currentUrl || "" if (currentUrl.includes("/login")) { const emailExists = await browser .query({ selector: "input[type='email'], input[name='email'], #email", mode: "exists" }) .catch(() => ({ result: false })) if (emailExists.result === true) { out.typeUser = await browser.type( "input[type='email'], input[name='email'], #email", loginEmail, true, 12000, ) out.typePass = await browser.type( "input[type='password'], input[name='password'], #password", loginPassword, true, 12000, ) out.submit = await browser.click( "button[type='submit'], button[name='login'], button#login, input[type='submit']", 12000, ) await browser.waitFor({ for: "timeout", value: "2200" }) await browser.navigate(`${appBaseUrl}/usuarios/altas`, "domcontentloaded") } } out.afterLogin = await browser.observe() out.formObserve = await browser.observe() out.name = await browser.type("#nombre", newUserName, true, 12000) out.email = await browser.type("#email", newUserEmail, true, 12000) out.pass = await browser.type("#password", newUserPassword, true, 12000) out.role = await browser.select("#rol_id", newUserRoleValue, 12000).catch(async () => { const role = await browser.evaluate( `() => { const s = document.querySelector("#rol_id") if (!s) return { ok: false } const opts = Array.from(s.options || []) const idx = opts.findIndex((o) => (o.textContent || "").toLowerCase().includes("administrador") || (o.value || "").toLowerCase().includes("admin") ) if (idx < 0) return { ok: false, reason: "admin_option_not_found" } s.selectedIndex = idx s.dispatchEvent(new Event("change", { bubbles: true })) return { ok: true, option: opts[idx].textContent, value: opts[idx].value } }`, {}, ) return role.result }) out.preSaveSnapshot = await browser.snapshot({ label: "usuarios-alta-before-save", fullPage: true }) out.saveBtn = await browser.click("button.btn-primary, button[type='submit']", 12000) await sleep(2800) out.afterSave = await browser.observe().catch((e) => ({ error: e.message })) out.postSaveSnapshot = await browser.snapshot({ label: "usuarios-alta-after-save", fullPage: true }) out.close = await browser.close() console.log(JSON.stringify(out, null, 2)) } run().catch(async (err) => { console.error("CREATE_USER_ERROR", err instanceof Error ? err.stack ?? err.message : String(err)) try { const snap = await browser.snapshot({ label: "usuarios-alta-error", fullPage: true }) console.error("ERROR_SNAPSHOT", snap.filePath) } catch { // ignore } try { await browser.close() } catch { // ignore } process.exit(1) })