Spaces:
Running
Running
| """Drive the Gradio chat UI end-to-end with Playwright (real conversation).""" | |
| import asyncio | |
| import sys | |
| from playwright.async_api import async_playwright | |
| URL = "http://127.0.0.1:7860" | |
| TURNS = [ | |
| "Hallo, help me energieprijzen vergelijken", | |
| "9000 Gent", | |
| "Voor mijn woning", | |
| "Elektriciteit en gas allebei", | |
| "Nee, ik ken mijn verbruik niet", | |
| "Ja, een digitale meter", | |
| "Enkelvoudig tarief", | |
| "We wonen met 3 personen", | |
| "Nee, geen warmtepomp, geen elektrische wagen, geen zonnepanelen en geen thuisbatterij", | |
| "Ja, dien maar in!", | |
| ] | |
| async def last_bot_message(page) -> str: | |
| return await page.evaluate( | |
| """() => { | |
| const msgs = document.querySelectorAll('.bot, [data-testid="bot"]'); | |
| const last = msgs[msgs.length - 1]; | |
| return last ? last.innerText.trim() : ''; | |
| }""" | |
| ) | |
| async def wait_for_reply(page, prev: str, timeout_s: int = 120) -> str: | |
| for _ in range(timeout_s * 2): | |
| await asyncio.sleep(0.5) | |
| cur = await last_bot_message(page) | |
| if cur and cur != prev: | |
| busy = await page.evaluate( | |
| """() => !!document.querySelector('.generating, [class*="pending"]')""" | |
| ) | |
| if not busy: | |
| await asyncio.sleep(1.0) | |
| settled = await last_bot_message(page) | |
| if settled == cur: | |
| return cur | |
| raise TimeoutError("no reply within timeout") | |
| async def main() -> None: | |
| async with async_playwright() as p: | |
| browser = await p.chromium.launch(headless=True) | |
| page = await browser.new_page() | |
| await page.goto(URL) | |
| box = page.locator('textarea').first | |
| await box.wait_for(timeout=15_000) | |
| prev = "" | |
| for turn in TURNS: | |
| print(f"\n>>> USER: {turn}") | |
| await box.fill(turn) | |
| await box.press("Enter") | |
| try: | |
| prev = await wait_for_reply(page, prev) | |
| except TimeoutError: | |
| print("!!! TIMEOUT waiting for reply") | |
| sys.exit(1) | |
| print(f"<<< AGENT: {prev}") | |
| await browser.close() | |
| if __name__ == "__main__": | |
| asyncio.run(main()) | |