|
|
|
@ -211,6 +211,10 @@ def run_browser_flow(base_url: str) -> None: |
|
|
|
page.get_by_role("menu").get_by_role("button", name="Download").wait_for() |
|
|
|
page.get_by_role("menu").get_by_role("button", name="Reconcile").wait_for() |
|
|
|
page.screenshot(path=str(OUTPUT_DIR / "files-grid-menu.png"), full_page=True) |
|
|
|
page.mouse.click(40, 120) |
|
|
|
page.get_by_role("menu").wait_for(state="detached") |
|
|
|
page.locator(".drive-grid .drive-item", has_text="playwright-preview.png").get_by_role("button", name="More").click() |
|
|
|
page.get_by_role("menu").wait_for() |
|
|
|
page.keyboard.press("Escape") |
|
|
|
page.get_by_role("menu").wait_for(state="detached") |
|
|
|
page.locator(".drive-grid .drive-item", has_text="playwright-preview.png").get_by_role("button", name="More").click() |
|
|
|
@ -263,12 +267,14 @@ def run_browser_flow(base_url: str) -> None: |
|
|
|
page.get_by_role("button", name="Edit").first.click() |
|
|
|
page.get_by_role("dialog").get_by_text("Stored secrets").wait_for() |
|
|
|
page.screenshot(path=str(OUTPUT_DIR / "storage-edit-dialog.png"), full_page=True) |
|
|
|
page.get_by_role("dialog").get_by_role("button", name="Cancel").click() |
|
|
|
page.mouse.click(24, 24) |
|
|
|
page.get_by_role("dialog").wait_for(state="detached") |
|
|
|
page.screenshot(path=str(OUTPUT_DIR / "storage-page.png"), full_page=True) |
|
|
|
page.get_by_role("button", name="Add Backend").click() |
|
|
|
page.get_by_role("dialog").get_by_label("Config JSON").wait_for() |
|
|
|
page.screenshot(path=str(OUTPUT_DIR / "storage-create-dialog.png"), full_page=True) |
|
|
|
page.get_by_role("dialog").get_by_role("button", name="Cancel").click() |
|
|
|
page.mouse.click(24, 24) |
|
|
|
page.get_by_role("dialog").wait_for(state="detached") |
|
|
|
|
|
|
|
page.goto(f"{base_url}/app/policies", wait_until="networkidle") |
|
|
|
page.get_by_role("button", name="Save Policy").wait_for() |
|
|
|
@ -281,6 +287,7 @@ def run_browser_flow(base_url: str) -> None: |
|
|
|
page.locator(".jobs-table-row").first.click() |
|
|
|
page.locator(".jobs-detail-panel", has_text="Job Detail").wait_for() |
|
|
|
page.locator(".payload-preview").wait_for() |
|
|
|
assert_jobs_id_layout(page, failures) |
|
|
|
page.screenshot(path=str(OUTPUT_DIR / "jobs-page.png"), full_page=True) |
|
|
|
|
|
|
|
mobile_context = browser.new_context(viewport={"width": 390, "height": 844}) |
|
|
|
@ -370,5 +377,23 @@ def assert_pagination_controls(page, label: str, failures: list[str]) -> None: |
|
|
|
failures.append(f"{label} page size selector missing") |
|
|
|
|
|
|
|
|
|
|
|
def assert_jobs_id_layout(page, failures: list[str]) -> None: # type: ignore[no-untyped-def] |
|
|
|
overlaps = page.locator(".jobs-detail-meta > div").evaluate_all( |
|
|
|
"""(nodes) => nodes |
|
|
|
.filter((node) => node.textContent && node.textContent.includes("ID")) |
|
|
|
.map((node) => { |
|
|
|
const label = node.querySelector("span"); |
|
|
|
const value = node.querySelector("strong"); |
|
|
|
if (!label || !value) return false; |
|
|
|
const left = label.getBoundingClientRect(); |
|
|
|
const right = value.getBoundingClientRect(); |
|
|
|
return !(left.right <= right.left || right.right <= left.left || left.bottom <= right.top || right.bottom <= left.top); |
|
|
|
}) |
|
|
|
.some(Boolean)""" |
|
|
|
) |
|
|
|
if overlaps: |
|
|
|
failures.append("Jobs detail ID overlaps its label") |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
raise SystemExit(main()) |
|
|
|
|