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.
75 lines
2.8 KiB
75 lines
2.8 KiB
import { chromium } from "playwright";
|
|
|
|
const FEATHERY_CLICK = { noWaitAfter: true as const };
|
|
|
|
async function featheryFill(
|
|
page: import("playwright").Page,
|
|
selector: string,
|
|
value: string,
|
|
): Promise<void> {
|
|
const field = page.locator(`#container-mh ${selector}`).first();
|
|
await field.click(FEATHERY_CLICK);
|
|
await field.fill("");
|
|
await field.fill(value);
|
|
await field.evaluate((el) => {
|
|
el.dispatchEvent(new Event("input", { bubbles: true }));
|
|
el.dispatchEvent(new Event("change", { bubbles: true }));
|
|
el.dispatchEvent(new Event("blur", { bubbles: true }));
|
|
});
|
|
}
|
|
|
|
async function main() {
|
|
const browser = await chromium.launch({ headless: true });
|
|
const page = await browser.newPage();
|
|
await page.goto(
|
|
"https://www.priority1.com/instant-freight-quotes/#New%20Step%201",
|
|
{ waitUntil: "domcontentloaded" },
|
|
);
|
|
await page.locator("#container-mh").waitFor({ state: "visible" });
|
|
await page.waitForTimeout(1000);
|
|
|
|
await page.locator("#container-mh #cb_st_ltl").click(FEATHERY_CLICK);
|
|
await page.waitForTimeout(800);
|
|
await featheryFill(page, "#origin-zip", "10118");
|
|
await featheryFill(page, "#destination-zip", "90017");
|
|
await page.locator("#container-mh #freight-shipment").selectOption("One Time Shipment");
|
|
await featheryFill(page, "#pickup-date", "07/01/2026");
|
|
await featheryFill(page, "#business-email", "niqijiti542@gmail.com");
|
|
await featheryFill(page, "#client-phone", "5551234567");
|
|
|
|
const values = await page.evaluate(() => ({
|
|
origin: (document.querySelector("#container-mh #origin-zip") as HTMLInputElement)?.value,
|
|
dest: (document.querySelector("#container-mh #destination-zip") as HTMLInputElement)?.value,
|
|
date: (document.querySelector("#container-mh #pickup-date") as HTMLInputElement)?.value,
|
|
email: (document.querySelector("#container-mh #business-email") as HTMLInputElement)?.value,
|
|
phone: (document.querySelector("#container-mh #client-phone") as HTMLInputElement)?.value,
|
|
ltl: (document.querySelector("#container-mh #cb_st_ltl") as HTMLInputElement)?.checked,
|
|
}));
|
|
console.log("values:", values);
|
|
|
|
const btn = page
|
|
.locator("#container-mh")
|
|
.getByRole("button", { name: /GET INSTANT QUOTES/i })
|
|
.first();
|
|
console.log("btn visible:", await btn.isVisible());
|
|
console.log("btn enabled:", await btn.isEnabled());
|
|
|
|
await btn.click(FEATHERY_CLICK);
|
|
await page.waitForTimeout(3000);
|
|
|
|
console.log("url:", page.url());
|
|
console.log("length visible:", await page.locator("#container-mh #length").isVisible().catch(() => false));
|
|
|
|
const errors = await page.evaluate(() =>
|
|
[...document.querySelectorAll("[class*='error'],[role='alert']")]
|
|
.map((e) => e.textContent?.trim())
|
|
.filter(Boolean)
|
|
.slice(0, 10),
|
|
);
|
|
console.log("errors:", errors);
|
|
|
|
await browser.close();
|
|
}
|
|
|
|
main().catch(console.error);
|