"""Actual keyboard partial date validation; no synthetic .value='invalid' workaround.""" from pathlib import Path import json from playwright.sync_api import sync_playwright with sync_playwright() as p: b=p.chromium.launch(channel='chromium');page=b.new_page(locale='en-US');page.goto('http://127.0.0.1:5201/batch-two?sample=audit',wait_until='networkidle');page.select_option('#audit-time-range','Custom');page.locator('#audit-from').focus();page.keyboard.press('ArrowLeft');page.keyboard.type('1');page.keyboard.press('Tab');before=page.locator('#audit-from').evaluate('e=>({value:e.value,badInput:e.validity.badInput,valid:e.validity.valid})');page.click('[data-test=filter-apply]');page.wait_for_timeout(100);record={'partialInput':before,'afterPartialApply':page.locator('#local-filter-result').inner_text(),'focusedInvalidInput':page.locator('#audit-from').evaluate('e=>e===document.activeElement'),'formCount':page.locator('form[data-test=audit-filter-bar]').count()};cdp=page.context.new_cdp_session(page);doc=cdp.send('DOM.getDocument');node=cdp.send('DOM.querySelector',{'nodeId':doc['root']['nodeId'],'selector':'#audit-from'});ax=cdp.send('Accessibility.getPartialAXTree',{'nodeId':node['nodeId'],'fetchRelatives':False});record['chromiumAXInvalid']=next((x['value']['value'] for x in ax['nodes'][0].get('properties',[]) if x['name']=='invalid'),None);record['explicitAriaInvalid']=page.get_attribute('#audit-from','aria-invalid');page.fill('#audit-from','');page.locator('#audit-to').focus();record['clearedInput']=page.locator('#audit-from').evaluate('e=>({value:e.value,badInput:e.validity.badInput,valid:e.validity.valid})');page.click('[data-test=filter-apply]');page.wait_for_function('document.querySelector("#local-filter-result").textContent.startsWith("From=")');record['afterIntentionalClear']=page.locator('#local-filter-result').inner_text();record['passed']=before['badInput'] and record['afterPartialApply']=='No local filter applied' and record['focusedInvalidInput'] and record['chromiumAXInvalid']=='true' and record['clearedInput']['valid'] and record['afterIntentionalClear']=='From=;To=;FromKind=;ToKind=';Path('docs/ui-consistency/evidence/sb04-06/native-partial-after.json').write_text(json.dumps(record,indent=2)+'\n');print(record);b.close()