e2e-testing

Contributors

GitHub-linked commit authors for this SKILL.md at the saved revision. Co-authors and history before file renames are not included.

File history ↗

Write and review Playwright E2E tests for Langflow. Trigger when the user asks to write, fix, or review E2E tests, spec files, Playwright tests, or integration tests that exercise the full UI. Also trigger when modifying data-testid attributes, test helpers in tests/utils/, or fixture configuration.

.agents/skills/e2e-testing/SKILL.md

Download bundle ↓
main · 595cd724 bundle filesScanned 2026-09-15

references/selectors.md

1,229 tokens · o200k_base · 5,096 bytes

Source excerpt starting at line 1.
# Langflow E2E Selector Catalog This is the canonical reference for `data-testid` selectors used in Langflow E2E tests. When adding new interactive elements, follow these naming conventions and add the element to this catalog. ## Naming Convention All `data-testid` values use kebab-case with a prefix that indicates the element type: | Prefix | Element Type | Example ||--------|-------------|---------|| `input-` | Text inputs | `input-chat-playground`, `input-flow-name` || `button-` / `button_` | Action buttons | `button-send`, `button_run_chat output` || `icon-` | Icon buttons | `icon-Globe`, `icon-Lock`, `icon-ChevronLeft` || `popover-anchor-input-` | Component parameter fields | `popover-anchor-input-openai_api_key` || `add-component-button-` | Drag-to-add buttons | `add-component-button-chat-output` || `card-` | Flow/component cards | `card-my-flow-name` || `title-` | Node titles on canvas | `title-OpenAI`, `title-Chat Output` || `handle-` | Connection handles | `handle-{component}-{shownode}-{field}-{direction}` || `div-chat-message` | Chat messages | `div-chat-message` || `show` | Field visibility toggles | `showmodel_name`, `showtemperature` | ## Canvas & Navigation | Selector | Element | Notes ||----------|---------|-------|| `blank-flow` | "New Blank Flow" button | On project creation modal || `sidebar-search-input` | Component search input | Sidebar search bar || `sidebar-nav-add_note` | Sticky note button | Sidebar navigation || `sidebar-add-sticky-note-button` | Add sticky note (new) | Updated button name || `react-flow-id` | ReactFlow canvas container | Use for drag targets || `canvas_controls_dropdown` | Canvas controls dropdown | Opens zoom/fit/inspector menu || `fit_view` | Fit view button | Inside canvas controls || `zoom_out` | Zoom out button | Inside canvas controls || `zoom_in` | Zoom in button | Inside canvas controls || `inspector-toggle` | Inspection panel toggle | Inside canvas controls dropdown | ## Component Fields | Selector | Element | Notes ||----------|---------|-------|| `popover-anchor-input-{name}` | Component input field | `name` matches the field's `name` attribute || `popover-anchor-input-openai_api_key` | OpenAI API key field | Only visible when no global variable selected || `input_output{component}` | Output connection handle area | e.g., `input_outputChat Output` | **Important**: When `load_from_db: true` and a global variable is selected, the field renders as a **badge** (not an `<input>`). The `popover-anchor-input-{name}` selector will NOT exist in the DOM for those fields. ## Actions & Buttons | Selector | Element | Notes ||----------|---------|-------|| `button-send` | Send message button | Playground chat || `button_run_{component}` | Run component button | e.g., `button_run_chat output` || `publish-button` | Publish/deploy flow | Top toolbar || `save-flow-button` | Save flow | Top toolbar || `edit-fields-button` | Toggle field editor | Inspection panel — requires `enableInspectPanel()` first || `playground-btn-flow-io` | Playground button | Use `dispatchEvent("click")` to close (not `.click()`) || `manage-model-providers` | Model providers button | Settings | ## Modals & Panels | Selector | Element | Notes ||----------|---------|-------|| `modal-title` | Modal heading | Generic modal title || `edit-button-modal` | Edit button (legacy) | Old modal pattern || `edit-button-close` | Close edit modal | Old modal pattern || `lock-flow-switch` | Flow lock toggle | Flow settings || `input-flow-name` | Flow name input | Flow settings modal || `input-flow-description` | Flow description input | Flow settings modal || `session-selector` | Session selector | Playground session switcher | ## Icons (as buttons) | Selector | Action ||----------|--------|| `icon-Globe` | Open global variables || `icon-Lock` | Toggle flow lock || `icon-ChevronLeft` | Navigate back || `icon-Trash2` | Delete action || `icon-Plus` | Add/create action | ## Inspection Panel Field Toggles These selectors toggle field visibility in the inspection panel. The format is `show{fieldname}` (no separator): | Selector | Field ||----------|-------|| `showmodel_name` | Model name field || `showtemperature` | Temperature field || `showmax_tokens` | Max tokens field || `showopenai_api_key` | OpenAI API key field | ## When to Add New data-testid Add `data-testid` to an element when:1. E2E tests need to interact with it (click, fill, assert visibility)2. The element has no stable `role` or `text` alternative3. The element is dynamically rendered and needs a stable anchor Format: `{type}-{descriptive-name}` in kebab-case. Keep it descriptive enough that a test author understands the element without reading the component source. ```tsx// Right — descriptive, kebab-case<button data-testid="save-flow-button">Save</button><input data-testid="input-flow-name" /><div data-testid="card-flow-summary" /> // Wrong — too generic<button data-testid="btn1">Save</button><input data-testid="input" /><div data-testid="wrapper" />``` 
Referenced from SKILL.md