115 lines
3.5 KiB
JavaScript
115 lines
3.5 KiB
JavaScript
|
|
import { chromium } from 'playwright';
|
||
|
|
|
||
|
|
const browser = await chromium.launch({ headless: true });
|
||
|
|
const page = await browser.newPage();
|
||
|
|
|
||
|
|
console.log('Testing TenderRadar site...\n');
|
||
|
|
|
||
|
|
// Test homepage
|
||
|
|
console.log('1. Loading homepage: https://tenderradar.co.uk');
|
||
|
|
await page.goto('https://tenderradar.co.uk', { waitUntil: 'networkidle', timeout: 30000 });
|
||
|
|
await page.waitForTimeout(2000);
|
||
|
|
|
||
|
|
const title = await page.title();
|
||
|
|
console.log(' Page title:', title);
|
||
|
|
|
||
|
|
// Check for any JavaScript errors
|
||
|
|
const errors = [];
|
||
|
|
page.on('console', msg => {
|
||
|
|
if (msg.type() === 'error') {
|
||
|
|
errors.push(msg.text());
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// Try to get some tender data
|
||
|
|
console.log('\n2. Checking for tender listings...');
|
||
|
|
await page.waitForSelector('.tender-item, .tender-list, #tenders-list', { timeout: 10000 }).catch(() => {
|
||
|
|
console.log(' No tender items found on page');
|
||
|
|
});
|
||
|
|
|
||
|
|
// Get all Apply Now buttons
|
||
|
|
const applyButtons = await page.evaluate(() => {
|
||
|
|
const buttons = Array.from(document.querySelectorAll('a[href*="notice"], a.btn-primary, button'));
|
||
|
|
return buttons
|
||
|
|
.filter(btn => btn.textContent.toLowerCase().includes('apply'))
|
||
|
|
.map(btn => ({
|
||
|
|
text: btn.textContent.trim().substring(0, 50),
|
||
|
|
href: btn.href || btn.onclick?.toString() || 'no-href',
|
||
|
|
tag: btn.tagName
|
||
|
|
}))
|
||
|
|
.slice(0, 10);
|
||
|
|
});
|
||
|
|
|
||
|
|
console.log(' Found', applyButtons.length, '"Apply" buttons/links');
|
||
|
|
applyButtons.forEach((btn, idx) => {
|
||
|
|
console.log(' ' + (idx + 1) + '. [' + btn.tag + '] "' + btn.text + '" -> ' + btn.href.substring(0, 80));
|
||
|
|
});
|
||
|
|
|
||
|
|
// Take a screenshot
|
||
|
|
await page.screenshot({ path: '/tmp/tenderradar-home.png', fullPage: true });
|
||
|
|
console.log('\n3. Screenshot saved: /tmp/tenderradar-home.png');
|
||
|
|
|
||
|
|
// Check if we can get tender data from the page
|
||
|
|
const tenderData = await page.evaluate(() => {
|
||
|
|
const tenders = [];
|
||
|
|
const items = document.querySelectorAll('.tender-item, [data-tender-id], tr[onclick]');
|
||
|
|
|
||
|
|
items.forEach((item, idx) => {
|
||
|
|
if (idx > 5) return; // Limit to first 5
|
||
|
|
|
||
|
|
const applyBtn = item.querySelector('a[href*="notice"], a.btn-primary, button.btn-primary');
|
||
|
|
if (applyBtn) {
|
||
|
|
tenders.push({
|
||
|
|
id: item.dataset?.tenderId || idx,
|
||
|
|
title: item.querySelector('h3, .tender-title, .title')?.textContent?.trim()?.substring(0, 60) || 'Unknown',
|
||
|
|
applyUrl: applyBtn.href || 'No URL',
|
||
|
|
buttonText: applyBtn.textContent.trim()
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
return tenders;
|
||
|
|
});
|
||
|
|
|
||
|
|
if (tenderData.length > 0) {
|
||
|
|
console.log('\n4. Testing individual Apply Now URLs...\n');
|
||
|
|
|
||
|
|
for (const tender of tenderData) {
|
||
|
|
console.log(' Testing:', tender.title);
|
||
|
|
console.log(' URL:', tender.applyUrl);
|
||
|
|
|
||
|
|
if (tender.applyUrl === 'No URL' || !tender.applyUrl.startsWith('http')) {
|
||
|
|
console.log(' INVALID URL\n');
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
const response = await page.goto(tender.applyUrl, { waitUntil: 'domcontentloaded', timeout: 15000 });
|
||
|
|
const status = response.status();
|
||
|
|
|
||
|
|
if (status === 404) {
|
||
|
|
console.log(' ** 404 NOT FOUND **\n');
|
||
|
|
} else if (status >= 400) {
|
||
|
|
console.log(' HTTP', status, '\n');
|
||
|
|
} else {
|
||
|
|
console.log(' OK - HTTP', status, '\n');
|
||
|
|
}
|
||
|
|
|
||
|
|
await page.waitForTimeout(1000);
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
console.log(' ERROR:', error.message, '\n');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
console.log('\n4. No tender data found on page');
|
||
|
|
}
|
||
|
|
|
||
|
|
if (errors.length > 0) {
|
||
|
|
console.log('\nJavaScript Errors Found:');
|
||
|
|
errors.forEach(err => console.log(' -', err));
|
||
|
|
}
|
||
|
|
|
||
|
|
await browser.close();
|
||
|
|
console.log('\nTest complete.');
|