Spaces:
No application file
No application file
File size: 5,357 Bytes
4aa7109 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
import requests
import base64
import json
from typing import Optional
class BrowserAutomationClient:
def __init__(self, base_url: str):
self.base_url = base_url.rstrip('/')
self.session_id: Optional[str] = None
def create_session(self) -> str:
"""Create a new browser session"""
response = requests.post(f"{self.base_url}/session/create")
response.raise_for_status()
data = response.json()
self.session_id = data["session_id"]
return self.session_id
def close_session(self):
"""Close the current session"""
if not self.session_id:
raise ValueError("No active session")
response = requests.delete(f"{self.base_url}/session/{self.session_id}")
response.raise_for_status()
self.session_id = None
def navigate(self, url: str) -> dict:
"""Navigate to a URL"""
if not self.session_id:
raise ValueError("No active session")
response = requests.post(
f"{self.base_url}/session/{self.session_id}/navigate",
json={"url": url}
)
response.raise_for_status()
return response.json()
def click(self, selector: str, selector_type: str = "css") -> dict:
"""Click an element"""
if not self.session_id:
raise ValueError("No active session")
response = requests.post(
f"{self.base_url}/session/{self.session_id}/click",
json={"selector": selector, "selector_type": selector_type}
)
response.raise_for_status()
return response.json()
def type_text(self, selector: str, text: str, selector_type: str = "css", clear_first: bool = True) -> dict:
"""Type text into an element"""
if not self.session_id:
raise ValueError("No active session")
response = requests.post(
f"{self.base_url}/session/{self.session_id}/type",
json={
"selector": selector,
"text": text,
"selector_type": selector_type,
"clear_first": clear_first
}
)
response.raise_for_status()
return response.json()
def screenshot(self, save_path: Optional[str] = None) -> str:
"""Take a screenshot and optionally save it"""
if not self.session_id:
raise ValueError("No active session")
response = requests.get(f"{self.base_url}/session/{self.session_id}/screenshot")
response.raise_for_status()
data = response.json()
if data["success"]:
screenshot_data = data["screenshot"]
if save_path:
# Decode and save the image
image_data = base64.b64decode(screenshot_data)
with open(save_path, "wb") as f:
f.write(image_data)
return screenshot_data
else:
raise Exception(f"Screenshot failed: {data['message']}")
def get_page_info(self) -> dict:
"""Get information about the current page"""
if not self.session_id:
raise ValueError("No active session")
response = requests.get(f"{self.base_url}/session/{self.session_id}/page-info")
response.raise_for_status()
return response.json()
def execute_js(self, script: str) -> dict:
"""Execute JavaScript on the page"""
if not self.session_id:
raise ValueError("No active session")
response = requests.get(
f"{self.base_url}/session/{self.session_id}/execute-js",
params={"script": script}
)
response.raise_for_status()
return response.json()
# Example usage
if __name__ == "__main__":
# Replace with your Hugging Face Space URL
client = BrowserAutomationClient("https://your-username-browser-api.hf.space")
try:
# Create session
session_id = client.create_session()
print(f"Created session: {session_id}")
# Navigate to a website
result = client.navigate("https://httpbin.org/forms/post")
print(f"Navigation result: {result}")
# Get page info
page_info = client.get_page_info()
print(f"Page title: {page_info['title']}")
print(f"Found {len(page_info['elements'])} interactive elements")
# Fill out a form
client.type_text("input[name='custname']", "John Doe")
client.type_text("input[name='custtel']", "123-456-7890")
client.type_text("textarea[name='comments']", "This is a test comment")
# Take a screenshot
screenshot_b64 = client.screenshot("screenshot.png")
print("Screenshot saved as screenshot.png")
# Submit the form
client.click("input[type='submit']")
# Take another screenshot after submission
client.screenshot("after_submit.png")
print("After submit screenshot saved")
except Exception as e:
print(f"Error: {e}")
finally:
# Always close the session
if client.session_id:
client.close_session()
print("Session closed") |