The Modern Selenium Alternative.
AI-Powered. Self-Healing.
Selenium served us well — but maintaining XPath selectors through every UI change costs more than the automation saves. Sentinel gives you natural language actions, automatic element discovery, and typed data extraction.
Why developers are moving on
Selector rot
XPath and CSS selectors break on every UI update. Teams spend more time fixing tests than writing new ones.
Slow execution
Selenium's WebDriver protocol adds round-trip latency. Playwright's CDP-based approach is 2–4× faster.
Setup overhead
WebDriver binaries, Grid configuration, ChromeDriver versions — all managed manually. Playwright handles it automatically.
Side by side
Same task — searching Amazon for a laptop. Compare the code.
Selenium
// Selenium — verbose, fragile
const driver = await new Builder().forBrowser('chrome').build();
await driver.get('https://amazon.de');
const searchBox = await driver.findElement(By.id('twotabsearchtextbox'));
await searchBox.sendKeys('laptop');
const searchBtn = await driver.findElement(By.id('nav-search-submit-button'));
await searchBtn.click();
// Pray the IDs haven't changed since last weekSentinel
// Sentinel — natural language, self-healing
const sentinel = new Sentinel({ apiKey: process.env.GEMINI_API_KEY });
await sentinel.init();
await sentinel.goto('https://amazon.de');
await sentinel.act('search for laptop');
// That's it. Sentinel found the search box itself.
// If Amazon changes the ID tomorrow, Sentinel adapts.Selenium — extract data
// Selenium — manual DOM traversal
const items = await driver.findElements(By.css('.s-result-item'));
const results = [];
for (const item of items) {
const title = await item.findElement(By.css('h2 span')).getText();
const price = await item.findElement(By.css('.a-price-whole')).getText();
results.push({ title, price });
}Sentinel — extract data
// Sentinel — structured extraction
const results = await sentinel.extract(
'Get the first 5 search results with title and price',
z.object({
items: z.array(z.object({
title: z.string(),
price: z.string(),
})),
})
);
// Fully typed, no selector jugglingSelenium vs. Sentinel
A direct feature comparison.
| Feature | Selenium | Sentinel |
|---|---|---|
| Language | Java / Python / JS / C# | TypeScript (native) |
| Driver setup | WebDriver + browser binary | Playwright (auto-managed) |
| Element targeting | XPath / CSS / By.id | Natural language |
| Self-healing locators | ✗ | ✓ |
| Parallel sessions | Complex (Grid) | yes (Sentinel.parallel()) |
| Data extraction | Manual DOM traversal | extract() — typed schema |
| Autonomous agent | ✗ | yes (run() loop) |
| Shadow DOM | partial | ✓ |
| Headless support | ✓ | ✓ |
| OpenTelemetry | ✗ | ✓ |
| MCP / AI assistant | ✗ | ✓ |
| Cost per run | — | ~$0.002 (Gemini Flash) |
| Maintenance burden | High (selector updates) | Low (self-healing) |
| Open source | ✓ | yes (MIT) |
Migration path
Install Sentinel + Playwright
npm install @isoldex/sentinel playwright && npx playwright install chromium
Get a free Gemini API key
# Visit aistudio.google.com — free tier covers thousands of runs/month export GEMINI_API_KEY=your_key_here
Replace driver.get() with sentinel.goto()
// Before: await driver.get('https://site.com')
await sentinel.goto('https://site.com');Replace findElement() with act()
// Before: await driver.findElement(By.id('search')).sendKeys('laptop')
await sentinel.act('search for laptop');Replace getText() loops with extract()
const data = await sentinel.extract('get search results with title and price', schema);Leave WebDriver behind
No account needed. MIT license. Your Gemini free tier covers thousands of runs per month.