← back to Eur Recrawl
probe-osb-front.mjs
37 lines
// probe-osb-front.mjs [SKU] — explore the Osborne trade portal front-end for product
// browsing + IMAGES (STOCK ENQUIRY dropdown, product pages). Reuses .auth/osbtrade.
import { chromium } from 'playwright';
import path from 'node:path';
const sku = process.argv[2] || 'W7216';
const ctx = await chromium.launchPersistentContext(path.join(process.cwd(), '.auth', 'osbtrade'), {
headless: false, channel: 'chrome', viewport: { width: 1440, height: 900 },
});
const page = ctx.pages()[0] || await ctx.newPage();
await page.goto('https://tradenew.osborneandlittle.com/user/dashboard', { waitUntil: 'domcontentloaded', timeout: 60000 }).catch((e) => console.log('nav', e.message));
await page.waitForTimeout(2500);
// expand STOCK ENQUIRY (JS dropdown) and dump revealed links
await page.evaluate(() => { const el = [...document.querySelectorAll('a,button')].find((e) => /stock\s*enquiry/i.test(e.innerText || '')); if (el) el.click(); }).catch(() => {});
await page.waitForTimeout(1500);
const menu = await page.evaluate(() =>
[...document.querySelectorAll('a[href]')].map((a) => ({ txt: (a.innerText || '').trim().slice(0, 24), href: a.getAttribute('href') }))
.filter((l) => l.href && l.href !== '#' && /stock|product|enquir|search|catalog|brand|wallpaper|browse/i.test(l.txt + ' ' + l.href)));
console.log('stock/product links:'); [...new Map(menu.map((m) => [m.href, m])).values()].slice(0, 25).forEach((m) => console.log(` ${m.txt} -> ${m.href}`));
// try the stock enquiry search route directly
for (const url of ['https://tradenew.osborneandlittle.com/user/stockenquiry', 'https://tradenew.osborneandlittle.com/user/products', `https://tradenew.osborneandlittle.com/user/stockenquiry?search=${sku}`]) {
const r = await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 }).catch(() => null);
if (r && r.ok()) {
await page.waitForTimeout(2500);
const info = await page.evaluate(() => {
const imgs = [...document.querySelectorAll('img')].map((i) => i.src).filter((s) => /product|pattern|asset|media|\.jpg|\.png/i.test(s)).slice(0, 8);
const inputs = [...document.querySelectorAll('input,select')].map((e) => ({ t: e.tagName, type: e.type, name: e.name, id: e.id, ph: e.placeholder })).filter((e) => e.type !== 'hidden').slice(0, 12);
return { url: location.href, title: document.title, imgs, inputs };
});
console.log(`\n[${url}] -> ${info.url}\n title: ${info.title.slice(0, 40)}\n inputs: ${JSON.stringify(info.inputs)}\n product imgs: ${info.imgs.join(' | ') || '(none)'}`);
} else console.log(`\n[${url}] -> not reachable`);
}
await page.screenshot({ path: 'probe-osb-front.png' }).catch(() => {});
await page.waitForTimeout(1500);
await ctx.close();