2cb633e99d
Clean-room reproduction of PFPX: route generation + IFPS validation + OFP. Independent design — official ICAO/EUROCONTROL data only (RAD, FRA points, IFPUV oracle); no community FPL sources. Workspace crates: core (routing/discover/rad/navdata/perf/export), cli, server, rad (Annex parser), gui (Tauri v2 + React + MapLibre). Route discovery: oracle-in-the-loop repair against Eurocontrol IFPUV. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
1.4 KiB
JavaScript
39 lines
1.4 KiB
JavaScript
// Explore the public Eurocontrol IFPUV page to find the route input / validate
|
|
// button / result area. Run: node explore.mjs
|
|
import { chromium } from "playwright";
|
|
|
|
const URL = "https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/";
|
|
|
|
const b = await chromium.launch({ headless: true });
|
|
const ctx = await b.newContext({ viewport: { width: 1600, height: 1000 } });
|
|
const page = await ctx.newPage();
|
|
try {
|
|
await page.goto(URL, { waitUntil: "domcontentloaded", timeout: 60000 });
|
|
await page.waitForTimeout(9000); // let the GWT app render
|
|
console.log("TITLE:", await page.title());
|
|
console.log("URL :", page.url());
|
|
|
|
const dump = await page.$$eval(
|
|
"input, textarea, button, a, span, div[role], [class*='gwt'], [class*='Button']",
|
|
(nodes) =>
|
|
nodes
|
|
.map((n) => ({
|
|
tag: n.tagName,
|
|
type: n.getAttribute("type") || "",
|
|
id: n.id || "",
|
|
cls: (n.className && typeof n.className === "string" ? n.className : "").slice(0, 40),
|
|
text: (n.innerText || n.value || "").trim().slice(0, 50),
|
|
}))
|
|
.filter((e) => e.text && e.text.length > 1)
|
|
.slice(0, 120),
|
|
);
|
|
console.log(JSON.stringify(dump, null, 0));
|
|
|
|
await page.screenshot({ path: "ifpuv.png", fullPage: true });
|
|
console.log("screenshot -> ifpuv.png");
|
|
} catch (e) {
|
|
console.error("ERR:", e.message);
|
|
} finally {
|
|
await b.close();
|
|
}
|