Agent-skills nemojs-skill
install
source · Clone the upstream repo
git clone https://github.com/LambdaTest/agent-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/LambdaTest/agent-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/nemojs-skill" ~/.claude/skills/lambdatest-agent-skills-nemojs-skill && rm -rf "$T"
manifest:
nemojs-skill/SKILL.mdsource content
Nemo.js Automation Skill
PayPal's Selenium-based test automation framework for Node.js.
For TestMu AI cloud execution, see reference/cloud-integration.md and shared/testmu-cloud-reference.md.
Core Patterns
Basic Test (Mocha)
const Nemo = require('nemo'); const { expect } = require('chai'); describe('Login Flow', function() { this.timeout(30000); let nemo; before(async () => { nemo = await Nemo(); }); after(async () => { await nemo.driver.quit(); }); it('should login with valid credentials', async () => { await nemo.driver.get(nemo.data.baseUrl + '/login'); const email = await nemo.view._find('#email'); await email.sendKeys('user@test.com'); const password = await nemo.view._find('#password'); await password.sendKeys('password123'); await nemo.view._find('button[type="submit"]').click(); await nemo.view._waitVisible('.dashboard', 10000); const url = await nemo.driver.getCurrentUrl(); expect(url).to.include('/dashboard'); }); it('should show error for invalid credentials', async () => { await nemo.driver.get(nemo.data.baseUrl + '/login'); await nemo.view._find('#email').sendKeys('wrong@test.com'); await nemo.view._find('#password').sendKeys('wrong'); await nemo.view._find('button[type="submit"]').click(); await nemo.view._waitVisible('.error', 5000); const error = await nemo.view._find('.error'); const text = await error.getText(); expect(text).to.include('Invalid'); }); });
View Locators
await nemo.view._find('#css-id'); // CSS await nemo.view._find('.class-name'); // CSS class await nemo.view._find('[data-testid="login"]'); // Data attribute await nemo.view._find('xpath://button[@type]'); // XPath prefix await nemo.view._waitVisible(locator, timeout); // Wait + find await nemo.view._finds('.items'); // Find multiple
Configuration (nemo.config.json)
{ "driver": { "browser": "chrome", "server": "http://localhost:4444/wd/hub" }, "data": { "baseUrl": "http://localhost:3000" }, "view": ["locator"], "plugins": { "view": { "module": "nemo-view" } } }
Cloud Execution on TestMu AI
Set environment variables:
LT_USERNAME, LT_ACCESS_KEY
{ "driver": { "browser": "chrome", "server": "https://hub.lambdatest.com/wd/hub", "serverCaps": { "username": "${LT_USERNAME}", "accessKey": "${LT_ACCESS_KEY}" }, "capabilities": { "LT:Options": { "user": "${LT_USERNAME}", "accessKey": "${LT_ACCESS_KEY}", "build": "Nemo Build", "name": "Nemo Test", "platformName": "Windows 11", "video": true, "console": true, "network": true } } } }
Setup: npm install nemo nemo-view --save-dev
npm install nemo nemo-view --save-devRun: npx mocha test/*.js --timeout 30000
npx mocha test/*.js --timeout 30000Deep Patterns
For advanced patterns, debugging guides, CI/CD integration, and best practices, see
reference/playbook.md.