The Robo module provides comprehensive browser automation and web scraping capabilities for Soul. Built on top of the powerful Rod library, it offers a JavaScript-like API for controlling browsers, interacting with web pages, and extracting data. The module supports both headless and headed browser modes, making it perfect for web scraping, automated testing, and UI automation tasks.
// Connect to browser running on specific URLbrowser = Robo.connectBrowser("ws://localhost:9222")// Connect to remote browserbrowser = Robo.connectBrowser("ws://remote-host:9222")
// Get all open pagespages = Robo.getPages(browser)println("Open pages: " + pages.length)// Get page informationpageInfo = Robo.getPageInfo(page)println("Page URL: " + pageInfo.url)println("Page title: " + pageInfo.title)// Close a specific pageRobo.closePage(page)
// Navigate to URLRobo.navigate(page, "https://example.com")// Navigate to local fileRobo.navigate(page, "file:///path/to/local/file.html")// Get current URLcurrentUrl = Robo.getURL(page)println("Current URL: " + currentUrl)// Get page titletitle = Robo.getTitle(page)println("Page title: " + title)
// Reload current pageRobo.reload(page)// Go back in historyRobo.goBack(page)// Go forward in historyRobo.goForward(page)// Wait for navigation to completeRobo.waitForNavigation(page)// Wait for page to fully loadRobo.waitForLoad(page)// Wait for page to become stableRobo.waitForStable(page)
// Wait for element to be presentelement = Robo.waitForElement(page, "#dynamic-content")// Wait for multiple elementselements = Robo.waitForElement(page, ".loaded-items")// Wait with timeout (handled internally)element = Robo.waitForElement(page, "#slow-loading-element")
// Single clickRobo.click(element)// Double clickRobo.doubleClick(element)// Right click (context menu)Robo.rightClick(element)// Hover over elementRobo.hover(element)
// Input text into fieldRobo.input(element, "user@example.com")// Clear input fieldRobo.clear(element)// Select option from dropdownRobo.select(element, "option-value")// Upload fileRobo.upload(element, "/path/to/file.txt")// Get form field valuevalue = Robo.getValue(element)println("Field value: " + value)
// Mouse actionsRobo.mouseMove(page, 100, 200) // Move to coordinatesRobo.mouseClick(page, 150, 250) // Click at coordinatesRobo.mouseDrag(page, 100, 100, 200, 200) // Drag from one point to another// Keyboard actionsRobo.keyPress(page, "Enter") // Press single keyRobo.keyDown(page, "Shift") // Hold key downRobo.keyUp(page, "Shift") // Release keyRobo.type(page, "Hello World") // Type text
// Screenshot entire pageRobo.screenshot(page, "page-screenshot.png")// Screenshot specific elementRobo.elementScreenshot(element, "element-screenshot.png")// Save page as PDFRobo.pdf(page, "page-content.pdf")
// Set viewport sizeRobo.setViewport(page, 1920, 1080) // Desktop resolutionRobo.setViewport(page, 375, 667) // Mobile resolution// Set user agentRobo.setUserAgent(page, "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X)")// Emulate specific deviceRobo.emulateDevice(page, "iPhone 12")Robo.emulateDevice(page, "iPad Pro")
// Scroll to specific positionRobo.scroll(page, 0, 500) // Scroll to y=500// Scroll to elementRobo.scrollToElement(element)// Scroll to top of pageRobo.scrollToTop(page)// Scroll to bottom of pageRobo.scrollToBottom(page)
// Wait for specific duration (milliseconds)Robo.wait(page, 2000) // Wait 2 seconds// Wait for element to appearelement = Robo.waitForElement(page, ".dynamic-content")// Wait for page navigationRobo.waitForNavigation(page)// Wait for page loadRobo.waitForLoad(page)// Wait for page to stabilizeRobo.waitForStable(page)
Resource Management: Always close browsers and pages when done
Error Handling: Use try-catch blocks for robust automation
Waits: Use appropriate wait functions instead of fixed delays
Selectors: Use stable selectors (IDs, data attributes) over brittle ones
Screenshots: Take screenshots for debugging and monitoring
Headless Mode: Use headless mode for production scraping
Copy
Ask AI
// Good - proper resource managementsoul safeBrowserAutomation(task) { browser = Robo.createBrowser({headless: true}) try { return performTask(browser, task) } catch (error) { // Take error screenshot if (page) { Robo.screenshot(page, "error-" + Date.now() + ".png") } throw error } finally { // Always cleanup Robo.closeBrowser(browser) }}// Good - robust element interactionsoul safeElementAction(page, selector, action) { if (Robo.elementExists(page, selector)) { element = Robo.findElement(page, selector) action(element) return true } return false}// Good - wait for dynamic contentsoul waitForDynamicContent(page, selector) { try { return Robo.waitForElement(page, selector) } catch (error) { println("Element not found: " + selector) return null }}
The Robo module provides a complete solution for browser automation and web scraping in Soul, supporting everything from simple data extraction to complex multi-step automation workflows with stealth capabilities and comprehensive error handling.