{"id":47344593,"url":"https://github.com/Browser-Automation-Hub/workday-hcm-browser-automation","last_synced_at":"2026-04-01T04:00:30.007Z","repository":{"id":344399005,"uuid":"1181676489","full_name":"Browser-Automation-Hub/workday-hcm-browser-automation","owner":"Browser-Automation-Hub","description":"Browser automation for Workday HCM — automate employee onboarding, run payroll reports, manage time-off requests, and extract workforce data without the Workday API.","archived":false,"fork":false,"pushed_at":"2026-03-14T14:38:37.000Z","size":34,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-15T00:45:41.317Z","etag":null,"topics":["ai-agents","anchorbrowser","browser-automation","hr-automation","nodejs","payroll-automation","playwright","puppeteer","workday","workday-hcm"],"latest_commit_sha":null,"homepage":"https://anchorbrowser.io","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Browser-Automation-Hub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-14T13:25:11.000Z","updated_at":"2026-03-14T15:38:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Browser-Automation-Hub/workday-hcm-browser-automation","commit_stats":null,"previous_names":["browser-automation-hub/workday-hcm-browser-automation"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Browser-Automation-Hub/workday-hcm-browser-automation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Browser-Automation-Hub%2Fworkday-hcm-browser-automation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Browser-Automation-Hub%2Fworkday-hcm-browser-automation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Browser-Automation-Hub%2Fworkday-hcm-browser-automation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Browser-Automation-Hub%2Fworkday-hcm-browser-automation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Browser-Automation-Hub","download_url":"https://codeload.github.com/Browser-Automation-Hub/workday-hcm-browser-automation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Browser-Automation-Hub%2Fworkday-hcm-browser-automation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31264787,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T02:49:12.781Z","status":"ssl_error","status_checked_at":"2026-04-01T02:49:05.845Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","anchorbrowser","browser-automation","hr-automation","nodejs","payroll-automation","playwright","puppeteer","workday","workday-hcm"],"created_at":"2026-03-17T23:01:31.957Z","updated_at":"2026-04-01T04:00:29.994Z","avatar_url":"https://github.com/Browser-Automation-Hub.png","language":"JavaScript","funding_links":[],"categories":["🏢 Enterprise System Automation Packages"],"sub_categories":["Paid Platforms"],"readme":"# Workday HCM Browser Automation\n[![npm](https://img.shields.io/npm/v/@browser-automation-hub%2Fworkday-hcm-browser-automation.svg)](https://www.npmjs.com/package/@browser-automation-hub/workday-hcm-browser-automation)\n\n\u003e Automate Workday HCM — the reliable way to interact with Workday 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\u003c!-- keywords: workday hcm automation, workday api alternative, workday browser automation, workday payroll automation, workday report extraction, hcm automation --\u003e\n\n## What This Is\n\n**Workday HCM** (HR/Payroll) is notoriously difficult to automate via its official API — limited endpoints, complex authentication (Okta / Azure AD), and browser-only workflows make traditional API integration a pain.\n\nThis project gives you a **complete browser automation scaffold** for Workday HCM using Puppeteer (self-hosted, open source) or [Anchor Browser](https://anchorbrowser.io) (cloud, managed, production-ready).\n\nThis system requires **MFA** (Okta / Microsoft MFA). 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/workday-hcm-browser-automation.git\ncd workday-hcm-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_workday()` — Authenticate to Workday with SSO and MFA\n- `run_report()` — Run and download any Workday report to CSV/XLSX\n- `create_absence_request()` — Submit time-off requests programmatically\n- `onboard_employee()` — Automate new-hire onboarding form completion\n- `extract_headcount()` — Extract current headcount and org hierarchy\n\n## Use Cases\n\n- HR teams automating mass employee updates\n- Payroll report extraction\n- Automated onboarding workflows\n- Workforce analytics data pipelines\n\n---\n\n## Option A: Open Source (Puppeteer)\n\n### Prerequisites\n\n- Node.js 18+\n- Google Chrome / Chromium installed\n- Workday HCM account with appropriate permissions\n\n### Installation\n\n```bash\nnpm install\ncp .env.example .env\n```\n\n### Configuration (`.env`)\n\n```env\nWORKDAY_URL=https://impl.workday.com/your-tenant/login.htmld\nWORKDAY_USERNAME=your-username\nWORKDAY_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_workday } = require('./src/actions');\n\nasync function main() {\n  const page = await createSession();\n  const result = await login_workday(page, { /* options */ });\n  console.log(result);\n}\n\nmain().catch(console.error);\n```\n\n### File Structure\n\n```\nworkday-hcm-browser-automation/\n├── src/\n│   ├── auth.js              # SSO/MFA authentication (SAML, TOTP, Duo)\n│   ├── session.js           # Cookie \u0026 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_workday } = require('./src/actions');\n\nasync function main() {\n  await withAnchorBrowser(async (page) =\u003e {\n    // MFA, SSO, CAPTCHAs all handled automatically\n    const result = await login_workday(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) — intercepts the SAML redirect and completes the IdP flow\n3. **MFA / TOTP** (Okta / Microsoft MFA) — generates TOTP codes via `otpauth` library\n4. **Session Persistence** — saves cookies to disk; reuses session to avoid re-auth\n\n### Handling Okta / Microsoft MFA 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 \u0026 Reliability\n\n```javascript\nconst { retry, humanDelay } = require('./src/utils');\n\n// Auto-retry with exponential backoff\nconst data = await retry(() =\u003e 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\nWorkday HCM exposes minimal REST APIs behind proprietary authentication that requires a dedicated integration developer. Many bulk operations are only possible via the UI.\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) =\u003e {\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 Okta / Microsoft MFA 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\u003e These CSS selectors were observed in Workday HCM 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 | `#okta-signin-username` | Login form |\n| Login: password | `#okta-signin-password` | Login form |\n| Login: next btn | `[data-se=\"o-form-button-bar\"] input` | Login form |\n| Login: mfa code | `input[name=\"answer\"]` | Login form |\n| run report: search input | `[data-automation-id=\"globalSearchInput\"]` | |\n| run report: search result | `[data-automation-id=\"searchResult\"]` | |\n| run report: run btn | `[data-automation-id=\"wd-CommandButton_uic_okButton\"]` | |\n| run report: export btn | `[data-automation-id=\"wd-CommandButton_uic_exportButton\"]` | |\n| run report: download c s v | `[data-automation-id=\"CSV\"]` | |\n| create absence request: absence task | `[data-automation-id*=\"leaveRequest\"]` | |\n| create absence request: absence type | `[data-automation-id=\"singleSelectDropdown\"]` | |\n| create absence request: start date | `[data-automation-id=\"dateSectionStart-date-input\"]` | |\n| create absence request: end date | `[data-automation-id=\"dateSectionEnd-date-input\"]` | |\n| create absence request: submit btn | `[data-automation-id=\"wd-CommandButton_uic_okButton\"]` | |\n| onboard employee: hire task | `[title=\"Hire Employee\"]` | |\n| onboard employee: name input | `[data-automation-id=\"firstName-input\"]` | |\n| onboard employee: dept dropdown | `[data-automation-id*=\"organization\"] [data-automation-id=\"singleSelectDropdown\"]` | |\n| onboard employee: save btn | `[data-automation-id=\"wd-CommandButton_uic_saveButton\"]` | |\n| extract headcount: org chart | `[title=\"Org Chart\"]` | |\n| extract headcount: worker row | `[data-automation-id=\"tabularViewRow\"]` | |\n| extract headcount: export btn | `[data-automation-id=\"wd-CommandButton_uic_exportButton\"]` | |\n\n\u003e ⚠️ 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 \u0026 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 Workday 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 Workday HCM 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","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBrowser-Automation-Hub%2Fworkday-hcm-browser-automation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FBrowser-Automation-Hub%2Fworkday-hcm-browser-automation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBrowser-Automation-Hub%2Fworkday-hcm-browser-automation/lists"}