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/probe-styled-click-pickup.ts

111 lines
3.7 KiB

/**
* 快速验证 styled-components 联想点击能否触发 GET place
*/
import "dotenv/config";
import { loadDevEnv } from "@/lib/dev-env";
import { getPrimaryMothershipQuoteUrl } from "@/lib/rpa/env";
import {
hostFetchMothershipCandidates,
} from "@/lib/frontend/api-client";
import { applyMothershipCandidate } from "@/lib/frontend/mothership-address";
import { AxelSelectionBridge } from "@/workers/rpa/axel-selection-bridge";
import { MotherShipAddressAdapter } from "@/workers/rpa/address-adapter/mothership-address-adapter";
import { openAddressSide, visibleStreetInput } from "@/workers/rpa/address-side";
import { RPAContext } from "@/workers/rpa/kernel/context";
import { closeBrowser, openQuotePage } from "@/workers/rpa/session-manager";
import { quotePageAdapter } from "@/workers/rpa/quote-page-adapter";
import {
stabilizeQuoteLandingPage,
waitForQuoterWidgetHydrated,
} from "@/workers/rpa/page-prep";
import { getSelector } from "@/lib/rpa/selectors";
import type { QuoteRequest } from "@/modules/providers/quote-provider";
loadDevEnv();
const BASE = process.env.PROVE_BASE_URL ?? "http://localhost:3000";
const TOKEN = "demo-host-token";
const CUSTOMER_ID = "CUST_001";
async function main() {
const pickupDraft = {
street: "3131 Western Ave",
city: "Seattle",
state: "WA",
zip: "",
place_id: "draft_seattle",
formatted_address: "3131 Western Ave, Seattle, WA",
selected_from_suggestions: true,
};
const deliveryDraft = {
street: "7000 NW 52nd St",
city: "Miami",
state: "FL",
zip: "",
place_id: "draft_miami",
formatted_address: "7000 NW 52nd St, Miami, FL",
selected_from_suggestions: true,
};
const candRes = await hostFetchMothershipCandidates(
BASE,
TOKEN,
CUSTOMER_ID,
pickupDraft,
deliveryDraft,
);
if (candRes.code !== 0 || !candRes.data?.pickup_candidates[0]) {
throw new Error(candRes.message ?? "候选 API 失败");
}
const pickupCand = candRes.data.pickup_candidates[0];
const pickupApplied = applyMothershipCandidate(pickupDraft, pickupCand);
const pickup: QuoteRequest["pickup"] = {
street: pickupApplied.street,
city: pickupApplied.city,
state: pickupApplied.state,
zip: pickupApplied.zip ?? "",
placeId: pickupDraft.place_id,
formattedAddress: pickupApplied.formatted_address,
selectedFromSuggestions: true,
mothershipOptionId: pickupApplied.mothership_option_id ?? "",
mothershipDisplayLabel: pickupApplied.mothership_display_label ?? "",
selectedFromMothership: true,
};
console.log("pickup label:", pickup.mothershipDisplayLabel);
console.log("MotherShip URL:", getPrimaryMothershipQuoteUrl());
const opened = await openQuotePage(quotePageAdapter);
const ctx = RPAContext.fromSession(opened.page, opened.context);
await stabilizeQuoteLandingPage(ctx);
await waitForQuoterWidgetHydrated(ctx.page, 60_000);
await openAddressSide(ctx, "pickup");
const street = await visibleStreetInput(ctx, "pickup");
if (!street) throw new Error("无提货输入框");
const adapter = new MotherShipAddressAdapter();
const result = await adapter.selectAddress({
ctx,
side: "pickup",
address: pickup,
street,
widgetSelector: getSelector("RPA_SELECTOR_QUOTE_WIDGET"),
});
const diag = adapter.getDiagnostics();
console.log("\n=== pickup commit 结果 ===");
console.log(JSON.stringify({ result, diag }, null, 2));
const bridge = new AxelSelectionBridge();
bridge.attach(ctx.page);
console.log("observed place ids:", bridge.getObservedPlaceCommitIds());
await ctx.page.screenshot({ path: ".dev/logs/probe-styled-click-pickup.png" });
await closeBrowser();
}
main().catch((e) => {
console.error("[FAIL]", e);
process.exit(1);
});