Files
qwenpaw/e2e/pages/token_usage_page.py
agent-radar 1a3a4ccde1
Creator App Tests / PR Spam Gate (push) Skipped
Frontend Tests / PR Spam Gate (push) Skipped
NPM Format (website & console) / PR Spam Gate (push) Skipped
Pre-commit Checks / PR Spam Gate (push) Skipped
QwenPaw Creator Plugin Release / check-version (push) Canceled after 0s
QwenPaw Creator Plugin Release / upload-oss (push) Canceled after 0s
Tests / PR Spam Gate (push) Skipped
CodeQL / CodeQL (python) (push) Canceled after 0s
CodeQL / CodeQL (typescript) (push) Canceled after 0s
Creator App Tests / Creator Backend Tests (push) Canceled after 0s
Creator App Tests / Creator UI Build & Tests (push) Canceled after 0s
E2E Smoke Tests / Playwright UI Smoke (push) Canceled after 0s
Frontend Tests / Detect console changes (push) Canceled after 0s
NPM Format (website & console) / website format check (push) Canceled after 0s
NPM Format (website & console) / console format check (push) Canceled after 0s
Pre-commit Checks / Pre-commit (push) Canceled after 0s
QwenPaw Data Plugin Release / check-version (push) Canceled after 0s
Tests / Detect code changes (push) Canceled after 0s
Frontend Tests / Vitest Unit Tests (push) Canceled after 0s
Frontend Tests / Frontend Summary (push) Canceled after 0s
QwenPaw Data Plugin Release / upload-oss (push) Canceled after 0s
Tests / Maintainer Approval (push) Canceled after 0s
Tests / Unit Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - fallback (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p2 (push) Canceled after 0s
Tests / Coverage Report (push) Canceled after 0s
Tests / Test Summary (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:01:50 +08:00

116 lines
2.8 KiB
Python

# -*- coding: utf-8 -*-
"""
QwenPaw Token Usage page object.
Wraps all interactions on the token usage statistics page and exposes
business-level methods.
"""
from __future__ import annotations
import logging
from typing import Optional, List
from playwright.sync_api import Page, Locator
from pages.base_page import BasePage
from config.settings import config
logger = logging.getLogger(__name__)
class TokenUsagePage(BasePage):
"""
Token Usage page object.
Wraps all user interactions on the token usage statistics page:
- Page navigation
- Fetching usage data
- Viewing charts
"""
PAGE_TITLE = "Token Usage"
PAGE_URL = f"{config.base_url}/token-usage"
# ========== Selector definitions ==========
# Table-related selectors
USAGE_TABLE = ".qwenpaw-table"
USAGE_ROW = ".qwenpaw-table-tbody tr"
# Date picker
DATE_PICKER = ".qwenpaw-picker"
# Chart container
CHART_CONTAINER = 'div[class*="chart"], canvas'
# ========== Initialization ==========
def __init__(self, page: Page):
super().__init__(page)
logger.info("TokenUsagePage initialized")
# ========== Page navigation ==========
def open(self) -> "TokenUsagePage":
"""Open the Token Usage page."""
logger.info("Opening Token Usage page")
self.goto()
self.wait_for_loading()
return self
def wait_for_page_loaded(self) -> bool:
"""
Wait for the page to finish loading.
Returns:
True if the page loaded successfully.
"""
try:
self.wait_for_element(self.USAGE_TABLE, timeout=10000)
return True
except Exception as e:
logger.error(f"Page load failed: {e}")
return False
# ========== Data retrieval ==========
def get_usage_rows(self) -> List[Locator]:
"""
Return all usage rows.
Returns:
List of Locator objects.
"""
logger.info("Getting usage rows")
return self.find_all(self.USAGE_ROW)
def get_chart(self) -> Optional[Locator]:
"""
Return the chart element.
Returns:
Chart Locator, or None if not found.
"""
logger.info("Getting chart element")
try:
chart = self.find(self.CHART_CONTAINER)
if chart.count() > 0:
return chart
return None
except Exception as e:
logger.warning(f"Chart not found: {e}")
return None
def has_usage_data(self) -> bool:
"""
Check whether usage data is present.
Returns:
True if usage data exists.
"""
logger.info("Checking if usage data exists")
try:
rows = self.get_usage_rows()
return len(rows) > 0
except Exception:
return False