返回 DeepSeek-Reasonix
session-draft-browser.py
根目录 / desktop / frontend / bench / session-draft-browser.py
1 """Run against an isolated mock Vite server; never invokes a model provider."""
2 import argparse
3 import json
4 from playwright.sync_api import sync_playwright, expect
5
6 parser = argparse.ArgumentParser()
7 parser.add_argument('--url', default='http://127.0.0.1:5189/?mock=bench&bench=1')
8 parser.add_argument('--chromium', required=True)
9 args = parser.parse_args()
10
11 with sync_playwright() as p:
12 browser = p.chromium.launch(headless=True, executable_path=args.chromium)
13 page = browser.new_page(viewport={'width': 1440, 'height': 1000})
14 errors = []
15 page.on('pageerror', lambda error: errors.append(str(error)))
16 page.goto(args.url)
17 page.wait_for_load_state('networkidle')
18 composer = page.locator('textarea.composer__input:not([aria-hidden=true])')
19 project_new = page.locator('.project-tree__folder-action--create').first
20 history = page.locator('.project-tree__topic-main').filter(has_text='bench:small-6t').first
21 history.click()
22 expect(composer).to_be_enabled()
23 rows = page.locator('.project-tree__topic-main').count()
24 page.locator('.project-tree__folder--project').first.hover()
25 project_new.click()
26 expect(page.locator('.main--draft-landing')).to_have_count(1)
27 expect(page.locator('.welcome-creation__headline')).to_be_visible()
28 expect(page.locator('.session-draft-surface')).to_have_count(0)
29 composer.fill('persistent draft ownership fixture')
30 for _ in range(20):
31 page.locator('.project-tree__folder--project').first.hover()
32 project_new.click()
33 expect(composer).to_have_value('persistent draft ownership fixture')
34 assert page.locator('.project-tree__topic-main').count() == rows
35 page.locator('.sidebar__quick-action').first.click()
36 expect(composer).to_have_value('persistent draft ownership fixture')
37 history.click()
38 expect(page.locator('.main--draft-landing')).to_have_count(0)
39 page.keyboard.press('Meta+n')
40 expect(page.locator('.main--draft-landing')).to_have_count(1)
41 expect(page.locator('.welcome-creation__headline')).to_be_visible()
42 expect(composer).to_have_value('persistent draft ownership fixture')
43 history.click()
44 expect(page.locator('.main--draft-landing')).to_have_count(0)
45 page.locator('.project-tree__folder--project').first.click(button='right')
46 page.get_by_role('menuitem', name='New session', exact=True).click()
47 expect(composer).to_have_value('persistent draft ownership fixture')
48 history.click()
49 expect(page.locator('.main--draft-landing')).to_have_count(0)
50 page.keyboard.press('Meta+k')
51 page.locator('.palette input').fill('New session')
52 page.get_by_role('option').filter(has_text='New session').first.click()
53 expect(composer).to_have_value('persistent draft ownership fixture')
54 page.evaluate('() => window.__reasonixFlushSessionDraft()')
55 page.evaluate('() => window.__reasonixResumeSessionDraftEditing()')
56 # Each sample begins from a different, fully installed history surface.
57 times = []
58 for _ in range(30):
59 history.click()
60 expect(page.locator('.main--draft-landing')).to_have_count(0)
61 expect(page.locator('.transcript-navigation-surface[aria-busy=false]')).to_be_visible()
62 elapsed = page.evaluate('''() => new Promise(resolve => {
63 const start = performance.now();
64 document.querySelector('.project-tree__folder-action--create').click();
65 const inspect = () => {
66 const input = document.querySelector('textarea.composer__input:not([aria-hidden=true])');
67 if (document.querySelector('.main--draft-landing') && input && !input.disabled && input.value === 'persistent draft ownership fixture') resolve(performance.now()-start);
68 else requestAnimationFrame(inspect);
69 };
70 requestAnimationFrame(inspect);
71 })''')
72 times.append(elapsed)
73 expect(composer).to_have_value('persistent draft ownership fixture')
74 assert not errors, errors
75 print(json.dumps({'mode': 'mock-browser', 'new_clicks': 20, 'entrypoints': ['project-plus','top-new','shortcut','context-menu','command-palette'], 'session_rows_unchanged': True,
76 'restore_samples': len(times), 'restore_p95_ms': sorted(times)[28], 'errors': errors}))
77 browser.close()
78
78 lines PYTHON