You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chajia/scripts/_dump-flock-pickup-types.ts

94 lines
3.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 填完 ZIP 后 dump Pickup Type 全部 optionrole=option / listbox li
*/
import fs from "node:fs";
import path from "node:path";
import { launchRpaBrowser } from "@/lib/rpa/browser-launch";
import { createRpaBrowserContext } from "@/lib/rpa/browser-context";
import { ensureFlockLoggedIn } from "@/workers/rpa/flock/login";
import {
fillLoggedInPickupDate,
openFlockLoggedInQuoteEntry,
} from "@/workers/rpa/flock/logged-in-form";
import { defaultFlockPickupDateIso } from "@/lib/flock/pickup-date";
function isoToDisplay(iso: string): string {
const [y, m, d] = iso.split("-");
return y && m && d ? `${m}/${d}/${y}` : iso;
}
async function main() {
const storagePath =
process.env.FLOCK_LOGGED_IN_STORAGE_STATE_PATH?.trim() ||
path.join(process.cwd(), ".rpa", "flock-logged-in-storage.json");
const browser = await launchRpaBrowser({ headless: true, incognito: false });
try {
const context = await createRpaBrowserContext(browser, {
storageState: storagePath,
});
const page = await context.newPage();
const login = await ensureFlockLoggedIn(page, context);
if (!login.ok) throw new Error(login.errorMessage);
await page.goto("https://app.flockfreight.com/home", {
waitUntil: "domcontentloaded",
});
if (!(await openFlockLoggedInQuoteEntry(page))) {
throw new Error("open form failed");
}
await fillLoggedInPickupDate(page, isoToDisplay(defaultFlockPickupDateIso()));
await page.getByRole("textbox", { name: /Pickup ZIP/i }).fill("30326");
await page.waitForTimeout(800);
const combo = page.getByRole("combobox", { name: /Pickup Type/i }).first();
await combo.waitFor({ state: "visible", timeout: 15_000 });
await combo.click({ force: true });
await page.waitForTimeout(800);
// 多种选择器
const byRole = await page.getByRole("option").allTextContents();
const byLi = await page
.locator('[role="listbox"] [role="option"], [role="listbox"] li, ul[role="listbox"] > *')
.allTextContents();
// 键盘滚一圈再采
for (let i = 0; i < 30; i++) {
await page.keyboard.press("ArrowDown");
await page.waitForTimeout(50);
}
const afterScroll = await page.getByRole("option").allTextContents();
const normalize = (arr: string[]) =>
[
...new Set(
arr
.map((t) => t.replace(/\s+/g, " ").trim())
.filter(Boolean),
),
];
const out = {
byRole: normalize(byRole),
byLi: normalize(byLi),
afterScroll: normalize(afterScroll),
url: page.url(),
};
const file = path.join(
process.cwd(),
".rpa",
"flock-form-matrix",
"pickup-type-options.json",
);
fs.mkdirSync(path.dirname(file), { recursive: true });
fs.writeFileSync(file, JSON.stringify(out, null, 2));
console.log(JSON.stringify(out, null, 2));
} finally {
await browser.close();
}
}
main().catch((e) => {
console.error(e);
process.exit(1);
});