|
|
@ -191,6 +191,7 @@ def run_browser_flow(base_url: str) -> None: |
|
|
page.locator(".drive-item strong", has_text="playwright-preview.png").first.click() |
|
|
page.locator(".drive-item strong", has_text="playwright-preview.png").first.click() |
|
|
page.locator("img.preview-frame").wait_for(timeout=15000) |
|
|
page.locator("img.preview-frame").wait_for(timeout=15000) |
|
|
page.locator(".drive-item", has_text="playwright-preview.png").locator(".replica-ratio", has_text="1/1").wait_for() |
|
|
page.locator(".drive-item", has_text="playwright-preview.png").locator(".replica-ratio", has_text="1/1").wait_for() |
|
|
|
|
|
assert_label_value_layout(page, ".detail-panel .inspector-storage-summary > div", "File inspector summary", failures) |
|
|
page.screenshot(path=str(OUTPUT_DIR / "files-preview-selected.png"), full_page=True) |
|
|
page.screenshot(path=str(OUTPUT_DIR / "files-preview-selected.png"), full_page=True) |
|
|
page.locator(".drive-item", has_text="playwright-preview.png").get_by_role("button", name="More").click() |
|
|
page.locator(".drive-item", has_text="playwright-preview.png").get_by_role("button", name="More").click() |
|
|
page.get_by_role("menu").wait_for() |
|
|
page.get_by_role("menu").wait_for() |
|
|
@ -287,7 +288,7 @@ def run_browser_flow(base_url: str) -> None: |
|
|
page.locator(".jobs-table-row").first.click() |
|
|
page.locator(".jobs-table-row").first.click() |
|
|
page.locator(".jobs-detail-panel", has_text="Job Detail").wait_for() |
|
|
page.locator(".jobs-detail-panel", has_text="Job Detail").wait_for() |
|
|
page.locator(".payload-preview").wait_for() |
|
|
page.locator(".payload-preview").wait_for() |
|
|
assert_jobs_id_layout(page, failures) |
|
|
assert_label_value_layout(page, ".jobs-detail-meta > div, .jobs-status-main, .jobs-status-attempts", "Jobs detail", failures) |
|
|
page.screenshot(path=str(OUTPUT_DIR / "jobs-page.png"), full_page=True) |
|
|
page.screenshot(path=str(OUTPUT_DIR / "jobs-page.png"), full_page=True) |
|
|
|
|
|
|
|
|
mobile_context = browser.new_context(viewport={"width": 390, "height": 844}) |
|
|
mobile_context = browser.new_context(viewport={"width": 390, "height": 844}) |
|
|
@ -377,22 +378,23 @@ def assert_pagination_controls(page, label: str, failures: list[str]) -> None: |
|
|
failures.append(f"{label} page size selector missing") |
|
|
failures.append(f"{label} page size selector missing") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def assert_jobs_id_layout(page, failures: list[str]) -> None: # type: ignore[no-untyped-def] |
|
|
def assert_label_value_layout(page, selector: str, label: str, failures: list[str]) -> None: # type: ignore[no-untyped-def] |
|
|
overlaps = page.locator(".jobs-detail-meta > div").evaluate_all( |
|
|
layout_errors = page.locator(selector).evaluate_all( |
|
|
"""(nodes) => nodes |
|
|
"""(nodes) => nodes |
|
|
.filter((node) => node.textContent && node.textContent.includes("ID")) |
|
|
|
|
|
.map((node) => { |
|
|
.map((node) => { |
|
|
const label = node.querySelector("span"); |
|
|
const label = node.querySelector("span"); |
|
|
const value = node.querySelector("strong"); |
|
|
const value = node.querySelector("strong"); |
|
|
if (!label || !value) return false; |
|
|
if (!label || !value) return ""; |
|
|
const left = label.getBoundingClientRect(); |
|
|
const left = label.getBoundingClientRect(); |
|
|
const right = value.getBoundingClientRect(); |
|
|
const right = value.getBoundingClientRect(); |
|
|
return !(left.right <= right.left || right.right <= left.left || left.bottom <= right.top || right.bottom <= left.top); |
|
|
const overlaps = !(left.right <= right.left || right.right <= left.left || left.bottom <= right.top || right.bottom <= left.top); |
|
|
|
|
|
const sameLineTooTight = Math.abs(left.top - right.top) < 4 && right.left - left.right < 8; |
|
|
|
|
|
return overlaps || sameLineTooTight ? (node.textContent || "unknown").trim() : ""; |
|
|
}) |
|
|
}) |
|
|
.some(Boolean)""" |
|
|
.filter(Boolean)""" |
|
|
) |
|
|
) |
|
|
if overlaps: |
|
|
if layout_errors: |
|
|
failures.append("Jobs detail ID overlaps its label") |
|
|
failures.append(f"{label} label/value layout is too tight: {layout_errors}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
if __name__ == "__main__": |
|
|
|