{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "https://json.schemastore.org/nightwatch.json",
  "properties": {
    "custom_commands_path": {
      "type": ["null", "string", "array"],
      "description": "Location(s) where custom commands will be loaded from.",
      "items": {
        "type": "string"
      },
      "default": null
    },
    "custom_assertions_path": {
      "type": ["null", "string", "array"],
      "description": "Location(s) where custom assertions will be loaded from.",
      "items": {
        "type": "string"
      },
      "default": null
    },
    "page_objects_path": {
      "type": ["null", "string", "array"],
      "description": "Location(s) where page object files will be loaded from.",
      "default": null
    },
    "globals_path": {
      "type": ["null", "string"],
      "description": "Location of an external globals module which will be loaded and made available to the test as a property globals on the main client instance.",
      "default": null
    },
    "globals": {
      "type": "object",
      "description": "An object which will be made available on the main test api, throughout the test execution",
      "properties": {
        "abortOnAssertionFailure": {
          "type": "boolean",
          "description": "This controls whether to abort the test execution when an assertion failed and skip the rest. It's being used in waitFor commands and expect assertions",
          "default": true
        },
        "abortOnElementLocateError": {
          "type": "boolean",
          "description": "This controls whether to abort the test execution when an element cannot be located; an error is logged in all cases, but this also enables skipping the rest of the testcase; It's being used in element commands such as .click() or .getText()",
          "default": false
        },
        "waitForConditionPollInterval": {
          "type": "integer",
          "description": "This will overwrite the default polling interval (currently 500ms) for waitFor commands and expect assertions that use retry",
          "default": 500
        },
        "waitForConditionTimeout": {
          "type": "integer",
          "description": "Default timeout value in milliseconds for waitFor commands and implicit waitFor value for expect assertions",
          "default": 5000
        },
        "throwOnMultipleElementsReturned": {
          "type": "boolean",
          "description": "This will cause waitFor commands on elements to throw an error if multiple elements are found using the given locate strategy and selector",
          "default": false
        },
        "suppressWarningsOnMultipleElementsReturned": {
          "type": "boolean",
          "description": "By default a warning is printed if multiple elements are found using the given locate strategy and selector; set this to true to suppress those warnings",
          "default": false
        },
        "asyncHookTimeout": {
          "type": "integer",
          "description": "Controls the timeout value for async hooks. Expects the done() callback to be invoked within this time or an error is thrown",
          "default": 10000
        },
        "unitTestsTimeout": {
          "type": "integer",
          "description": "Controls the timeout value for when running async unit tests. Expects the done() callback to be invoked within this time or an error is thrown",
          "default": 2000
        },
        "customReporterCallbackTimeout": {
          "type": "integer",
          "description": "Controls the timeout value for when executing the global async reporter. Expects the done() callback to be invoked within this time or an error is thrown",
          "default": 20000
        },
        "retryAssertionTimeout": {
          "type": "integer",
          "description": "Automatically retrying failed assertions - You can tell Nightwatch to automatically retry failed assertions until a given timeout is reached, before the test runner gives up and fails the test.",
          "default": 5000
        },
        "reporter": {}
      }
    },
    "dotenv": {
      "type": "object",
      "description": "Configuration settings for the dotenv module - a zero-dependency module that loads environment variables from a .env file into process.env. More details on https://www.npmjs.com/package/dotenv"
    },
    "persist_globals": {
      "type": "boolean",
      "description": "Persist the same globals object between runs or have a (deep) copy of it per each test; this can be useful when persisting data between test suites is needed, such as a cookie or session information",
      "default": false
    },
    "output_folder": {
      "type": "string",
      "description": "The location where the JUnit XML report files will be saved. Set this to false if you want to disable XML reporting",
      "default": "tests_output"
    },
    "src_folders": {
      "type": ["null", "string", "array"],
      "description": "A string or array of folders (excluding subfolders) where the tests are located.",
      "items": {
        "type": "string"
      },
      "default": null
    },
    "live_output": {
      "type": "boolean",
      "description": "Used when running in parallel to determine if the output should be collected and displayed at the end.",
      "default": false
    },
    "disable_colors": {
      "type": "boolean",
      "description": "Used to disable colored output in the terminal.",
      "default": false
    },
    "parallel_process_delay": {
      "type": "integer",
      "description": "Used when running in parallel to specify the delay (in milliseconds) between starting the child processes",
      "default": 10
    },
    "selenium": {
      "type": "object",
      "description": "An object containing Selenium Server related configuration options",
      "properties": {
        "start_process": {
          "type": "boolean",
          "default": false
        },
        "cli_args": {
          "type": ["object", "array"]
        },
        "server_path": {
          "type": ["null", "string"],
          "default": null
        },
        "log_path": {
          "type": ["string", "boolean"],
          "default": ""
        },
        "port": {},
        "check_process_delay": {
          "type": "integer",
          "default": 500
        },
        "max_status_poll_tries": {
          "type": "integer",
          "default": 15
        },
        "status_poll_interval": {
          "type": "integer",
          "default": 200
        }
      }
    },
    "start_session": {
      "type": "boolean",
      "description": "Whether or not to automatically start the Selenium/WebDriver session. If running unit tests, this should be set tot false.",
      "default": true
    },
    "end_session_on_fail": {
      "type": "boolean",
      "description": "End the session automatically when the test is being terminated, usually after a failed assertion.",
      "default": true
    },
    "skip_testcases_on_fail": {
      "description": "Skip the remaining test cases from the current test suite, when one test case fails."
    },
    "test_workers": {
      "type": ["boolean", "object"],
      "description": "Whether or not to run individual test files in parallel.",
      "default": false,
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "workers": {
          "type": ["string", "number"],
          "description": "Automatically compute the number of workers based on CPU cores with \"auto\" or manually specify the number of workers"
        },
        "node_options": {
          "type": ["string", "array"],
          "description": "Pass node arguments to individual workers (all of the process.execArgv using \"auto\" or selectively pass node arguments via [\"--inspect\"])",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "test_runner": {
      "type": "string",
      "description": "Specifies which test runner to use: default|mocha",
      "default": "default"
    },
    "webdriver": {
      "type": "object",
      "description": "Defines options used to connect to the WebDriver/Selenium server",
      "properties": {
        "start_process": {
          "type": "boolean",
          "default": false
        },
        "cli_args": {
          "type": ["object", "array"]
        },
        "server_path": {
          "type": ["null", "string"],
          "default": null
        },
        "log_path": {
          "type": "string"
        },
        "use_legacy_jsonwire": {},
        "check_process_delay": {
          "type": "integer",
          "description": "Time to wait (in ms) before starting to check the Webdriver server is up and running",
          "default": 100
        },
        "max_status_poll_tries": {
          "type": "integer",
          "description": "Maximum number of ping status check attempts before returning a timeout error",
          "default": 10
        },
        "status_poll_interval": {
          "type": "integer",
          "description": "Interval (in ms) to use between status ping checks when checking if the Webdriver server is up and running",
          "default": 200
        },
        "process_create_timeout": {
          "type": "integer",
          "description": "The entire time (in ms) to wait for the Node.js process to be created and running (default is 2 min), including spawning the child process and checking the status",
          "default": 120000
        },
        "host": {},
        "port": {},
        "ssl": {},
        "proxy": {},
        "timeout_options": {
          "type": "object",
          "properties": {
            "timeout": {},
            "retry_attempts": {}
          }
        },
        "default_path_prefix": {},
        "username": {},
        "access_key": {}
      }
    },
    "test_settings": {
      "type": "object"
    },
    "launch_url": {
      "type": "string",
      "description": "A url which can be used later in the tests as the main url to load.",
      "default": ""
    },
    "silent": {
      "type": "boolean",
      "description": "set to false if you want to show the extended http traffic command logs from the WebDriver server.",
      "default": true
    },
    "output": {
      "type": "boolean",
      "description": "Used to disable terminal output completely.",
      "default": true
    },
    "detailed_output": {
      "type": "boolean",
      "description": "Set this to false if you'd like to only see the test case name displayed and pass/fail status.",
      "default": true
    },
    "output_timestamp": {
      "type": "boolean",
      "description": "Set this to true if you'd like to see timestamps next to the logging output",
      "default": false
    },
    "disable_error_log": {
      "type": "boolean",
      "description": "Set this to true if you'd like to not display errors during the execution of the test (they are shown at the end always).",
      "default": false
    },
    "screenshots": {
      "type": "boolean",
      "description": "Take error and failure screenshots during test execution",
      "default": false
    },
    "log_screenshot_data": {
      "type": "boolean",
      "description": "Used to enable showing the Base64 image data in the (verbose) log when taking screenshots.",
      "default": false
    },
    "desiredCapabilities": {
      "type": "object",
      "properties": {
        "browserName": {
          "type": "string"
        }
      }
    },
    "exclude": {
      "type": ["null", "array"],
      "description": "An array of folders or file patterns to be skipped (relative to the main source folder).",
      "items": {
        "type": "string"
      },
      "default": null
    },
    "filter": {
      "type": ["null", "string"],
      "description": "Folder or file pattern to be used when loading the tests. Files that don't match this pattern will be ignored.",
      "default": null
    },
    "skipgroup": {
      "type": "string",
      "description": "Skip a group of tests (a subfolder); can be a list of comma-separated values (no space)",
      "default": ""
    },
    "sync_test_names": {
      "type": "boolean",
      "default": true
    },
    "skiptags": {
      "type": "string",
      "description": "Skip tests by tag name; can be a list of comma-separated values (no space)",
      "default": ""
    },
    "use_xpath": {
      "type": "boolean",
      "description": "Use xpath as the default locator strategy",
      "default": false
    },
    "parallel_mode": {
      "type": "boolean",
      "default": false
    },
    "report_prefix": {
      "type": "string",
      "default": ""
    },
    "unit_tests_mode": {
      "type": "boolean",
      "default": false
    },
    "default_reporter": {
      "type": "string",
      "default": "junit"
    }
  },
  "type": "object"
}
