diamond-in commited on
Commit
dfd52b2
·
verified ·
1 Parent(s): 36dd04b

Update features/advanced.py

Browse files
Files changed (1) hide show
  1. features/advanced.py +116 -0
features/advanced.py CHANGED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Advanced browser features: scroll, hover, wait, etc.
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
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+ def wait_for_element(url: str, selector: str, timeout: int = 10, use_persistent: bool = False) -> str:
16
+ """Wait for element to appear on page"""
17
+ driver = None
18
+ try:
19
+ driver = get_driver(url, use_persistent)
20
+
21
+ wait = WebDriverWait(driver, timeout)
22
+ elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
23
+
24
+ text = elem.text[:100] + "..." if len(elem.text) > 100 else elem.text
25
+
26
+ return f"Element found: {selector}\nText preview: {text}"
27
+ except Exception as e:
28
+ logger.error(f"Error in wait_for_element: {e}")
29
+ return f"Error: Element not found within {timeout} seconds"
30
+ finally:
31
+ cleanup_driver(driver, use_persistent)
32
+
33
+ def scroll_page(url: str, direction: str = "bottom", pixels: int = 0, use_persistent: bool = False) -> str:
34
+ """Scroll page in specified direction"""
35
+ driver = None
36
+ try:
37
+ driver = get_driver(url, use_persistent)
38
+
39
+ if direction == "bottom":
40
+ driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
41
+ elif direction == "top":
42
+ driver.execute_script("window.scrollTo(0, 0);")
43
+ elif direction == "down":
44
+ driver.execute_script(f"window.scrollBy(0, {pixels or 500});")
45
+ elif direction == "up":
46
+ driver.execute_script(f"window.scrollBy(0, -{pixels or 500});")
47
+
48
+ time.sleep(1)
49
+
50
+ # Get current scroll position
51
+ scroll_pos = driver.execute_script("return window.pageYOffset;")
52
+
53
+ return f"Scrolled {direction}. Current position: {scroll_pos}px from top"
54
+ except Exception as e:
55
+ logger.error(f"Error in scroll_page: {e}")
56
+ return f"Error: {e}"
57
+ finally:
58
+ cleanup_driver(driver, use_persistent)
59
+
60
+ def hover_element(url: str, selector: str, use_persistent: bool = False) -> str:
61
+ """Hover over an element"""
62
+ driver = None
63
+ try:
64
+ driver = get_driver(url, use_persistent)
65
+
66
+ wait = WebDriverWait(driver, 10)
67
+ elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
68
+
69
+ actions = ActionChains(driver)
70
+ actions.move_to_element(elem).perform()
71
+
72
+ time.sleep(1)
73
+
74
+ return f"Hovered over element: {selector}"
75
+ except Exception as e:
76
+ logger.error(f"Error in hover_element: {e}")
77
+ return f"Error: {e}"
78
+ finally:
79
+ cleanup_driver(driver, use_persistent)
80
+
81
+ def press_key(url: str, key: str, selector: str = "body", use_persistent: bool = False) -> str:
82
+ """Press a keyboard key on element"""
83
+ driver = None
84
+ try:
85
+ driver = get_driver(url, use_persistent)
86
+
87
+ wait = WebDriverWait(driver, 10)
88
+ elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
89
+
90
+ # Map common key names to Selenium keys
91
+ key_map = {
92
+ "enter": Keys.ENTER,
93
+ "tab": Keys.TAB,
94
+ "escape": Keys.ESCAPE,
95
+ "backspace": Keys.BACKSPACE,
96
+ "delete": Keys.DELETE,
97
+ "space": Keys.SPACE,
98
+ "up": Keys.ARROW_UP,
99
+ "down": Keys.ARROW_DOWN,
100
+ "left": Keys.ARROW_LEFT,
101
+ "right": Keys.ARROW_RIGHT,
102
+ "home": Keys.HOME,
103
+ "end": Keys.END,
104
+ "pageup": Keys.PAGE_UP,
105
+ "pagedown": Keys.PAGE_DOWN,
106
+ }
107
+
108
+ selenium_key = key_map.get(key.lower(), key)
109
+ elem.send_keys(selenium_key)
110
+
111
+ return f"Pressed key '{key}' on {selector}"
112
+ except Exception as e:
113
+ logger.error(f"Error in press_key: {e}")
114
+ return f"Error: {e}"
115
+ finally:
116
+ cleanup_driver(driver, use_persistent)