Explorer
/proc/thread-self/root/tmp/aa004_ui_test.py
← Zurück ↓ Download
from pathlib import Path
from playwright.sync_api import sync_playwright

url = 'http://127.0.0.1:8000/'
out = Path('/home/hermes/AA-004-ui-regression.png')
console = []
page_errors = []
failed = []
with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(viewport={'width': 1440, 'height': 1000})
    page.on('console', lambda m: console.append(f'{m.type}: {m.text}'))
    page.on('pageerror', lambda e: page_errors.append(str(e)))
    page.on('requestfailed', lambda r: failed.append(f'{r.method} {r.url}: {r.failure}'))
    page.goto(url, wait_until='domcontentloaded', timeout=60000)
    page.wait_for_selector('#tab-features', state='visible', timeout=30000)
    page.click('#tab-features', position={'x': 20, 'y': 12})
    page.wait_for_timeout(500)
    assert page.locator('#features-mode').is_visible()
    selectors = {
        'typ': '#feature-type-filter',
        'stichwort': '#feature-keyword-filter',
        'sortierung': '#feature-sort-select',
        'sprache': '#feature-lang-filter',
        'zeitraum': '#feature-days-quick',
        'top_thema': '#feature-top-n',
        'abonnenten': '#feature-subscriber-filter',
        'views': '#feature-view-filter',
    }
    values = {
        'typ': 'new_feature', 'stichwort': 'AI', 'sortierung': 'oldest',
        'sprache': 'de', 'zeitraum': '7', 'top_thema': '3',
        'abonnenten': '1001_5000', 'views': '101_500',
    }
    for name, sel in selectors.items():
        loc = page.locator(sel)
        assert loc.is_enabled(), name
        box = loc.bounding_box(); assert box and box['width'] > 0 and box['height'] > 0, name
        page.mouse.click(box['x'] + 4, box['y'] + 4)
        if name == 'stichwort':
            page.fill(sel, values[name])
        else:
            page.select_option(sel, values[name])
        assert loc.input_value() == values[name], (name, loc.input_value())
    page.screenshot(path=str(out), full_page=False)
    # Reset is a real mouse click and must restore both new filters.
    reset = page.locator('button[onclick="resetFeatureFilters()"]')
    assert reset.count() == 1 and reset.is_enabled()
    reset.click(position={'x': 20, 'y': 12})
    page.wait_for_timeout(250)
    assert page.locator('#feature-subscriber-filter').input_value() == ''
    assert page.locator('#feature-view-filter').input_value() == ''
    # Switch to library and click the real search button without an active query.
    page.click('#tab-bibliothek', position={'x': 20, 'y': 12})
    search = page.locator('#btn-search')
    assert search.is_visible() and search.is_enabled()
    search.click(position={'x': 20, 'y': 12})
    page.wait_for_timeout(250)
    print('browser_page=ok')
    print('mouse_dropdowns=8/8')
    print('selected_and_reset=ok')
    print('search_button=clicked')
    print('console_messages=', console[:20])
    print('page_errors=', page_errors)
    print('request_failed=', failed[:20])
    print('screenshot=', out)
    browser.close()