opencode-browser-tool-insta.../scripts/create_user_drmoralestorres.mjs

117 lines
4 KiB
JavaScript

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)
})