diamond-in commited on
Commit
4424752
·
verified ·
1 Parent(s): a44d039

Update browser/actions.py

Browse files
Files changed (1) hide show
  1. browser/actions.py +153 -0
browser/actions.py CHANGED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Basic browser actions like click, fill, navigate
3
+ """
4
+ import time
5
+ import logging
6
+ from selenium.webdriver.common.by import By
7
+ from selenium.webdriver.support.ui import WebDriverWait
8
+ from selenium.webdriver.support import expected_conditions as EC
9
+ from selenium.webdriver.common.keys import Keys
10
+ from selenium.webdriver.common.action_chains import ActionChains
11
+ from browser.driver import get_driver, cleanup_driver
12
+ from config.settings import DEFAULT_EXPLICIT_WAIT
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+ def browse_and_extract(url: str, selector: str = "body", use_persistent: bool = False) -> str:
17
+ """Browse URL and extract text from selector"""
18
+ driver = None
19
+ try:
20
+ driver = get_driver(url, use_persistent)
21
+
22
+ # Wait for element to be present
23
+ wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
24
+ elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
25
+
26
+ text = elem.text
27
+ logger.info(f"Extracted {len(text)} characters")
28
+
29
+ return text
30
+ except Exception as e:
31
+ logger.error(f"Error in browse_and_extract: {e}")
32
+ return f"Error: {e}"
33
+ finally:
34
+ cleanup_driver(driver, use_persistent)
35
+
36
+ def screenshot(url: str, full_page: bool = False, use_persistent: bool = False) -> str:
37
+ """Take screenshot of URL"""
38
+ driver = None
39
+ try:
40
+ driver = get_driver(url, use_persistent)
41
+
42
+ # Wait for page load
43
+ time.sleep(2)
44
+
45
+ path = "/tmp/screenshot.png"
46
+
47
+ if full_page:
48
+ # Get full page dimensions
49
+ total_height = driver.execute_script("return document.body.scrollHeight")
50
+ driver.set_window_size(1920, total_height)
51
+ time.sleep(1)
52
+
53
+ driver.save_screenshot(path)
54
+ logger.info(f"Screenshot saved to: {path}")
55
+
56
+ return path
57
+ except Exception as e:
58
+ logger.error(f"Error in screenshot: {e}")
59
+ return None
60
+ finally:
61
+ cleanup_driver(driver, use_persistent)
62
+
63
+ def click(url: str, selector: str, use_persistent: bool = False) -> str:
64
+ """Click element on page"""
65
+ driver = None
66
+ try:
67
+ driver = get_driver(url, use_persistent)
68
+
69
+ wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
70
+ elem = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector)))
71
+ elem.click()
72
+
73
+ time.sleep(2)
74
+ title = driver.title
75
+ current_url = driver.current_url
76
+
77
+ return f"Clicked {selector}\nNew title: {title}\nCurrent URL: {current_url}"
78
+ except Exception as e:
79
+ logger.error(f"Error in click: {e}")
80
+ return f"Error: {e}"
81
+ finally:
82
+ cleanup_driver(driver, use_persistent)
83
+
84
+ def fill(url: str, selector: str, text: str, use_persistent: bool = False) -> str:
85
+ """Fill text into form field"""
86
+ driver = None
87
+ try:
88
+ driver = get_driver(url, use_persistent)
89
+
90
+ wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
91
+ elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
92
+ elem.clear()
93
+ elem.send_keys(text)
94
+
95
+ return f"Filled {selector} with '{text}'"
96
+ except Exception as e:
97
+ logger.error(f"Error in fill: {e}")
98
+ return f"Error: {e}"
99
+ finally:
100
+ cleanup_driver(driver, use_persistent)
101
+
102
+ def submit_form(url: str, form_data: str, submit_button: str = "", use_persistent: bool = False) -> str:
103
+ """Fill and submit a form with multiple fields"""
104
+ driver = None
105
+ try:
106
+ driver = get_driver(url, use_persistent)
107
+
108
+ # Parse form data (expected format: "selector1:value1;selector2:value2")
109
+ wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
110
+ filled_fields = []
111
+
112
+ for field in form_data.split(";"):
113
+ if ":" in field:
114
+ selector, value = field.split(":", 1)
115
+ selector = selector.strip()
116
+ value = value.strip()
117
+
118
+ elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
119
+ elem.clear()
120
+ elem.send_keys(value)
121
+ filled_fields.append(f"{selector}={value}")
122
+
123
+ # Submit form
124
+ if submit_button:
125
+ submit_elem = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, submit_button)))
126
+ submit_elem.click()
127
+ else:
128
+ # Try to find and submit the first form
129
+ driver.execute_script("document.forms[0].submit();")
130
+
131
+ time.sleep(2)
132
+ new_url = driver.current_url
133
+
134
+ return f"Form submitted\nFilled fields: {', '.join(filled_fields)}\nNew URL: {new_url}"
135
+ except Exception as e:
136
+ logger.error(f"Error in submit_form: {e}")
137
+ return f"Error: {e}"
138
+ finally:
139
+ cleanup_driver(driver, use_persistent)
140
+
141
+ def execute_js(url: str, script: str, use_persistent: bool = False) -> str:
142
+ """Execute JavaScript on page"""
143
+ driver = None
144
+ try:
145
+ driver = get_driver(url, use_persistent)
146
+ result = driver.execute_script(script)
147
+
148
+ return f"Script executed. Result: {result}"
149
+ except Exception as e:
150
+ logger.error(f"Error in execute_js: {e}")
151
+ return f"Error: {e}"
152
+ finally:
153
+ cleanup_driver(driver, use_persistent)