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.
60 lines
2.3 KiB
60 lines
2.3 KiB
import { chromium } from "playwright";
|
|
|
|
const FEATHERY_CLICK = { noWaitAfter: true as const };
|
|
|
|
async function typeField(page: import("playwright").Page, sel: string, value: string) {
|
|
const loc = page.locator(`#container-mh ${sel}`).first();
|
|
await loc.click(FEATHERY_CLICK);
|
|
await loc.fill("");
|
|
await loc.pressSequentially(value, { delay: 30 });
|
|
await loc.evaluate((el, v) => {
|
|
const input = el as HTMLInputElement;
|
|
const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value")?.set;
|
|
setter?.call(input, v);
|
|
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
input.dispatchEvent(new Event("change", { bubbles: true }));
|
|
input.dispatchEvent(new Event("blur", { bubbles: true }));
|
|
}, value);
|
|
}
|
|
|
|
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();
|
|
await page.waitForTimeout(1500);
|
|
|
|
await page.locator("#container-mh").getByText(/Less Than Truckload/i).first().click(FEATHERY_CLICK);
|
|
await page.waitForTimeout(800);
|
|
await typeField(page, "#origin-zip", "10118");
|
|
await typeField(page, "#destination-zip", "90017");
|
|
await page.locator("#container-mh #freight-shipment").selectOption("One Time Shipment");
|
|
await typeField(page, "#pickup-date", "07/01/2026");
|
|
await typeField(page, "#business-email", "niqijiti542@gmail.com");
|
|
await typeField(page, "#client-phone", "5551234567");
|
|
|
|
const btn = page.locator("#container-mh").getByRole("button", { name: /GET INSTANT QUOTES/i }).first();
|
|
await Promise.race([
|
|
btn.click({ timeout: 15_000 }).catch(() => undefined),
|
|
page.waitForTimeout(15_000),
|
|
]);
|
|
await page.waitForTimeout(3000);
|
|
|
|
const diag = await page.evaluate(() => {
|
|
const texts = [...document.querySelectorAll("body *")]
|
|
.map((el) => el.textContent?.trim() || "")
|
|
.filter((t) => /required|invalid|error|please|must/i.test(t) && t.length < 120);
|
|
return {
|
|
url: location.href,
|
|
lengthVisible: !!document.querySelector("#container-mh #length"),
|
|
errors: [...new Set(texts)].slice(0, 15),
|
|
};
|
|
});
|
|
console.log(JSON.stringify(diag, null, 2));
|
|
await browser.close();
|
|
}
|
|
|
|
main().catch(console.error);
|