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