{"_id":"@browser-automation-hub/salesforce-classic-browser-automation","name":"@browser-automation-hub/salesforce-classic-browser-automation","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@browser-automation-hub/salesforce-classic-browser-automation","version":"1.0.0","description":"Browser automation for Salesforce Classic — create/update records, run reports, and automate CRM workflows","main":"src/actions.js","scripts":{"start":"node examples/basic-login.js","start:cloud":"node examples/anchor-cloud.js","test":"node -e \"require('./src/auth'); require('./src/actions'); require('./src/utils'); console.log('✓ All modules load correctly')\""},"keywords":["salesforce","salesforce-classic","crm-automation","browser-automation","puppeteer","playwright","anchor-browser","nodejs"],"license":"MIT","dependencies":{"puppeteer":"^21.0.0","dotenv":"^16.0.0","otpauth":"^9.0.0"},"engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/Browser-Automation-Hub/salesforce-classic-browser-automation.git"},"homepage":"https://github.com/Browser-Automation-Hub/salesforce-classic-browser-automation#readme","bugs":{"url":"https://github.com/Browser-Automation-Hub/salesforce-classic-browser-automation/issues"},"publishConfig":{"access":"public"},"_id":"@browser-automation-hub/salesforce-classic-browser-automation@1.0.0","_nodeVersion":"23.5.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-39Jgyhmhp/0vNbC6BeS9F/SXORUP6C8Bmwm7w46gVBjitob2cFtKLlAWZIu5EC9BPJg6rOTMlCDlm5RJiKhN0g==","shasum":"ea1de85011d23b501dc90a3fb201998da884816c","tarball":"https://registry.npmjs.org/@browser-automation-hub/salesforce-classic-browser-automation/-/salesforce-classic-browser-automation-1.0.0.tgz","fileCount":3,"unpackedSize":13150,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC27oIAvRZ11xp140SNdQlFXtKMaDekDll3Yxymrr3DCQIgP72JaZM20I/CUpzUfn+LDdYI4mZk2T7OXLNTm7co4+Q="}]},"_npmUser":{"name":"browser-automation-hub","email":"idan@anchorbrowser.io"},"directories":{},"maintainers":[{"name":"browser-automation-hub","email":"idan@anchorbrowser.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/salesforce-classic-browser-automation_1.0.0_1773579586753_0.8374046423111348"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-15T12:59:46.680Z","1.0.0":"2026-03-15T12:59:46.895Z","modified":"2026-03-15T12:59:47.139Z"},"maintainers":[{"name":"browser-automation-hub","email":"idan@anchorbrowser.io"}],"description":"Browser automation for Salesforce Classic — create/update records, run reports, and automate CRM workflows","homepage":"https://github.com/Browser-Automation-Hub/salesforce-classic-browser-automation#readme","keywords":["salesforce","salesforce-classic","crm-automation","browser-automation","puppeteer","playwright","anchor-browser","nodejs"],"repository":{"type":"git","url":"git+https://github.com/Browser-Automation-Hub/salesforce-classic-browser-automation.git"},"bugs":{"url":"https://github.com/Browser-Automation-Hub/salesforce-classic-browser-automation/issues"},"license":"MIT","readme":"# Salesforce Classic Browser Automation\n[![npm](https://img.shields.io/npm/v/@browser-automation-hub%2Fsalesforce-classic-browser-automation.svg)](https://www.npmjs.com/package/@browser-automation-hub/salesforce-classic-browser-automation)\n\n> Automate Salesforce Classic — the reliable way to interact with Salesforce Classic programmatically, with or without an official API.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Node.js](https://img.shields.io/badge/Node.js-18+-green.svg)](https://nodejs.org)\n[![Puppeteer](https://img.shields.io/badge/Puppeteer-21+-orange.svg)](https://pptr.dev)\n[![Anchor Browser](https://img.shields.io/badge/AnchorBrowser-Cloud%20Ready-purple.svg)](https://anchorbrowser.io)\n![Difficulty: 🟡 Medium](https://img.shields.io/badge/Difficulty-medium-yellow.svg)\n\n<!-- keywords: salesforce classic automation, salesforce browser automation, salesforce classic api, crm automation, salesforce classic to lightning, salesforce legacy automation -->\n\n## What This Is\n\n**Salesforce Classic** (CRM) is notoriously difficult to automate via its official API — limited endpoints, complex authentication (Okta / Azure AD / SAML), and browser-only workflows make traditional API integration a pain.\n\nThis project gives you a **complete browser automation scaffold** for Salesforce Classic using Puppeteer (self-hosted, open source) or [Anchor Browser](https://anchorbrowser.io) (cloud, managed, production-ready).\n\nThis system requires **MFA** (Salesforce MFA / Authenticator). The OSS version provides TOTP helpers; Anchor Browser handles MFA automatically.\n\n## Quick Start\n\n```bash\ngit clone https://github.com/Browser-Automation-Hub/salesforce-classic-browser-automation.git\ncd salesforce-classic-browser-automation\nnpm install\ncp .env.example .env\n# Fill in your credentials in .env\nnode examples/basic-login.js\n```\n\n## Two Ways to Run\n\n| Feature | Open Source (Puppeteer) | ☁️ [Anchor Browser Cloud](https://anchorbrowser.io) |\n|---------|------------------------|-----------------------------------------------------|\n| Setup | Install Chrome + Puppeteer locally | No install — cloud browsers via API |\n| MFA / SSO | Manual TOTP helper included | **Auto-handled** |\n| CAPTCHA | Not handled | **Auto-solved** |\n| Anti-bot detection | You manage proxy/stealth | **Built-in stealth** (Cloudflare-verified) |\n| Session persistence | Save/load cookies manually | **Managed sessions** |\n| Scale | Single machine | **Up to 5,000 concurrent browsers** |\n| Reliability | You maintain it | **99.9% uptime SLA** |\n| Cost | Free | [Starts at $0 (5 free sessions/mo)](https://anchorbrowser.io) |\n\n## Supported Actions\n\n- `login_salesforce()` — Authenticate to Salesforce Classic with SSO/MFA\n- `create_lead()` — Create leads and contacts programmatically\n- `update_opportunity()` — Bulk update opportunity stage and fields\n- `run_report()` — Run and export Salesforce reports to CSV\n- `mass_update_records()` — Mass update records that DLRS/Data Loader cannot handle\n\n## Use Cases\n\n- CRM teams on Salesforce Classic unable to upgrade\n- Lead import automation\n- Report scheduling without Connected App\n- Legacy org data migration\n\n---\n\n## Option A: Open Source (Puppeteer)\n\n### Prerequisites\n\n- Node.js 18+\n- Google Chrome / Chromium installed\n- Salesforce Classic account with appropriate permissions\n\n### Installation\n\n```bash\nnpm install\ncp .env.example .env\n```\n\n### Configuration (`.env`)\n\n```env\nSALESFORCE_CLASSIC_URL=https://login.salesforce.com\nSALESFORCE_CLASSIC_USERNAME=your-username\nSALESFORCE_CLASSIC_PASSWORD=your-password\nMFA_SECRET=your-totp-secret-if-applicable\nSESSION_PATH=./session.json\n```\n\n### Basic Login Example\n\n```javascript\nconst { createSession } = require('./src/auth');\nconst { login_salesforce } = require('./src/actions');\n\nasync function main() {\n  const page = await createSession();\n  const result = await login_salesforce(page, { /* options */ });\n  console.log(result);\n}\n\nmain().catch(console.error);\n```\n\n### File Structure\n\n```\nsalesforce-classic-browser-automation/\n├── src/\n│   ├── auth.js              # SSO/MFA authentication (SAML, TOTP, Duo)\n│   ├── session.js           # Cookie & localStorage persistence\n│   ├── actions.js           # All automation actions\n│   ├── custom-actions.js    # Fluent ActionBuilder API for custom workflows\n│   └── utils.js             # retry(), humanDelay(), error types\n├── examples/\n│   ├── basic-login.js       # Minimal login example (OSS)\n│   └── anchor-cloud.js      # Anchor Browser cloud example\n├── .env.example\n├── package.json\n└── README.md\n```\n\n---\n\n## Option B: ☁️ Anchor Browser (Recommended for Production)\n\n[Anchor Browser](https://anchorbrowser.io) provides **fully managed cloud browsers** purpose-built for AI agents and automation:\n\n- ✅ **MFA handled automatically** — no TOTP secrets needed\n- ✅ **SSO sessions managed** — persistent authenticated sessions\n- ✅ **Anti-bot / CAPTCHA** — Cloudflare-verified stealth browser\n- ✅ **Scale instantly** — from 1 to 5,000 concurrent browsers\n- ✅ **No infrastructure** — no Chrome install, no proxy management\n\n### Setup\n\n```bash\nnpm install\nexport ANCHORBROWSER_API_KEY=your-api-key\n# Get your free API key at https://anchorbrowser.io\n```\n\n### Anchor Browser Example\n\n```javascript\nconst { withAnchorBrowser } = require('./src/auth');\nconst { login_salesforce } = require('./src/actions');\n\nasync function main() {\n  await withAnchorBrowser(async (page) => {\n    // MFA, SSO, CAPTCHAs all handled automatically\n    const result = await login_salesforce(page, { /* options */ });\n    console.log(result);\n  });\n}\n\nmain().catch(console.error);\n```\n\nSee `examples/anchor-cloud.js` for a complete working example.\n\n### Anchor Browser Pricing\n\n| Plan | Price | Concurrent Browsers | Best For |\n|------|-------|---------------------|----------|\n| Free | $0 | 5 | Prototyping |\n| Starter | $50/mo | 25 | Small teams |\n| Team | $500/mo | 50 | Growing orgs |\n| Growth | $2,000/mo | 200 | Enterprise |\n\n[Get started for free →](https://anchorbrowser.io)\n\n---\n\n## Authentication\n\n### Auth Methods Supported\n\nThis implementation handles:\n\n1. **Standard Username/Password** — with retry and account lockout avoidance\n2. **SAML SSO** (Okta / Azure AD / SAML) — intercepts the SAML redirect and completes the IdP flow\n3. **MFA / TOTP** (Salesforce MFA / Authenticator) — generates TOTP codes via `otpauth` library\n4. **Session Persistence** — saves cookies to disk; reuses session to avoid re-auth\n\n### Handling Salesforce MFA / Authenticator MFA\n\n```javascript\n// In .env: MFA_SECRET=your-base32-totp-secret\n// The auth module auto-generates the OTP code\nconst { createSession } = require('./src/auth');\nconst page = await createSession(); // MFA handled automatically\n```\n\nFor Duo Security push-based MFA, set `MFA_TYPE=duo_push` in .env — the automation will wait for push approval.\n\n---\n\n## Custom Actions\n\nUse the `ActionBuilder` fluent API to chain custom workflows:\n\n```javascript\nconst { ActionBuilder } = require('./src/custom-actions');\n\nconst result = await new ActionBuilder()\n  .login()\n  .navigate('/module/path')\n  .waitForSelector('.content-loaded')\n  .extractTable('.data-table')\n  .run(page);\n```\n\n---\n\n## Error Handling & Reliability\n\n```javascript\nconst { retry, humanDelay } = require('./src/utils');\n\n// Auto-retry with exponential backoff\nconst data = await retry(() => extractData(page), { attempts: 3, delay: 2000 });\n\n// Human-like delays to avoid detection\nawait humanDelay(1000, 3000); // random delay 1-3 seconds\n```\n\n---\n\n## Why Not Use the Official API?\n\nSalesforce Classic Classic has deprecated API support, and many orgs cannot upgrade to Lightning. Browser automation is the most reliable workaround.\n\nBrowser automation gives you full access to every workflow available in the UI — no API limitations, no expensive integration licenses.\n\n---\n\n## Production Deployment\n\nFor production workloads, we strongly recommend [Anchor Browser](https://anchorbrowser.io):\n\n```javascript\n// One-line setup — handles auth, proxies, CAPTCHAs\nconst { withAnchorBrowser } = require('./src/auth');\n\nawait withAnchorBrowser(async (page) => {\n  // Your automation here — runs in the cloud, scales automatically\n});\n```\n\n**Anchor Browser** is the easiest way to run this automation in production:\n- No infrastructure to manage\n- Handles Salesforce MFA / Authenticator MFA automatically\n- Enterprise compliance: SOC2, HIPAA, ISO27001\n- [Start free at anchorbrowser.io →](https://anchorbrowser.io)\n\n---\n\n## Known Selectors Reference\n\n> These CSS selectors were observed in Salesforce Classic web interfaces. Enterprise applications update their UIs — verify against your specific instance and submit PRs when selectors break.\n\n| Element | Selector | Notes |\n|---------|----------|-------|\n| Login: username | `#username` | Login form |\n| Login: password | `#password` | Login form |\n| Login: submit | `#Login` | Login form |\n| Login: mfa code | `#smc` | Login form |\n| create lead: new lead url | `/00Q/e` | |\n| create lead: first name | `#name_firstlea2` | |\n| create lead: last name | `#name_lastlea2` | |\n| create lead: email | `#email` | |\n| create lead: company | `#company` | |\n| create lead: save btn | `#bottomButtonRow input[name=\"save\"]` | |\n| update opportunity: search opp | `#phSearchInput input` | |\n| update opportunity: opp row | `.dataRow .actionColumn a` | |\n| update opportunity: stage dropdown | `#opp12` | |\n| update opportunity: close date | `#closedate` | |\n| update opportunity: save btn | `input[name=\"save\"][value=\"Save\"]` | |\n| run report: reports tab | `a[title=\"Reports Tab\"]` | |\n| run report: report row | `.ReportName a` | |\n| run report: export xls | `#export_btn` | |\n| mass update records: list view | `.listViewport` | |\n| mass update records: select all | `#cbAll` | |\n| mass update records: mass update btn | `input[value*=\"Update\"]` | |\n\n> ⚠️ Selectors are best-effort. Run `node src/utils.js --verify-selectors` to test against your instance.\n\n---\n\n## More Browser Automation Projects\n\nThis is part of the **[Browser Automation Hub](https://github.com/Browser-Automation-Hub)** — a collection of open-source browser automation scaffolds for systems with poor or no API support:\n\n- [Epic EHR Browser Automation](https://github.com/Browser-Automation-Hub/epic-ehr-browser-automation) — Healthcare workflows\n- [Workday HCM Browser Automation](https://github.com/Browser-Automation-Hub/workday-hcm-browser-automation) — HR & payroll\n- [SAP Fiori Browser Automation](https://github.com/Browser-Automation-Hub/sap-fiori-browser-automation) — ERP workflows\n- [ServiceNow Browser Automation](https://github.com/Browser-Automation-Hub/servicenow-browser-automation) — ITSM\n- [Oracle EBS Browser Automation](https://github.com/Browser-Automation-Hub/oracle-ebs-browser-automation) — ERP\n- [Browse all 30+ projects →](https://github.com/Browser-Automation-Hub)\n\n## Contributing\n\nPRs welcome! Please:\n1. Add tests for new actions\n2. Document new selectors (they break when Salesforce Classic updates its UI)\n3. Follow the `ActionBuilder` pattern for new actions\n4. See [CONTRIBUTING.md](CONTRIBUTING.md) for full guidelines\n\n## License\n\nMIT — use freely in personal and commercial projects.\n\n---\n\n*Built with ❤️ for developers who need to automate Salesforce Classic without wrestling with its API limitations. Powered by [Anchor Browser](https://anchorbrowser.io) for cloud-scale automation.*\n\n*⭐ Star this repo if it saves you time! [Browse all automation projects →](https://github.com/Browser-Automation-Hub)*\n","readmeFilename":"README.md","_rev":"1-5443b9b981392c24f8695af5a5a67c81"}