Skip to main content
isoldex
TypeScript · MIT · Built on Playwright

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

test.java
// 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 week

Sentinel

test.ts
// 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

extract.java
// 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

extract.ts
// 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 juggling

Selenium vs. Sentinel

A direct feature comparison.

FeatureSeleniumSentinel
LanguageJava / Python / JS / C#TypeScript (native)
Driver setupWebDriver + browser binaryPlaywright (auto-managed)
Element targetingXPath / CSS / By.idNatural language
Self-healing locators
Parallel sessionsComplex (Grid)yes (Sentinel.parallel())
Data extractionManual DOM traversalextract() — typed schema
Autonomous agentyes (run() loop)
Shadow DOMpartial
Headless support
OpenTelemetry
MCP / AI assistant
Cost per run~$0.002 (Gemini Flash)
Maintenance burdenHigh (selector updates)Low (self-healing)
Open sourceyes (MIT)

Migration path

1

Install Sentinel + Playwright

npm install @isoldex/sentinel playwright && npx playwright install chromium
2

Get a free Gemini API key

# Visit aistudio.google.com — free tier covers thousands of runs/month
export GEMINI_API_KEY=your_key_here
3

Replace driver.get() with sentinel.goto()

// Before: await driver.get('https://site.com')
await sentinel.goto('https://site.com');
4

Replace findElement() with act()

// Before: await driver.findElement(By.id('search')).sendKeys('laptop')
await sentinel.act('search for laptop');
5

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.