|
| 1 | +from playwright.sync_api import sync_playwright |
| 2 | + |
| 3 | +from agentlab.backends.browser.base import BrowserBackend, ToolCallAction |
| 4 | + |
| 5 | + |
| 6 | +class PlaywrightSyncBackend(BrowserBackend): |
| 7 | + def __init__(self): |
| 8 | + self.actions = { |
| 9 | + "browser_press_key": lambda key: self.page.keyboard.press(key), |
| 10 | + "browser_type": lambda text: self.page.type(text), |
| 11 | + "browser_click": lambda selector: self.page.click(selector), |
| 12 | + "browser_drag": lambda from_selector, to_selector: self.drag_and_drop( |
| 13 | + from_selector, to_selector |
| 14 | + ), |
| 15 | + "browser_hover": lambda selector: self.page.hover(selector), |
| 16 | + "browser_select_option": lambda selector: self.page.select_option(selector), |
| 17 | + "browser_mouse_click_xy": lambda x, y: self.page.mouse.click(x, y), |
| 18 | + } |
| 19 | + |
| 20 | + def drag_and_drop(self, from_selector: str, to_selector: str): |
| 21 | + from_elem = self.page.locator(from_selector) |
| 22 | + from_elem.hover(timeout=500) |
| 23 | + self.page.mouse.down() |
| 24 | + |
| 25 | + to_elem = self.page.locator(to_selector) |
| 26 | + to_elem.hover(timeout=500) |
| 27 | + self.page.mouse.up() |
| 28 | + |
| 29 | + def initialize(self): |
| 30 | + self.browser = sync_playwright().start().chromium.launch(headless=True) |
| 31 | + self.page = self.browser.new_page() |
| 32 | + |
| 33 | + def run_js(self, js: str): |
| 34 | + return self.page.evaluate(js) |
| 35 | + |
| 36 | + def goto(self, url: str): |
| 37 | + self.page.goto(url) |
| 38 | + |
| 39 | + def page_snapshot(self): |
| 40 | + return self.page.content() |
| 41 | + |
| 42 | + def page_screenshot(self): |
| 43 | + return self.page.screenshot() |
| 44 | + |
| 45 | + def step(self, action: ToolCallAction): |
| 46 | + fn = self.actions[action.function.name] |
| 47 | + return fn(**action.function.arguments) |
| 48 | + |
| 49 | + def actions(self): |
| 50 | + return self.page.actions() |
| 51 | + |
| 52 | + def close(self): |
| 53 | + self.browser.close() |
0 commit comments