Overview
Each node in AutoMFlows has configurable properties that control its behavior. This guide covers common configuration options and advanced features like retry strategies, wait conditions, and error handling.
Common Node Properties
All nodes share these basic properties:
ID Unique identifier for the node, automatically generated when the node is created.
Type Defines the node’s behavior (e.g., openBrowser, action, verify).
Label Human-readable name displayed on the canvas.
Position X and Y coordinates on the canvas.
Browser Node Configuration
Open Browser Node
The Open Browser node launches a browser instance with Playwright.
{
"type" : "openBrowser" ,
"data" : {
"label" : "Open Browser" ,
"headless" : false ,
"browser" : "chromium" , // chromium, firefox, webkit
"viewportWidth" : 1280 ,
"viewportHeight" : 720 ,
"maxWindow" : true ,
"stealthMode" : false ,
"launchOptions" : {},
"capabilities" : {},
"jsScript" : "" // JavaScript to inject before page loads
}
}
Browser Types
Viewport
Stealth Mode
chromium : Google Chrome/Edge (default)
firefox : Mozilla Firefox
webkit : Safari (WebKit engine)
Set custom viewport dimensions: {
"viewportWidth" : 1920 ,
"viewportHeight" : 1080
}
Enable stealth mode to avoid bot detection:
Navigation Node
Navigate to URLs or control browser history.
{
"type" : "navigation" ,
"data" : {
"label" : "Navigate to Site" ,
"action" : "navigate" , // navigate, goBack, goForward, reload
"url" : "https://example.com" ,
"waitUntil" : "networkidle" , // load, domcontentloaded, networkidle
"timeout" : 30000 ,
"referer" : "" // Optional referer header
}
}
The navigation node automatically normalizes URLs by adding https:// if no protocol is specified.
Action Node
Perform browser interactions like clicks, hovers, and drag-and-drop.
{
"type" : "action" ,
"data" : {
"label" : "Click Button" ,
"action" : "click" , // click, doubleClick, rightClick, hover, dragAndDrop
"selector" : "button.submit" ,
"selectorType" : "css" , // css, xpath, text
"selectorModifiers" : [],
"timeout" : 30000 ,
"button" : "left" , // left, right, middle
"delay" : 0 // Delay in ms after action
}
}
Selector Types
Actions
Drag & Drop
CSS Selectors (default):button .submit
#login-form input [ type = "email" ]
div .container > p :first-child
XPath ://button[@class="submit"]
//input[@type="email"]
Text :text=Submit
text=/Sign (in|up)/i
click : Single left-click
doubleClick : Double-click
rightClick : Right-click (context menu)
hover : Move mouse over element
dragAndDrop : Drag element to target
Drag to a target element: {
"action" : "dragAndDrop" ,
"selector" : ".draggable-item" ,
"targetSelector" : ".drop-zone" ,
"targetSelectorType" : "css"
}
Or drag to coordinates: {
"action" : "dragAndDrop" ,
"selector" : ".draggable-item" ,
"targetX" : 500 ,
"targetY" : 300
}
API Node Configuration
API Request Node
Make HTTP requests with full control over headers, body, and authentication.
{
"type" : "apiRequest" ,
"data" : {
"label" : "Get User Data" ,
"method" : "POST" ,
"url" : "https://api.example.com/users" ,
"headers" : {
"Content-Type" : "application/json" ,
"Authorization" : "Bearer ${token}"
},
"body" : '{"name": "John Doe", "email": "[email protected] "}' ,
"bodyType" : "json" , // json, form-data, x-www-form-urlencoded, raw
"timeout" : 30000 ,
"contextKey" : "apiResponse" // Store response in context
}
}
HTTP Methods
Body Types
Response
GET
POST
PUT
PATCH
DELETE
HEAD
OPTIONS
JSON :{
"bodyType" : "json" ,
"body" : ' { "key" : "value" } '
}
Form Data :{
"bodyType" : "form-data" ,
"formFields" : [
{ "key" : "name" , "value" : "John" }
],
"formFiles" : [
{ "key" : "file" , "filePath" : "./upload.txt" }
]
}
API response is stored in context: {
"status" : 200 ,
"statusText" : "OK" ,
"headers" : {},
"body" : {},
"duration" : 123 ,
"timestamp" : "2026-03-07T10:00:00.000Z"
}
API cURL Node
Import and execute cURL commands directly.
{
"type" : "apiCurl" ,
"data" : {
"label" : "Execute cURL" ,
"curlCommand" : "curl -X POST https://api.example.com/users -H 'Content-Type: application/json' -d '{ \" name \" : \" John \" }'" ,
"timeout" : 30000 ,
"contextKey" : "apiResponse"
}
}
The cURL parser automatically extracts method, URL, headers, and body from the command string.
Verification Node
Verify browser state or API responses.
{
"type" : "verify" ,
"data" : {
"label" : "Verify Login Success" ,
"domain" : "browser" , // browser, api
"verificationType" : "text" , // text, url, statusCode, jsonPath, attribute
"selector" : "h1.welcome" ,
"expectedValue" : "Welcome back!" ,
"selectorType" : "css"
}
}
Browser Verification
API Verification
Text Content :{
"verificationType" : "text" ,
"selector" : "h1" ,
"expectedValue" : "Create Account"
}
URL :{
"verificationType" : "url" ,
"expectedValue" : "https://example.com/dashboard"
}
Attribute :{
"verificationType" : "attribute" ,
"selector" : "input[name='email']" ,
"attribute" : "value" ,
"expectedValue" : "[email protected] "
}
Status Code :{
"domain" : "api" ,
"verificationType" : "statusCode" ,
"expectedValue" : "200"
}
JSON Path :{
"domain" : "api" ,
"verificationType" : "jsonPath" ,
"jsonPath" : "$.data.user.email" ,
"expectedValue" : "[email protected] "
}
Retry Strategies
Configure retry behavior for nodes that may fail transiently.
{
"retryEnabled" : true ,
"retryStrategy" : "count" , // count, untilCondition
"retryCount" : 3 ,
"retryDelay" : 1000 , // ms
"retryDelayStrategy" : "exponential" , // fixed, exponential
"retryMaxDelay" : 10000 , // ms
"failSilently" : false
}
Count Strategy
Condition Strategy
Exponential Backoff
Retry a fixed number of times: {
"retryEnabled" : true ,
"retryStrategy" : "count" ,
"retryCount" : 3 ,
"retryDelay" : 1000
}
Retry until a condition is met: {
"retryEnabled" : true ,
"retryStrategy" : "untilCondition" ,
"retryUntilCondition" : "apiResponse.status === 200" ,
"retryDelay" : 2000 ,
"retryCount" : 5
}
Increase delay between retries: {
"retryEnabled" : true ,
"retryDelayStrategy" : "exponential" ,
"retryDelay" : 1000 ,
"retryMaxDelay" : 10000
}
Delays: 1s, 2s, 4s, 8s, 10s (capped)
Use retry strategies carefully with state-changing operations (POST, PUT, DELETE) to avoid duplicate actions.
Wait Conditions
Define wait conditions before or after node execution.
{
"waitAfterOperation" : false ,
"waitForSelector" : "div.loaded" ,
"waitForSelectorType" : "css" ,
"waitForSelectorTimeout" : 5000 ,
"waitForUrl" : "https://example.com/dashboard" ,
"waitForUrlTimeout" : 5000 ,
"waitForCondition" : "document.readyState === 'complete'" ,
"waitForConditionTimeout" : 5000 ,
"waitStrategy" : "all" // all, any, race
}
Wait for Selector
Wait for URL
Wait for Condition
Wait Strategies
Wait for an element to appear: {
"waitForSelector" : ".success-message" ,
"waitForSelectorType" : "css" ,
"waitForSelectorTimeout" : 5000
}
Wait for URL to match pattern: {
"waitForUrl" : "https://example.com/success" ,
"waitForUrlTimeout" : 5000
}
Supports regex: {
"waitForUrl" : "/ \\ /dashboard \\ //"
}
Wait for JavaScript condition: {
"waitForCondition" : "document.querySelector('.spinner') === null" ,
"waitForConditionTimeout" : 10000
}
all : All conditions must be met (default){ "waitStrategy" : "all" }
any : Any condition can satisfy{ "waitStrategy" : "any" }
race : First condition to resolve{ "waitStrategy" : "race" }
Context Manipulation
The Context Manipulate node configures browser context properties.
{
"type" : "contextManipulate" ,
"data" : {
"action" : "setGeolocation" ,
"geolocation" : {
"latitude" : 37.7749 ,
"longitude" : - 122.4194 ,
"accuracy" : 100
}
}
}
Geolocation
Permissions
Device Emulation
Timezone
{
"action" : "setGeolocation" ,
"geolocation" : {
"latitude" : 37.7749 ,
"longitude" : -122.4194
}
}
{
"action" : "setPermissions" ,
"permissions" : [ "geolocation" , "notifications" ]
}
{
"action" : "emulateDevice" ,
"device" : "iPhone 13"
}
{
"action" : "setTimezone" ,
"timezoneId" : "America/Los_Angeles"
}
Variable Interpolation
Use variables from context in node properties:
{
"url" : "https://api.example.com/users/${userId}" ,
"headers" : {
"Authorization" : "Bearer ${authToken}"
},
"body" : ' { "email" : "${userData.email}" } '
}
Variables are interpolated at execution time using the ${variableName} syntax. Nested properties use dot notation: ${object.property}.
Error Handling
Configure how nodes handle errors:
{
"failSilently" : false , // Continue execution on error
"timeout" : 30000 // Throw error after timeout
}
When failSilently: true, the node logs a warning but continues workflow execution. Use this carefully to avoid masking critical failures.
Config File Nodes
Load configuration from JSON files:
{
"type" : "loadConfigFile" ,
"data" : {
"configs" : [
{
"fileName" : "test-data.json" ,
"fileContent" : '{"apiUrl": "https://api.example.com", "timeout": 5000}' ,
"enabled" : true ,
"contextKey" : "config" // Optional: store under specific key
}
]
}
}
The config is merged into the execution context and can be accessed by other nodes:
const apiUrl = context . getData ( 'config' ). apiUrl ;
Next Steps
Browser Automation Learn advanced browser automation techniques with Playwright.
API Testing Test REST APIs with advanced request configuration.