import { Page, Locator } from '@playwright/test'; export class MinersPage { readonly page: Page; // Header readonly pageTitle: Locator; readonly pageDescription: Locator; // System info header readonly systemInfoTitle: Locator; constructor(page: Page) { this.page = page; // Header this.pageTitle = page.getByRole('heading', { name: 'Miner Software' }); this.pageDescription = page.getByText('Install and manage mining software'); // System info this.systemInfoTitle = page.getByRole('heading', { name: 'System Information' }); } async isVisible(): Promise { return await this.pageTitle.isVisible(); } async getMinerCount(): Promise { // Count cards by looking for miner names (xmrig, tt-miner, etc.) const xmrigCard = this.page.getByRole('heading', { name: 'xmrig', exact: true }); const ttMinerCard = this.page.getByRole('heading', { name: 'tt-miner', exact: true }); let count = 0; if (await xmrigCard.isVisible()) count++; if (await ttMinerCard.isVisible()) count++; return count; } async getMinerNames(): Promise { const names: string[] = []; // Check for common miner names const minerNames = ['xmrig', 'tt-miner', 'lolminer', 'trex']; for (const name of minerNames) { const heading = this.page.getByRole('heading', { name: name, exact: true }); if (await heading.isVisible()) { names.push(name); } } return names; } async isMinerInstalled(minerName: string): Promise { const installedText = this.page.getByText('Installed').first(); // Find the card section containing the miner name const section = this.page.locator(`text=${minerName}`).locator('..'); return await section.getByText('Installed').isVisible().catch(() => false); } async clickInstallMiner(minerName: string) { // Find Install button near the miner name const installBtn = this.page.getByRole('button', { name: 'Install' }); await installBtn.click(); } async clickUninstallMiner(minerName: string) { const uninstallBtn = this.page.getByRole('button', { name: 'Uninstall' }); await uninstallBtn.click(); } async isInstallButtonVisible(minerName: string): Promise { const installBtn = this.page.getByRole('button', { name: 'Install' }); return await installBtn.isVisible(); } async isUninstallButtonVisible(minerName: string): Promise { const uninstallBtn = this.page.getByRole('button', { name: 'Uninstall' }); return await uninstallBtn.isVisible(); } async hasSystemInfo(): Promise { return await this.systemInfoTitle.isVisible(); } async getPlatform(): Promise { const platformLabel = this.page.getByText('Platform'); const platformSection = platformLabel.locator('..'); // Get the next sibling or adjacent text const platformText = await platformSection.textContent() ?? ''; // Extract value after "Platform" return platformText.replace('Platform', '').trim(); } async getCPU(): Promise { const cpuLabel = this.page.getByText('CPU'); const cpuSection = cpuLabel.locator('..'); const cpuText = await cpuSection.textContent() ?? ''; return cpuText.replace('CPU', '').trim(); } async getCores(): Promise { const coresLabel = this.page.getByText('Cores'); const coresSection = coresLabel.locator('..'); const coresText = await coresSection.textContent() ?? ''; return coresText.replace('Cores', '').trim(); } async getMemory(): Promise { const memoryLabel = this.page.getByText('Memory'); const memorySection = memoryLabel.locator('..'); const memoryText = await memorySection.textContent() ?? ''; return memoryText.replace('Memory', '').trim(); } }