Files
SIA/tools/itb/bin/itb_scroll
2024-12-08 10:54:37 +01:00

71 lines
2.4 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
import time
import random
from selenium import webdriver
class ScrollController:
def __init__(self, debug_port: int):
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", f"127.0.0.1:{debug_port}")
self.driver = webdriver.Chrome(options=options)
def get_viewport_info(self) -> dict:
script = """
return {
scroll_x: window.pageXOffset,
scroll_y: window.pageYOffset,
max_scroll_x: Math.max(document.documentElement.scrollWidth - window.innerWidth, 0),
max_scroll_y: Math.max(document.documentElement.scrollHeight - window.innerHeight, 0)
};
"""
return self.driver.execute_script(script)
def smooth_scroll(self, target_x: int, target_y: int):
viewport = self.get_viewport_info()
start_x = viewport['scroll_x']
start_y = viewport['scroll_y']
# Clamp target values to valid ranges
target_x = max(0, min(target_x, viewport['max_scroll_x']))
target_y = max(0, min(target_y, viewport['max_scroll_y']))
# Calculate number of steps (random for natural feel)
steps = random.randint(5, 10)
for step in range(1, steps + 1):
progress = step / steps
current_x = start_x + (target_x - start_x) * progress
current_y = start_y + (target_y - start_y) * progress
self.driver.execute_script(
'window.scrollTo(arguments[0], arguments[1]);',
current_x, current_y
)
# Random small delay between steps
time.sleep(random.uniform(0.01, 0.05))
# Final position check
final = self.get_viewport_info()
return {
'x': final['scroll_x'],
'y': final['scroll_y']
}
def main(debug_port: int, target_x: int, target_y: int):
try:
controller = ScrollController(debug_port)
result = controller.smooth_scroll(target_x, target_y)
print(result)
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
if len(sys.argv) != 4:
print("Usage: itb_scroll <debug_port> <x> <y>")
sys.exit(1)
main(int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]))