shethjenil's picture
Update app.py
ce233f2 verified
raw
history blame
2.22 kB
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()