npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

n8n-nodes-playwright-test-executor

v1.0.5

Published

n8n Playwright node for executing AI-generated test specifications

Readme

n8n-nodes-playwright-test-executor

This is an n8n community node for AI-powered browser test automation using Playwright. It lets you execute AI-generated test specifications in your n8n workflows.

n8n is a fair-code licensed workflow automation platform.

Installation Operations Use Cases Compatibility Resources

Installation

Follow the installation guide in the n8n community nodes documentation.

Install via n8n UI:

  1. Go to SettingsCommunity Nodes
  2. Click Install
  3. Enter: n8n-nodes-playwright-test-executor

Or install via command line:

npm install n8n-nodes-playwright-test-executor

Note: By default the package runs browsers locally and will attempt to download browser binaries (~1GB) on first use. If you are running n8n in a container and don't want to install browsers inside it, use Remote Execution Mode instead (see below).

Operations

This node supports the following operations:

Standard Operations

  • Navigate: Go to a specified URL
  • Take Screenshot: Capture a screenshot of a webpage
  • Get Text: Extract text from an element using CSS selector
  • Click Element: Click on an element using CSS selector
  • Fill Form: Fill a form field using CSS selector

AI-Powered Operation

  • Execute Test Specification: Execute AI-generated test cases in JSON format

Use Cases

AI-Powered Test Automation

This node is designed to work with AI models (like Gemini, GPT-4, Claude) to create automated testing workflows:

HTML Content → AI Model → Test Specification → Playwright Execution → Results

Example Workflow:

  1. HTTP Request node: Fetch HTML from target website
  2. AI Agent node (Gemini/OpenAI): Analyze HTML and generate test cases
  3. Playwright node: Execute test specification
  4. Code node: Format results
  5. Slack/Email node: Send test report

Test Specification Format

The "Execute Test Specification" operation accepts JSON with the following structure:

[
  {
    "test_name": "Verify homepage loads correctly",
    "steps": [
      {
        "action": "load_page",
        "description": "Navigate to homepage"
      },
      {
        "action": "assert_element_present",
        "selector": "h1",
        "description": "Check main heading exists"
      },
      {
        "action": "assert_text_present",
        "text": "Welcome",
        "description": "Verify welcome message"
      }
    ],
    "expected_result": "Homepage loads with heading and welcome message"
  }
]

Supported Actions

Navigation Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | load_page | - | Navigate to base URL | {"action": "load_page"} | | go_back | - | Navigate back in history | {"action": "go_back"} | | go_forward | - | Navigate forward in history | {"action": "go_forward"} | | reload_page | - | Reload current page | {"action": "reload_page"} |

Element Interaction Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | click | selector or link | Click element or link text | {"action": "click", "selector": "#button"} | | fill_input | selector, value | Type text into input field | {"action": "fill_input", "selector": "#email", "value": "[email protected]"} | | select_option | selector, value | Select dropdown option | {"action": "select_option", "selector": "#country", "value": "USA"} | | check_checkbox | selector | Check a checkbox | {"action": "check_checkbox", "selector": "#agree"} | | uncheck_checkbox | selector | Uncheck a checkbox | {"action": "uncheck_checkbox", "selector": "#agree"} | | hover | selector | Hover mouse over element | {"action": "hover", "selector": ".menu"} | | press_key | key | Press keyboard key | {"action": "press_key", "key": "Enter"} | | submit_form | - | Submit a form | {"action": "submit_form"} | | scroll_to_element | selector | Scroll element into view | {"action": "scroll_to_element", "selector": "#footer"} |

Assertion Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | assert_element_present | selector | Verify element exists | {"action": "assert_element_present", "selector": "h1"} | | assert_element_not_present | selector | Verify element does not exist | {"action": "assert_element_not_present", "selector": ".error"} | | assert_element_visible | selector | Verify element is visible | {"action": "assert_element_visible", "selector": ".modal"} | | assert_text_present | text | Verify text exists on page | {"action": "assert_text_present", "text": "Welcome"} | | assert_url_contains | text | Verify URL contains text | {"action": "assert_url_contains", "text": "/dashboard"} | | assert_page_title | text | Verify page title contains text | {"action": "assert_page_title", "text": "Dashboard"} | | assert_element_count | selector, count | Verify number of matching elements | {"action": "assert_element_count", "selector": ".item", "count": 5} | | assert_attribute | selector, attribute, value | Verify element attribute value | {"action": "assert_attribute", "selector": "#link", "attribute": "href", "value": "/home"} |

Wait Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | wait_for_element | selector, timeout (optional) | Wait for element to appear | {"action": "wait_for_element", "selector": ".loading", "timeout": 5000} |

Utility Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | take_screenshot | - | Take screenshot (returns base64) | {"action": "take_screenshot"} | | upload_file | selector, file_path | Upload file to input | {"action": "upload_file", "selector": "#upload", "file_path": "/path/file.pdf"} | | clear_input | selector | Clear text from input field | {"action": "clear_input", "selector": "#search"} | | wait | timeout | Wait for specified milliseconds | {"action": "wait", "timeout": 2000} | | execute_script | script | Execute JavaScript code | {"action": "execute_script", "script": "return document.title"} | | set_viewport | width, height | Set browser viewport size | {"action": "set_viewport", "width": 1920, "height": 1080} |

Advanced Interaction Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | double_click | selector | Double-click element | {"action": "double_click", "selector": ".item"} | | right_click | selector | Right-click element | {"action": "right_click", "selector": ".menu-item"} | | drag_and_drop | source_selector, target_selector | Drag element to target | {"action": "drag_and_drop", "source_selector": "#item1", "target_selector": "#drop-zone"} | | focus | selector | Focus on element | {"action": "focus", "selector": "#input"} | | blur | selector | Remove focus from element | {"action": "blur", "selector": "#input"} |

Dialog Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | accept_dialog | - | Accept next browser alert/confirm | {"action": "accept_dialog"} | | dismiss_dialog | - | Dismiss next browser alert/confirm | {"action": "dismiss_dialog"} |

Frame Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | switch_to_iframe | selector | Switch context to iframe | {"action": "switch_to_iframe", "selector": "#my-iframe"} | | switch_to_main | - | Switch back to main frame | {"action": "switch_to_main"} |

Cookie Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | set_cookie | name, value, domain, path | Set browser cookie | {"action": "set_cookie", "name": "session", "value": "abc123"} | | get_cookie | name | Get cookie value | {"action": "get_cookie", "name": "session"} | | clear_cookies | - | Clear all cookies | {"action": "clear_cookies"} |

Extended Assertions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | assert_element_enabled | selector | Verify element is enabled | {"action": "assert_element_enabled", "selector": "#submit"} | | assert_element_disabled | selector | Verify element is disabled | {"action": "assert_element_disabled", "selector": "#submit"} | | assert_checkbox_checked | selector | Verify checkbox is checked | {"action": "assert_checkbox_checked", "selector": "#agree"} | | assert_checkbox_unchecked | selector | Verify checkbox is unchecked | {"action": "assert_checkbox_unchecked", "selector": "#agree"} |

Data Extraction Actions

| Action | Parameters | Description | Example | |--------|-----------|-------------|---------| | get_text | selector | Extract text from element | {"action": "get_text", "selector": ".result"} | | get_attribute | selector, attribute | Extract element attribute | {"action": "get_attribute", "selector": "#link", "attribute": "href"} |

Browser Options

  • Choose between Chromium, Firefox, or WebKit
  • Configure headless mode (default: true)
  • Adjust operation speed with slow motion option

Execution Mode

| Mode | Description | |------|-------------| | Local | Launches a browser process on the same machine as n8n. Requires browser binaries to be installed (~1GB). | | Remote | Connects to a Playwright server running in a separate container or machine via WebSocket. No browser binaries needed on the n8n host. |

Remote Execution Setup

Run a Playwright server in a separate container:

# docker-compose.yml
services:
  n8n:
    image: n8nio/n8n
    # ...

  playwright-server:
    image: mcr.microsoft.com/playwright:v1.49.0-noble
    command: npx playwright run-server --port 3000 --host 0.0.0.0
    ports:
      - "3000:3000"

Then in the n8n node:

  1. Set Execution Mode to Remote
  2. Set Remote WebSocket URL to ws://playwright-server:3000

This is the recommended approach when running n8n in Docker, as it keeps browser dependencies isolated in a dedicated container.

Results Format

The node returns detailed execution results:

{
  "summary": {
    "total": 5,
    "passed": 4,
    "failed": 1
  },
  "results": [
    {
      "test_name": "Verify homepage loads correctly",
      "status": "passed",
      "errors": [],
      "details": [...]
    }
  ]
}

Compatibility

  • Requires n8n version 1.0.0 or later
  • Tested with Playwright version 1.49.0
  • Supports Windows, macOS, and Linux

System Requirements

  • Node.js 18.10 or later
  • Approximately 1GB disk space for browser binaries
  • Additional system dependencies may be required for browser automation

Example AI Prompt for Test Generation

Use this prompt with your AI model to generate compatible test specifications:

Analyze the provided HTML and generate test cases in JSON format.

SUPPORTED ACTIONS:
Navigation: load_page, go_back, go_forward, reload_page
Interaction: click, fill_input, select_option, check_checkbox, uncheck_checkbox, hover, press_key, submit_form, scroll_to_element, double_click, right_click, drag_and_drop, focus, blur
Assertions: assert_element_present, assert_element_not_present, assert_element_visible, assert_text_present, assert_url_contains, assert_page_title, assert_element_count, assert_attribute, assert_element_enabled, assert_element_disabled, assert_checkbox_checked, assert_checkbox_unchecked
Wait: wait_for_element, wait
Utility: take_screenshot, upload_file, clear_input, execute_script, set_viewport
Dialog: accept_dialog, dismiss_dialog
Frame: switch_to_iframe, switch_to_main
Cookie: set_cookie, get_cookie, clear_cookies
Data Extraction: get_text, get_attribute

Format:
[
  {
    "test_name": "Test description",
    "steps": [
      {
        "action": "action_name",
        "selector": "CSS selector (if applicable)",
        "text": "Text to verify (if applicable)",
        "value": "Value to input (if applicable)",
        "key": "Key to press (if applicable)",
        "attribute": "Attribute name (if applicable)",
        "count": "Expected count (if applicable)",
        "timeout": "Timeout in ms (if applicable)",
        "description": "Step description"
      }
    ],
    "expected_result": "Expected outcome"
  }
]

Example:
[
  {
    "test_name": "Login test",
    "steps": [
      {"action": "load_page"},
      {"action": "fill_input", "selector": "#username", "value": "testuser"},
      {"action": "fill_input", "selector": "#password", "value": "password123"},
      {"action": "click", "selector": "#login-button"},
      {"action": "wait_for_element", "selector": ".dashboard", "timeout": 5000},
      {"action": "assert_url_contains", "text": "/dashboard"},
      {"action": "assert_element_visible", "selector": ".welcome-message"}
    ],
    "expected_result": "User successfully logs in and sees dashboard"
  }
]

Resources

Troubleshooting

Browser executable not found (local mode)

If browsers are not installed correctly:

  1. Clean the installation:
rm -rf ~/.cache/ms-playwright
# or for Windows:
rmdir /s /q %USERPROFILE%\AppData\Local\ms-playwright
  1. Reinstall the package through n8n's Community Nodes interface

Running in Docker (recommended: use Remote mode)

If you are running n8n in Docker and don't want to install browsers inside the container, switch to Remote Execution Mode and run a separate playwright-server container (see Remote Execution Setup above).

Remote connection refused

  • Make sure the Playwright server container is running and reachable from the n8n container
  • Check that the WebSocket URL matches the container name and port (e.g. ws://playwright-server:3000)
  • Ensure both containers are on the same Docker network

License

MIT

Author

Modified from the original n8n-nodes-playwright by Mohamed Toema


Built for AI-powered test automation 🤖🎯