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()