Browser automation library with a unified API over Playwright and Selenium WebDriver.
Promod provides a protractor-like lazy element interface — elements are not resolved until an action is performed on them.
npm install promodPromod requires a browser engine as a peer dependency:
# For Playwright
npm install playwright
# For Selenium WebDriver
npm install selenium-webdriver chromedriverconst{ chromium }=require('playwright');const{ playwrightWD }=require('promod');const{ browser, $, $$ }=playwrightWD;asyncfunctionmain(){constlaunched=awaitchromium.launch({headless: false});browser.setClient({driver: launched});awaitbrowser.get('https://example.com');constheading=$('h1');console.log(awaitheading.getText());awaitbrowser.quitAll();}main();const{ Browser, Builder }=require('selenium-webdriver');require('chromedriver');const{ seleniumWD }=require('promod');const{ browser, $, $$ }=seleniumWD;asyncfunctionmain(){constdriver=awaitnewBuilder().forBrowser(Browser.CHROME).build();browser.setClient({
driver,lauchNewInstance: ()=>newBuilder().forBrowser(Browser.CHROME).build(),});awaitbrowser.get('https://example.com');constheading=$('h1');console.log(awaitheading.getText());awaitbrowser.quit();}main();Promod ships dual builds. Bundlers and Node import will use ESM; require() will use CommonJS.
// ESMimport{playwrightWD,seleniumWD}from'promod';// CommonJSconst{ playwrightWD, seleniumWD }=require('promod');All examples work identically with both playwrightWD and seleniumWD.
// CSS (default)constel=$('.my-class #id a[href*="link"]');// XPathconstel=$('xpath=.//div[@data-test="id"]/span');// JavaScript functionconstel=$(()=>document.querySelector('div > span'));// Custom selector (query + text filter)constel=$({query: 'button',text: 'Submit'});constel=$({query: 'button',rg: 'Sub.*'});// regex filter| Topic | Link |
|---|---|
| Engine setup | docs/init.md |
| Browser (client) | docs/client.md |
Element ($) | docs/element.md |
Elements ($$) | docs/elements.md |
MIT
