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 🙏

© 2024 – Pkg Stats / Ryan Hefner

jsharmony-test

v1.4.3

Published

jsHarmony Testing Tools

Downloads

17

Readme

==============

jsharmony-test

==============

Testing tools for jsHarmony

Installation

  1. Ensure that the jsharmony-cli is installed with
npm install -g jsharmony-cli
  1. Install jsharmony-test in the project folder
npm install jsharmony-test --save

Setup

  1. Create a folder in the project root named "test"
  2. Create a subfolder for the test scripts, ex. "test/module1"
  3. Create a _config.json file in the "test/module1" folder with the test configuration:
{
  "server": "https://server:port", // Application URL, ex: https://localhost:8000
  "appbasepath": "<path-to-test>", //(Optional) Path to application base, defaults to current working directory
  "datadir": "---", //(Optional) Path to application data folder, defaults to appbasepath/data
  "screenshot": { ... } //(Optional) Screenshot configuration, if screenshots are taken.  Full screenshot configuration options are listed under the screenshot command below.
  "namespace": "", //(Optional) Root namespace
  "require": [] //(Optional) Run the tests in this array before any other tests in this test set, used in scenarios such as login / authentication
  "before": [ COMMAND1, COMMAND2, ... ] //(Optional) Array of commands to run before running any other tests in this test set (command syntax defined below)
  "after": [ COMMAND1, COMMAND2, ... ] //(Optional) Array of commands to run after running the tests in this test set (command syntax defined below)
}
  1. Create a .json file for each test script within the test folder, ex "test/module1/test1.json"
{
  "id": "TEST_ID",
  "title": "Test Name",
  "batch": "01_Test",  //(Optional) Batch ID used to sort test sequence
  "require": [ "TEST_ID1", "TEST_ID2" ],   //(Optional) Array of tests that must be executed before this test. Used to sort tests
  "commands": [ COMMAND1, COMMAND2, ... ],  //Array of commands to run within this test script (command syntax defined below)
}
  1. The "test" folder should now appear as follows
└───test
    └───module1
            _config.json
            test1.json

Running Tests

  1. Create the test master screenshots
jsharmony test master screenshots test\handheld
  • Optionally use the --show-browser argument to preview in the browser
  1. Run the tests, to compare the current application against the master screenshots
jsharmony test screenshots test\handheld
  • Optionally use the --show-browser argument to preview in the browser

Commands

Overview

Commands are defined as JSON. Each command requires an "exec" parameter to define the command name, and can optionally have a "timeout" parameter to specify a maximum timeout for that command. The COMMAND_NAME may be any of the commands described below.

{ "exec": "COMMAND_NAME", "timeout": 10000 }

Command: Navigate

The "navigate" command is used to redirect the test browser to a new URL.

{ "exec": "navigate", "url": "https://localhost:3000" }
  • The url property can use variables, e.g., "https://localhost:3000/App?token=@TOKEN"

Command: Screenshot

The "screenshot" command is used to take a screenshot of the current browser window.

{ "exec": "screenshot", "id": "login_start" }

//The following optional screenshot parameters are available:
{
  "x": 0,         //Take screenshot starting at X position
  "y": 0,         //Take screenshot starting at Y position
  "width": 950,   //Set browser width before taking screenshot
  "height": 700,  //Set browser height before taking screenshot
  "beforeScreenshot": "",  // Execute server-side JS code before taking screenshot
  "onload": "",   // Execute client-side JS code before taking screenshot
  "cropToSelector": ".container", // Crop screenshot to DOM selector
  "postClip":   { // Clip screenshot to target size
    "x": 1,
    "y": 1,
    "width": 1,
    "height": 1
  },
  "trim": true,   // Trim blank pixels from edge of screenshot
  "exclude": [    // Draw a black box over target areas, to prevent false positive errors in screenshot comparison
    {  //Exclude region based on absolute rectangle
      "x": 1,
      "y": 1,
      "width": 1,
      "height": 1
    },
    {  //Exclude region based on DOM selector
      "selector": ""
    }
  ]
}

Command: Wait

The "wait" command pauses test execution until a specified condition is met.

{ "exec": "wait" }

//Example usage:
{ "exec": "wait", "element": ".homePage" }
{ "exec": "wait", "text": "Welcome!" }
  • Optional Parameters:
    • "element": ELEMENT_SELECTOR // Selector for the target element
    • "text": TEXT_COMPARE // The element or any child element containing the text (defined below)
      • If no element is specified, wait for any child of the document containing the text
    • "while_waiting": [ COMMAND1, COMMAND2 ] // Execute commands while the wait operation is in progress

Command: Input

The "input" command performs key presses or enters data into elements.

{ "exec": "input", "element": "ELEMENT_SELECTOR", "value": "John Doe" }
  • The syntax for ELEMENT_SELECTOR is defined below.
  • Value can also contain:
    • \r (For "enter key")
    • {SPECIAL_KEY} (For special keys as defined in the Puppeteer KeyInput object), e.g., {Backspace}
    • {SPECIAL_KEY1}{SPECIAL_KEY2} (Multiple simultaneous special key presses)
    • List of special keys can be found in the Puppeteer KeyInput documentation
  • If the input is a checkbox, the value can be:
    • true :: checked
    • false :: unchecked
    • "true" :: checked
    • "false" :: unchecked
  • When using variables, the value can be:
    • "@VARIABLE"
    • or contain additional characters, such as "EXAMPLE@VARIABLE\n"

Command: Click

The "click" command uses the mouse to interact with the user interface.

{ "exec": "click", "element": "ELEMENT_SELECTOR" }
  • The syntax for ELEMENT_SELECTOR is defined below.
  • Optional Parameters:
    • "button": "left", "right", "middle"

Command: Set

The "set" command saves data from the user interface or page into memory.

{ "exec": "set", "variable": "VARIABLE", "value": "VALUE_GETTER" }
  • The syntax for VALUE_GETTER is defined below.
  • Variables are stored in the jsHarmonyTestConfig.variables object

Command: JS

The "js" command can be used to execute arbitray JavaScript. Promises should be used to wait for the operation to complete before moving to the next command.

 { "exec": "js", "js": "return new Promise(function(resolve,reject){ resolve(); });" }
  • Parameters passed to the JS function:
    • jsh - jsHarmony instance
    • page - Puppeteer Page
    • callback - Callback. If a Promise is returned by the JS, wait for the Promise to resolve

Command: Assert

The "assert" command checks whether a page element displays an expected value.

{ "exec": "assert", "element": "ELEMENT_SELECTOR", "value": "TEXT_COMPARE" }
  • The syntax for ELEMENT_SELECTOR and TEXT_COMPARE is defined below.
  • Optional Parameters:
    • "error": "Container missing target text" // Error description

Selectors and Getters

ELEMENT_SELECTOR

Element selectors are used to specify an element in the user interface.

  { "selector": "SELECTOR" }  //CSS Selector for an element
  { "selector": "SELECTOR", "visible": true }  //Require element to be visible

  //Example usage:
  { "exec": "wait", "element": {"selector": ".targetElement", "visible": true} },
  
  As a shorthand,
    { "element": "SELECTOR" }
  is equivalent to
    { "element": { "selector": "SELECTOR" } }

TEXT_COMPARE

Text compare expressions are used to check whether a source string matches an expected value.

  { "equals": "text" }       //Text string must be exact match
  { "not_equals": "text" }   //Text string must not match
  { "contains": "text" }     //Text string contains target text
  { "not_contains": "text" } //Text string contains target text
  { "begins_with": "text" }  //Text string begins with target text
  { "ends_with": "text" }    //Text string ends with target text
  { "regex": "text.*" }      //Regex match
  { "equals": "text", "case": "sensitive" } //Default is case sensitive
  { "equals": "text", "case": "insensitive" } //Case insensitive comparison

  //Example usage:
  { "exec": "wait", "text": { "contains": "Target Text" } }

  As a shorthand,
    { "text": "TEXT" }
  is equivalent to
    { "text": { "contains": "TEXT" } }

VALUE_GETTER

Value getters are used to extract the value of an element property from the user interface.

  { "element": “selector”, "property": "text"  }

  //Example usage:
  { "exec": "set", "variable": "Variable name", "value": { "element": ".targetElement", "property": "text" } }
  • Optional Parameters:
    • "regex": "ID (.*)" Parse resulting text, and extract first match
  • Property can be:
    • "text", or any element property, ex. "innerHTML", "clientHeight", etc.

Examples

Configuration for testing a login page

{
  "id": "login",
  "title": "Login",
  "commands": [
    { "exec": "navigate", "url": "/" },
    //Put app token into a variable
    { "exec": "set", "variable": "APPTOKEN", "value": { "element": ".loginLink", "property": "href", "regex": "app\\_token=(.*)"  } }, 
    
    { "exec": "navigate", "url": "/login?app_token=@APPTOKEN" },
    // Waits for text to render before continuing
    { "exec": "wait", "text": { "contains": "Please enter username" } },
    { "exec": "screenshot", "id": "Login" },

    { "exec": "input", "element": ".username", "value": "testUser" },
    { "exec": "screenshot", "id": "Username" }, 
    { "exec": "click", "element": ".loginButton" },
  ],
}

Tools

jsharmony test recorder

The test recorder tool launches a browser and records the user interactions to generate a test script.

jsharmony test recorder
  • Optional flags:
    • --full-element-paths: return full element paths instead of shortest unique path

Release History

  • 1.0.0 Initial release