update
This commit is contained in:
@@ -5,14 +5,10 @@ const BASE_URL = process.env.FDISK_BASE_URL ?? 'https://app.fdi
|
|||||||
const ID_FEUERWEHREN = process.env.FDISK_ID_FEUERWEHREN ?? '164';
|
const ID_FEUERWEHREN = process.env.FDISK_ID_FEUERWEHREN ?? '164';
|
||||||
const ID_INSTANZEN = process.env.FDISK_ID_INSTANZEN ?? '2853';
|
const ID_INSTANZEN = process.env.FDISK_ID_INSTANZEN ?? '2853';
|
||||||
|
|
||||||
const LOGIN_URL = `${BASE_URL}/fdisk/module/vws/logins/logins.aspx`;
|
const LOGIN_URL = `${BASE_URL}/fdisk/module/vws/logins/logins.aspx`;
|
||||||
const MEMBERS_URL = `${BASE_URL}/fdisk/module/vws/vws/MitgliedschaftenList.aspx`
|
const MEMBERS_URL = `${BASE_URL}/fdisk/module/vws/vws/MitgliedschaftenList.aspx`
|
||||||
+ `?search=1`
|
+ `?id_instanzen=${ID_INSTANZEN}`
|
||||||
+ `&searchid_feuerwehren=${ID_FEUERWEHREN}`
|
+ `&id_feuerwehren=${ID_FEUERWEHREN}`;
|
||||||
+ `&searchid_instanzen=${ID_INSTANZEN}`
|
|
||||||
+ `&id_instanzen=${ID_INSTANZEN}`
|
|
||||||
+ `&searchid_instanzen_besitzer=${ID_INSTANZEN}`
|
|
||||||
+ `&searchid_fahrzeugstatus=1`;
|
|
||||||
|
|
||||||
function log(msg: string) {
|
function log(msg: string) {
|
||||||
console.log(`[scraper] ${new Date().toISOString()} ${msg}`);
|
console.log(`[scraper] ${new Date().toISOString()} ${msg}`);
|
||||||
@@ -131,10 +127,25 @@ async function scrapeMembers(frame: Frame): Promise<FdiskMember[]> {
|
|||||||
const frameTitle = await frame.title();
|
const frameTitle = await frame.title();
|
||||||
log(`Members frame loaded: ${frameUrl} — title: "${frameTitle}"`);
|
log(`Members frame loaded: ${frameUrl} — title: "${frameTitle}"`);
|
||||||
|
|
||||||
const tableClasses = await frame.$$eval('table', (ts) =>
|
// The member list requires a POST (form submit) to show results.
|
||||||
ts.map((t) => `${t.className || '(no-class)'}[${t.querySelectorAll('tr').length}rows]`),
|
// Navigate to the base page first (which loads VIEWSTATE etc.), then submit the search form.
|
||||||
);
|
const formExists = await frame.$('form[name="frmsearch"]') !== null;
|
||||||
log(`Tables in frame: ${tableClasses.join(', ') || 'none'}`);
|
log(`Search form found: ${formExists}`);
|
||||||
|
|
||||||
|
if (!formExists) {
|
||||||
|
const tableClasses = await frame.$$eval('table', (ts) =>
|
||||||
|
ts.map((t) => `${t.className || '(no-class)'}[${t.querySelectorAll('tr').length}rows]`),
|
||||||
|
);
|
||||||
|
log(`Tables in frame: ${tableClasses.join(', ') || 'none'}`);
|
||||||
|
throw new Error(`frmsearch form not found on ${frameUrl} — cannot load member list`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Submit the form as-is (no filters) to get all members
|
||||||
|
await frame.evaluate(() => {
|
||||||
|
(document as any).forms['frmsearch'].submit();
|
||||||
|
});
|
||||||
|
await frame.waitForLoadState('networkidle');
|
||||||
|
log(`After form submit: ${frame.url()}`);
|
||||||
|
|
||||||
// The member table uses class FdcLayList
|
// The member table uses class FdcLayList
|
||||||
await frame.waitForSelector('table.FdcLayList', { timeout: 20000 });
|
await frame.waitForSelector('table.FdcLayList', { timeout: 20000 });
|
||||||
|
|||||||
Reference in New Issue
Block a user