
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
umbrellamode
Advanced tools
Umbrella Mode is a powerful browser automation and DOM interaction library that provides a clean, type-safe API for programmatically controlling web pages. Built with TypeScript and designed for modern web applications, Umbrella Mode makes it easy to automate user interactions, test web interfaces, and build sophisticated browser-based workflows.
Umbrella Mode is built around the Actor class - a comprehensive DOM interaction library that provides methods for clicking, typing, scrolling, and element manipulation. The library uses native DOM APIs and properly handles React components by bypassing synthetic events, making it reliable across different web frameworks and applications.
# Install the director package
pnpm add umbrellamode
# Or if using npm
npm install umbrellamode
# Or if using yarn
yarn add umbrellamode
The Actor class is the core of Umbrella Mode. It provides a comprehensive set of methods for interacting with web pages:
import { Actor } from "umbrellamode";
// Create an actor instance
const actor = new Actor();
// Basic interactions
await actor.click({ selector: '#submit-button' });
await actor.type({ selector: '#username', text: 'john.doe', simulateTyping: false });
await actor.clear({ selector: '#search-input' });
// Click a button
await actor.click({ selector: '#submit-button' });
// Click using data attributes
await actor.click({ selector: '[data-testid="save-btn"]' });
// Click a link
await actor.click({ selector: 'a[href="/dashboard"]' });
// Fast typing (recommended for most cases)
await actor.type({
selector: '#username',
text: 'john.doe@example.com',
simulateTyping: false
});
// Simulated typing (slower, more human-like)
await actor.type({
selector: '#message',
text: 'Hello world!',
simulateTyping: true
});
// Convenience method for fast typing
await actor.typeFast({ selector: '#password', text: 'secret123' });
// Scroll to specific coordinates
await actor.scrollTo({ x: 0, y: 500 });
// Scroll to an element
await actor.scrollToElement({ selector: '#section-3' });
// Scroll by relative amounts
await actor.scrollBy({ x: 0, y: 200 });
// Scroll page by viewport height
await actor.scrollPageDown({});
await actor.scrollPageUp({});
// Scroll to top/bottom
await actor.scrollToTop();
await actor.scrollToBottom();
// Wait for an element to appear
await actor.waitForElement({ selector: '.loading-spinner' });
// Check if element is visible
const isVisible = actor.isElementInViewport({ selector: '#hero-section' });
// Get current scroll position
const position = actor.getScrollPosition({});
console.log(`Scrolled to: ${position.x}, ${position.y}`);
// Focus an element
await actor.focus({ selector: '#email-input' });
// Remove focus (blur)
await actor.blur({ selector: '#search-input' });
// Fill out a complete form
await actor.typeFast({ selector: '#firstName', text: 'John' });
await actor.typeFast({ selector: '#lastName', text: 'Doe' });
await actor.typeFast({ selector: '#email', text: 'john@example.com' });
await actor.click({ selector: '#submit' });
// Wait for success message
await actor.waitForElement({ selector: '.success-message' });
// Wait for dynamically loaded content
await actor.waitForElement({
selector: '[data-testid="dynamic-content"]',
timeout: 10000 // 10 seconds
});
// Check if content is visible before interacting
if (actor.isElementInViewport({ selector: '.important-section' })) {
await actor.click({ selector: '.cta-button' });
}
// Scroll to find an element, then interact
await actor.scrollToElement({ selector: '#hidden-section' });
await actor.click({ selector: '#action-button' });
// Scroll through a list
for (let i = 0; i < 5; i++) {
await actor.scrollPageDown({});
await new Promise(resolve => setTimeout(resolve, 1000)); // Wait 1 second
}
Umbrella Mode provides clear error messages for common issues:
try {
await actor.click({ selector: '#non-existent-button' });
} catch (error) {
console.error('Element not found:', error.message);
// Output: "Element not found with selector: #non-existent-button"
}
data-testid attributes over CSS classesawait with Actor methodswaitForElement for dynamically loaded contentisElementInViewport before interacting with elementssimulateTyping: false for better performance unless human-like behavior is neededThis project uses a monorepo structure with the following packages:
packages/director/ - Core Umbrella Mode library (Actor class)packages/ui/ - Shared UI components (shadcn/ui)apps/web/ - Example web application# Install dependencies
pnpm install
# Start development server
pnpm dev
# Build all packages
pnpm build
# Run linting
pnpm lint
Apache-2.0
FAQs
UmbrellaMode shared library
We found that umbrellamode demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.