import { Page, Locator } from '@playwright/test'; export class GraphsPage { readonly page: Page; // Main container readonly graphsPage: Locator; // Chart section readonly chartContainer: Locator; readonly chartTitle: Locator; readonly chartEmptyState: Locator; readonly chartEmptyIcon: Locator; readonly chartEmptyMessage: Locator; // Stats cards readonly statsGrid: Locator; readonly statCards: Locator; readonly peakHashrateStat: Locator; readonly efficiencyStat: Locator; readonly avgShareTimeStat: Locator; readonly difficultyStat: Locator; constructor(page: Page) { this.page = page; // Main container this.graphsPage = page.locator('.graphs-page'); // Chart section this.chartContainer = page.locator('.chart-card'); this.chartTitle = page.getByRole('heading', { name: 'Hashrate Over Time' }); this.chartEmptyState = page.locator('.chart-empty'); this.chartEmptyIcon = page.locator('.chart-empty svg'); this.chartEmptyMessage = page.getByText('Start mining to see hashrate graphs'); // Stats cards this.statsGrid = page.locator('.stats-grid'); this.statCards = page.locator('.stat-card'); this.peakHashrateStat = page.getByText('Peak Hashrate').locator('..'); this.efficiencyStat = page.locator('.stat-card').filter({ hasText: 'Efficiency' }); this.avgShareTimeStat = page.getByText('Avg. Share Time').locator('..'); this.difficultyStat = page.locator('.stat-card').filter({ hasText: 'Difficulty' }); } async isVisible(): Promise { // Use the chart title as the indicator since CSS classes may not pierce shadow DOM return await this.chartTitle.isVisible(); } async isChartEmpty(): Promise { return await this.chartEmptyMessage.isVisible(); } async getPeakHashrate(): Promise { const valueEl = this.peakHashrateStat.locator('.stat-value'); return await valueEl.textContent() ?? ''; } async getEfficiency(): Promise { const valueEl = this.efficiencyStat.locator('.stat-value'); return await valueEl.textContent() ?? ''; } async getAvgShareTime(): Promise { const valueEl = this.avgShareTimeStat.locator('.stat-value'); return await valueEl.textContent() ?? ''; } async getDifficulty(): Promise { const valueEl = this.difficultyStat.locator('.stat-value'); return await valueEl.textContent() ?? ''; } async getStatsCardCount(): Promise { // Count by checking for known stat labels let count = 0; const labels = ['Peak Hashrate', 'Efficiency', 'Avg. Share Time', 'Difficulty']; for (const label of labels) { const labelEl = this.page.getByText(label); if (await labelEl.isVisible()) count++; } return count; } }