from io import BytesIO import os os.system("playwright install chromium") import threading import queue from playwright.sync_api import sync_playwright from playwright_stealth import Stealth from PIL import Image import gradio as gr task_queue = queue.Queue() result_queue = queue.Queue() browser_context = { "thread": None, "running": False } def playwright_worker(): with Stealth().use_sync(sync_playwright()) as p: browser = p.chromium.launch(headless=True, args=["--no-sandbox"]) context = browser.new_context() page = context.new_page() while True: task = task_queue.get() if task == "__EXIT__": break try: result = eval(task) except Exception as e: result = str(e) screenshot = Image.open(BytesIO(page.screenshot())) result_queue.put((result, screenshot)) browser.close() def start_browser(): if not browser_context["running"]: t = threading.Thread(target=playwright_worker, daemon=True) t.start() browser_context["thread"] = t browser_context["running"] = True return "Browser Started!" return "Browser Already Running." def stop_browser(): if browser_context["running"]: task_queue.put("__EXIT__") browser_context["running"] = False return "Browser Closed!" return "Browser Not Running." def send_task(x): if not browser_context["running"]: return "Browser is not running. Click 'Open Browser' first.", None task_queue.put(x) return result_queue.get() with gr.Blocks() as demo: gr.Markdown("## 🔥 Playwright Browser Controller with Gradio") with gr.Row(): open_btn = gr.Button("Open Browser") close_btn = gr.Button("Close Browser") code_input = gr.TextArea(label="Python Code to Execute") output_text = gr.TextArea(label="Output") output_image = gr.Image(label="Screenshot") open_btn.click(start_browser, outputs=output_text) close_btn.click(stop_browser, outputs=output_text) code_input.submit(send_task, inputs=code_input, outputs=[output_text, output_image]) demo.launch()