stock-bot/test-simple-proxy.ts
2025-06-13 13:38:02 -04:00

152 lines
6.2 KiB
TypeScript

import { Browser } from '@stock-bot/browser';
async function simpleProxyTest() {
console.log('🔬 Simple Proxy Test...');
try {
await Browser.initialize({ headless: true, timeout: 10000, blockResources: false });
console.log('✅ Browser initialized');
await Browser.initialize({ headless: true, timeout: 10000, blockResources: false });
console.log('✅ Browser initialized');
const { page, contextId } = await Browser.createPageWithProxy(
'https://www.interactivebrokers.com/en/trading/products-exchanges.php#/',
'http://doimvbnb-US-rotate:w5fpiwrb9895@p.webshare.io:80'
);
console.log('✅ Page created with proxy');
let summaryData: any = null; // Initialize summaryData to store API response
let eventCount = 0;
page.onNetworkEvent(event => {
if (event.url.includes('/webrest/search/product-types/summary')) {
console.log(`🎯 Found summary API call: ${event.type} ${event.url}`);
if (event.type === 'response' && event.responseData) {
console.log(`📊 Summary API Response Data: ${event.responseData}`);
try {
summaryData = JSON.parse(event.responseData) as any;
const totalCount = summaryData[0].totalCount;
console.log('📊 Summary API Response:', JSON.stringify(summaryData, null, 2));
console.log(`🔢 Total symbols found: ${totalCount || 'Unknown'}`);
} catch (e) {
console.log('📊 Raw Summary Response:', event.responseData);
}
}
}
eventCount++;
console.log(`📡 Event ${eventCount}: ${event.type} ${event.url}`);
});
console.log('⏳ Waiting for page load...');
await page.waitForLoadState('domcontentloaded', { timeout: 20000 });
console.log('✅ Page loaded');
// RIGHT HERE - Interact with the page to find Stocks checkbox and Apply button
console.log('🔍 Looking for Products tab...');
// Wait for the page to fully load
await page.waitForTimeout(20000);
// First, click on the Products tab
const productsTab = page.locator('#productSearchTab[role="tab"][href="#products"]');
await productsTab.waitFor({ timeout: 20000 });
console.log('✅ Found Products tab');
console.log('🖱️ Clicking Products tab...');
await productsTab.click();
console.log('✅ Products tab clicked');
// Wait for the tab content to load
await page.waitForTimeout(5000);
// Click on the Asset Classes accordion to expand it
console.log('🔍 Looking for Asset Classes accordion...');
const assetClassesAccordion = page.locator(
'#products .accordion-item #acc-products .accordion_btn:has-text("Asset Classes")'
);
await assetClassesAccordion.waitFor({ timeout: 10000 });
console.log('✅ Found Asset Classes accordion');
console.log('🖱️ Clicking Asset Classes accordion...');
await assetClassesAccordion.click();
console.log('✅ Asset Classes accordion clicked');
// Wait for the accordion content to expand
await page.waitForTimeout(2000);
console.log('🔍 Looking for Stocks checkbox...');
// Find the span with class "fs-7 checkbox-text" and inner text containing "Stocks"
const stocksSpan = page.locator('span.fs-7.checkbox-text:has-text("Stocks")');
await stocksSpan.waitFor({ timeout: 10000 });
console.log('✅ Found Stocks span');
// Find the checkbox by looking in the same parent container
const parentContainer = stocksSpan.locator('..');
const checkbox = parentContainer.locator('input[type="checkbox"]');
if ((await checkbox.count()) > 0) {
console.log('📋 Clicking Stocks checkbox...');
await checkbox.first().check();
console.log('✅ Stocks checkbox checked');
} else {
console.log('⚠️ Could not find checkbox near Stocks text');
}
// Wait a moment for any UI updates
await page.waitForTimeout(1000);
// Find and click the nearest Apply button
console.log('🔍 Looking for Apply button...');
const applyButton = page.locator(
'button:has-text("Apply"), input[type="submit"][value*="Apply"], input[type="button"][value*="Apply"]'
);
if ((await applyButton.count()) > 0) {
console.log('🎯 Clicking Apply button...');
await applyButton.first().click();
console.log('✅ Apply button clicked');
// Wait for any network requests triggered by the Apply button
await page.waitForTimeout(2000);
} else {
console.log('⚠️ Could not find Apply button');
}
} catch (interactionError) {
const errorMessage =
interactionError instanceof Error ? interactionError.message : String(interactionError);
console.error('❌ Page interaction failed:', errorMessage);
// Get debug info about the page
try {
const title = await page.title();
console.log(`📄 Current page title: "${title}"`);
const stocksElements = await page.locator('*:has-text("Stocks")').count();
console.log(`🔍 Found ${stocksElements} elements containing "Stocks"`);
const applyButtons = await page
.locator('button:has-text("Apply"), input[value*="Apply"]')
.count();
console.log(`🔍 Found ${applyButtons} Apply buttons`);
} catch (debugError) {
const debugMessage = debugError instanceof Error ? debugError.message : String(debugError);
console.log('❌ Could not get debug info:', debugMessage);
}
}
await new Promise(resolve => setTimeout(resolve, 2000));
console.log(`📊 Total events: ${eventCount}`);
await Browser.closeContext(contextId);
await Browser.close();
console.log('✅ Test completed');
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
console.error('❌ Error:', errorMessage);
await Browser.close();
}
}
simpleProxyTest();