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