Converting Tests back to C# but still with Playwright

This commit is contained in:
2026-06-03 14:45:18 -04:00
parent 85834466f1
commit 46150d3a69
209 changed files with 1503 additions and 683 deletions
-38
View File
@@ -1,38 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://calm-mud-04916b210.1.azurestaticapps.net/build-calculator', { timeout: 15000 });
await page.waitForLoadState('networkidle', { timeout: 10000 }).catch(() => {});
await page.locator('select').nth(0).selectOption("Q'Rath");
await page.waitForTimeout(300);
await page.locator('select').nth(1).selectOption('Orzum');
await page.waitForTimeout(1000);
const keys = await page.locator('.keyContainer > div > div').all();
for (const key of keys) {
const text = await key.textContent();
if (text && text.trim().startsWith('TAB')) {
console.log('TAB key textContent:', text.substring(0, 500));
const innerHtml = await key.evaluate(el => el.innerHTML);
console.log('TAB key innerHTML (first 2000):', innerHtml.substring(0, 2000));
const childDivs = await key.locator('> div').all();
console.log('Entity div count:', childDivs.length);
for (const div of childDivs) {
const t = await div.textContent();
const s = await div.getAttribute('style');
console.log(' Entity:', (t || '').trim(), 'Style:', (s || 'none').substring(0, 100));
}
}
}
await page.locator('.keyContainer > div > div').filter({ hasText: 'TAB' }).first().click();
await page.waitForTimeout(1000);
const entityViewName = await page.locator('.entityClickView #entityName').textContent();
console.log('Entity view shows:', entityViewName);
const entityViewHtml = await page.locator('.entityClickView').evaluate(el => el.innerHTML.substring(0, 1000));
console.log('Entity view HTML:', entityViewHtml);
await browser.close();
})().catch(e => { console.error(e.message); process.exit(1); });
-51
View File
@@ -1,51 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
page.on('console', msg => {
if (msg.type() === 'error' || msg.type() === 'warning')
console.log(msg.type().toUpperCase() + ':', msg.text().substring(0, 300));
});
page.on('pageerror', err => console.log('PAGE_ERR:', err.message));
await page.goto('http://localhost:5111/build-calculator', { timeout: 30000, waitUntil: 'load' });
console.log('Page load event fired');
// Read button text immediately
let buttons = page.locator('.keyContainer > div > div');
let count = await buttons.count();
console.log('Button count:', count);
let qBtn = buttons.filter({ hasText: /^Q/ }).first();
console.log('Immediate Q button text:', JSON.stringify(await qBtn.textContent()));
// Wait for Blazor to finish initializing - look for .blazor-error-boundary or just wait
// Actually, let's poll for the button text changing from what it is now
for (let i = 0; i < 15; i++) {
await page.waitForTimeout(1000);
const text = (await buttons.nth(0).textContent() || '').trim();
// Check all 19 buttons for Q and F keys
const allTexts = [];
for (let j = 0; j < count; j++) {
const t = (await buttons.nth(j).textContent() || '').trim();
if (t.toUpperCase().startsWith('Q') || t.toUpperCase().startsWith('F') || t.toUpperCase().startsWith('W') || t.toUpperCase().startsWith('E')) {
allTexts.push(` B${j}: "${t.substring(0,30)}"`);
}
}
console.log(`After ${i+1}s:`);
allTexts.forEach(t => console.log(t));
}
// Now check what the filter is currently showing
const selects = page.locator('select');
console.log('\nSelect values:');
for (let s = 0; s < await selects.count(); s++) {
const val = await selects.nth(s).inputValue();
const opts = await selects.nth(s).locator('option').allTextContents();
const selectedIdx = await selects.nth(s).evaluate(el => el.selectedIndex);
console.log(` Select ${s}: value=${val}, selectedIndex=${selectedIdx}, options=${JSON.stringify(opts.map(o=>o.trim()))}`);
}
await browser.close();
})();
-74
View File
@@ -1,74 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
page.on('pageerror', err => console.log('PAGE_ERR:', err.message));
page.on('console', msg => {
if (msg.type() === 'error') console.log('CONSOLE_ERR:', msg.text().substring(0,200));
});
try {
await page.goto('http://localhost:5111/build-calculator', { timeout: 30000, waitUntil: 'load' });
console.log('Page loaded');
} catch (e) {
console.log('Page load error:', e.message);
}
await page.waitForTimeout(10000);
console.log('Waited 10s');
const selCount = await page.locator('select').count();
console.log('Select elements count:', selCount);
if (selCount > 0) {
for (let s = 0; s < selCount; s++) {
const opts = await page.locator('select').nth(s).locator('option').allTextContents();
console.log('Select', s, 'options:', JSON.stringify(opts.map(o => o.trim())));
}
await page.locator('select').nth(0).selectOption("Q'Rath");
console.log('Selected Q\' Rath');
await page.waitForTimeout(500);
await page.locator('select').nth(1).selectOption('Orzum');
console.log('Selected Orzum');
await page.waitForTimeout(2000);
// Log all key buttons
const buttons = page.locator('.keyContainer > div > div');
const count = await buttons.count();
console.log('=== All key buttons (' + count + ') ===');
for (let i = 0; i < count; i++) {
const txt = (await buttons.nth(i).textContent() || '').trim();
console.log('Button', i, ':', JSON.stringify(txt.substring(0,60)));
}
// Find Q button
for (let i = 0; i < count; i++) {
const txt = (await buttons.nth(i).textContent() || '');
if (txt.trim().toUpperCase().startsWith('Q')) {
console.log('\nFound Q button at index', i, ':', JSON.stringify(txt.trim().substring(0,60)));
console.log('Clicking it...');
await buttons.nth(i).click({ force: true });
break;
}
}
await page.waitForTimeout(1000);
// Check entity view
const evCount = await page.locator('.entityClickView #entityName').count();
console.log('entityName count:', evCount);
if (evCount > 0) {
const name = (await page.locator('.entityClickView #entityName').textContent() || '').trim();
console.log('entityName text:', JSON.stringify(name));
}
} else {
console.log('No select elements found!');
console.log('URL:', page.url());
const body = await page.evaluate(() => document.body.innerText.substring(0, 500));
console.log('Body text:', JSON.stringify(body));
}
await browser.close();
})();
-59
View File
@@ -1,59 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ viewport: { width: 1920, height: 1080 } });
const page = await context.newPage();
console.log('Navigating...');
await page.goto('https://calm-mud-04916b210.1.azurestaticapps.net/build-calculator', { timeout: 30000, waitUntil: 'domcontentloaded' });
console.log('Page loaded, waiting for Blazor...');
await page.waitForTimeout(8000);
console.log('Selecting Q\'Rath...');
await page.locator('select').nth(0).selectOption("Q'Rath");
await page.waitForTimeout(500);
await page.locator('select').nth(1).selectOption('Orzum');
await page.waitForTimeout(3000);
console.log('Looking for TAB key...');
const allKeys = await page.locator('.keyContainer > div > div').all();
console.log('Total key divs found:', allKeys.length);
for (let i = 0; i < allKeys.length; i++) {
const text = await allKeys[i].textContent();
const preview = (text || '').trim().substring(0, 100);
console.log('Key ' + i + ' starts with:', preview.replace(/\n/g, ' '));
if (text && text.trim().startsWith('TAB')) {
console.log('FOUND TAB KEY at index ' + i);
const entityDivs = await allKeys[i].locator('> div').all();
console.log('Entity divs:', entityDivs.length);
for (const d of entityDivs) {
const t = await d.textContent();
console.log(' Entity:', (t || '').trim());
}
}
}
console.log('Clicking TAB key...');
try {
const tabKey = page.locator('.keyContainer > div > div').filter({ hasText: 'TAB' }).first();
await tabKey.click({ timeout: 5000 });
console.log('Click succeeded');
} catch (e) {
console.log('Click failed:', e.message.substring(0, 200));
}
await page.waitForTimeout(3000);
const entityViewCount = await page.locator('.entityClickView').count();
console.log('entityClickView count:', entityViewCount);
if (entityViewCount > 0) {
const ev = await page.locator('.entityClickView #entityName').textContent();
console.log('Entity view name:', ev);
const id = await page.locator('.entityClickView .entitiesContainer').getAttribute('id');
console.log('Entity container id:', id);
} else {
console.log('Entity click view NOT found - checking for errors...');
const errorEls = await page.locator('[class*=\"error\"], [class*=\"Error\"]').count();
console.log('Error elements:', errorEls);
}
await browser.close();
})().catch(e => { console.error(e.message); process.exit(1); });
-69
View File
@@ -1,69 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:5111/build-calculator', { timeout: 30000, waitUntil: 'networkidle' });
await page.waitForTimeout(10000);
const selects = page.locator('select');
await selects.nth(0).selectOption("Q'Rath");
await page.waitForTimeout(500);
await selects.nth(1).selectOption('Orzum');
await page.waitForTimeout(2000);
// Check entity view before adding
let evCount = await page.locator('.entityClickView #entityName').count();
console.log('entityName count before add:', evCount);
if (evCount > 0) console.log('entityName text:', (await page.locator('.entityClickView #entityName').textContent() || '').trim());
// Check timeline intervals before
let intervals = page.locator('[class*="interval"], .timelineInterval');
console.log('interval count before add:', await intervals.count());
if ((await intervals.count()) > 0) {
console.log('first interval text:', ((await intervals.first().textContent()) || '').trim().substring(0,100));
}
// Click Q
const buttons = page.locator('.keyContainer > div > div');
const count = await buttons.count();
for (let i = 0; i < count; i++) {
const txt = (await buttons.nth(i).textContent()) || '';
if (txt.trim().toUpperCase().startsWith('Q')) {
await buttons.nth(i).click({ force: true });
console.log('Clicked Q button at index', i);
break;
}
}
await page.waitForTimeout(2000);
// Check entity view after adding
evCount = await page.locator('.entityClickView #entityName').count();
console.log('entityName count after add:', evCount);
if (evCount > 0) console.log('entityName text:', ((await page.locator('.entityClickView #entityName').textContent()) || '').trim());
// Check timeline intervals after
intervals = page.locator('[class*="interval"], .timelineInterval');
console.log('interval count after add:', await intervals.count());
if ((await intervals.count()) > 0) {
const ic = await intervals.count();
for (let i = 0; i < Math.min(ic, 3); i++) {
console.log('interval', i, 'text:', ((await intervals.nth(i).textContent()) || '').trim().substring(0,120));
}
}
// Click Clear Build Order
await page.locator('button').filter({ hasText: 'Clear Build Order' }).click();
await page.waitForTimeout(2000);
// Check entity view after clear
evCount = await page.locator('.entityClickView #entityName').count();
console.log('entityName count after clear:', evCount);
if (evCount > 0) console.log('entityName text:', ((await page.locator('.entityClickView #entityName').textContent()) || '').trim());
// Check timeline intervals after clear
intervals = page.locator('[class*="interval"], .timelineInterval');
console.log('interval count after clear:', await intervals.count());
await browser.close();
})();
-39
View File
@@ -1,39 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:5111/build-calculator', { timeout: 30000, waitUntil: 'networkidle' });
await page.waitForTimeout(10000);
const selects = page.locator('select');
await selects.nth(0).selectOption("Q'Rath");
await page.waitForTimeout(500);
await selects.nth(1).selectOption('Orzum');
await page.waitForTimeout(2000);
const grid = page.locator('.calculatorGrid > div');
const gCount = await grid.count();
console.log('calculatorGrid child divs:', gCount);
for (let i = 0; i < gCount; i++) {
const cls = await grid.nth(i).getAttribute('class');
const text = (await grid.nth(i).textContent() || '').trim().substring(0,80);
console.log(' child', i, 'class:', JSON.stringify(cls), 'text:', JSON.stringify(text));
}
// Check for interval-related elements
for (const sel of ['[class*="interval"]', '[class*="Interval"]', '[class*="timeline"]', '[class*="Timeline"]']) {
console.log(sel, 'count:', await page.locator(sel).count());
}
// Also check displayContainer children
const dc = page.locator('.displayContainer');
const dcCount = await dc.count();
console.log('displayContainer count:', dcCount);
for (let i = 0; i < dcCount; i++) {
const cls = await dc.nth(i).getAttribute('class');
const text = (await dc.nth(i).textContent() || '').trim().substring(0,150);
console.log(' dc', i, 'class:', JSON.stringify(cls), 'text:', JSON.stringify(text));
}
await browser.close();
})();
-90
View File
@@ -1,90 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:5111/build-calculator', { timeout: 30000, waitUntil: 'networkidle' });
await page.waitForTimeout(10000);
const selects = page.locator('select');
await selects.nth(0).selectOption("Q'Rath");
await page.waitForTimeout(500);
await selects.nth(1).selectOption('Orzum');
await page.waitForTimeout(2000);
const gridItems = page.locator('.calculatorGrid > div');
const gCount = await gridItems.count();
// Find the timeline section (has "Shows economy" text)
let timelineIdx = -1;
for (let i = 0; i < gCount; i++) {
const txt = (await gridItems.nth(i).textContent() || '');
if (txt.includes('economy')) {
timelineIdx = i;
break;
}
}
console.log('Timeline grid item index:', timelineIdx);
// Get full timeline text before adding
if (timelineIdx >= 0) {
const text = (await gridItems.nth(timelineIdx).textContent() || '').trim();
console.log('Timeline text before add (first 500 chars):');
console.log(text.substring(0, 500));
console.log('...');
console.log('Contains Acropolis:', text.includes('Acropolis'));
console.log('Contains Requested:', text.includes('Requested'));
}
// Click Q to add Acropolis
const buttons = page.locator('.keyContainer > div > div');
const count = await buttons.count();
for (let i = 0; i < count; i++) {
const txt = (await buttons.nth(i).textContent()) || '';
if (txt.trim().toUpperCase().startsWith('Q')) {
await buttons.nth(i).click({ force: true });
console.log('Clicked Q at index', i);
break;
}
}
await page.waitForTimeout(2000);
// Check entity view
const evName = (await page.locator('.entityClickView #entityName').textContent() || '').trim();
console.log('EntityView name after add:', evName);
// Get timeline text after adding
if (timelineIdx >= 0) {
const text = (await gridItems.nth(timelineIdx).textContent() || '').trim();
console.log('Timeline text after add (first 500 chars):');
console.log(text.substring(0, 500));
console.log('Contains Acropolis:', text.includes('Acropolis'));
console.log('Contains Requested:', text.includes('Requested'));
console.log('Contains New:', text.includes('New'));
}
// Count Virtualize items in timeline
const virtualItems = page.locator('[style*="grid-template-columns: 1fr 1fr"]');
console.log('Virtualize items (grid items):', await virtualItems.count());
// Click Clear Build Order
await page.locator('button').filter({ hasText: 'Clear Build Order' }).click();
await page.waitForTimeout(2000);
// Check entity view after clear
const evAfterClear = await page.locator('.entityClickView #entityName').count();
console.log('EntityView #entityName count after clear:', evAfterClear);
if (evAfterClear > 0) {
console.log('EntityView name after clear:', (await page.locator('.entityClickView #entityName').textContent() || '').trim());
}
// Check timeline after clear
if (timelineIdx >= 0) {
const text = (await gridItems.nth(timelineIdx).textContent() || '').trim();
console.log('Timeline text after clear (first 300 chars):');
console.log(text.substring(0, 300));
console.log('Contains Acropolis:', text.includes('Acropolis'));
console.log('Virtualize items:', await virtualItems.count());
}
await browser.close();
})();
-64
View File
@@ -1,64 +0,0 @@
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:5111/build-calculator', { timeout: 30000, waitUntil: 'networkidle' });
await page.waitForTimeout(10000);
const selects = page.locator('select');
await selects.nth(0).selectOption("Q'Rath");
await page.waitForTimeout(500);
await selects.nth(1).selectOption('Orzum');
await page.waitForTimeout(2000);
const gridItems = page.locator('.calculatorGrid > div');
const gCount = await gridItems.count();
for (let i = 0; i < gCount; i++) {
const txt = (await gridItems.nth(i).textContent() || '').trim();
const cls = await gridItems.nth(i).getAttribute('class');
console.log('=== Grid Item', i, 'class:', cls, '===');
console.log(txt.substring(0, 200));
console.log('---');
}
console.log('\n=== Clicking Q ===');
const buttons = page.locator('.keyContainer > div > div');
const count = await buttons.count();
for (let i = 0; i < count; i++) {
const txt = (await buttons.nth(i).textContent()) || '';
if (txt.trim().toUpperCase().startsWith('Q')) {
await buttons.nth(i).click({ force: true });
break;
}
}
await page.waitForTimeout(2000);
console.log('\n=== After Q click ===');
for (let i = 0; i < gCount; i++) {
const txt = (await gridItems.nth(i).textContent() || '').trim();
console.log('Grid', i, '- contains Acropolis:', txt.includes('Acropolis'));
if (txt.includes('Acropolis')) {
console.log(' Text around Acropolis:');
const idx = txt.indexOf('Acropolis');
console.log(' ', txt.substring(Math.max(0, idx - 40), idx + 40));
}
}
// Entity view
console.log('\nEntityView name:', (await page.locator('.entityClickView #entityName').textContent() || '').trim());
// Click Clear
await page.locator('button').filter({ hasText: 'Clear Build Order' }).click();
await page.waitForTimeout(2000);
console.log('\n=== After Clear ===');
for (let i = 0; i < gCount; i++) {
const txt = (await gridItems.nth(i).textContent() || '').trim();
console.log('Grid', i, '- contains Acropolis:', txt.includes('Acropolis'));
}
console.log('\nEntityView after clear count:', await page.locator('.entityClickView #entityName').count());
await browser.close();
})();