Socket
Socket
Sign inDemoInstall

@qualweb/core

Package Overview
Dependencies
11
Maintainers
3
Versions
244
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    @qualweb/core

QualWeb evaluator core engine


Version published
Maintainers
3
Created

Readme

Source

QualWeb core

The core allows you to perform automatic accessibility evaluations on web pages. It contains 3 evaluation modules:

  • @qualweb/act-rules
  • @qualweb/wcag-techniques
  • @qualweb/best-practices

You can also perform evaluations at http://qualweb.di.fc.ul.pt/evaluator/, or by installing the chrome extension.

How to install

  $ npm i @qualweb/core --save

How to run

  'use strict';

  const { QualWeb, generateEARLReport } = require('@qualweb/core');

  (async () => {
    const plugins = {
      // Check https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-adblocker
      adBlock: true, // Default value = false
      // Check https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth
      stealth: true // Default value = false
    };
    const qualweb = new QualWeb(plugins);

    const clusterOptions = {
      maxConcurrency: 5, // Performs several urls evaluations at the same time - the higher the number given, more resources will be used. Default value = 1
      timeout: 60 * 1000, // Timeout for loading page. Default value = 30 seconds
      monitor: true // Displays urls information on the terminal. Default value = false
    };

    const launchOptions = {
      ... // check https://github.com/puppeteer/puppeteer/blob/v10.1.0/docs/api.md#puppeteerlaunchoptions
      // In most cases there's no need to give additional options. Just leave the field undefined
    };

    // Starts the QualWeb core engine
    await qualweb.start(clusterOptions, launchOptions);

    // QualWeb evaluation report
    const qualwebOptions = {
      url: 'https://act-rules.github.io/pages/about/',
      ...
    };

    // Evaluates the given options - will only return after all urls have finished evaluating or resulted in an error
    const reports = await qualweb.evaluate(qualwebOptions);

    console.log(reports);
    //  {
    //    "url": "report",
    //    "url2": "report2"
    //  }

    // Stops the QualWeb core engine
    await qualweb.stop();

    const earlOptions = {
      // Check the options in the section below
    };

    // if you want an EARL report
    const earlReports = generateEARLReport(reports, earlOptions);

    console.log(earlReports);
    //  {
    //    "url": "earlReport",
    //    "url2": "earlReport2"
    //  }
  })();

Options

The available options fot the evaluate() function are:

{
  "url": "https://act-rules.github.io/pages/about/", // url to evaluate
  "urls": ["https://act-rules.github.io/pages/about/", "https://act-rules.github.io/rules/"], // Array of urls
  "file": "/path/to/file/with/urls", // urls must be separated by a newline (\n)
  "crawl": "https://act-rules.github.io", // Domain to crawl and obtain the urls
  "html": "<html-code>", // Full webpage html, or just small snippets
  "log": {
    "file": true, // Logs errors to a file. Default value = false
    "console": false // Logs errors to the console. Default value = false
  },
  "viewport": {
    "mobile": false, // default value = false
    "landscape": true, // default value = viewPort.width > viewPort.height
    "userAgent": "custom user agent", // default value for desktop = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:22.0) Gecko/20100101 Firefox/22.0', default value for mobile = 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; DROID2 GLOBAL Build/S273) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
    "resolution": {
      "width": 1920, // default value for desktop = 1366, default value for mobile = 1080
      "height": 1080 // default value for desktop = 768, default value for mobile = 1920
    }
  },
  "waitUntil": ["load", "networkidle0"], // Events to wait before starting evaluation, default value = "load". For more check https://github.com/puppeteer/puppeteer/blob/v10.1.0/docs/api.md#pagegotourl-options
  "validator": "http://127.0.0.1/validate", // HTML validator service endpoint. The url will be attached after of the given endpoint
  "crawlOptions": {
    "maxDepth": 2, // max depth to search, 0 to search only the given domain. Default value = -1 (search everything)
    "maxUrls": 100, // max urls to find. Default value = -1 (search everything)
    "timeout": 60, // how many seconds the domain should be crawled before it ends. Default value = -1 (never stops)
    "maxParallelCrawls": 10, // max urls to crawl at the same time. Default value = 5
    "logging": true // logs domain, current depth, urls found and time passed to the terminal
  },
  "translate": "en", // OR { "translate": "en", "fallback": "en" } OR { own translation object } check https://github.com/qualweb/locale#readme. Default = "en"
  "execute": {
    // choose which modules to execute
    // if this option is not specified, the default values below will be applied, otherwise unspecified values will default to false
    "wappalyzer": false, // wappalyzer module (https://github.com/qualweb/wappalyzer)
    "act": true, // act-rules module (https://github.com/qualweb/act-rules)
    "wcag": true, // wcag-techniques module (https://github.com/qualweb/wcag-techniques)
    "bp": false, // best-practices module (https://github.com/qualweb/best-practices)
    "counter": false // counter module (https://github.com/qualweb/counter)
  },
  "act-rules": {
    // More information about this options at https://github.com/qualweb/act-rules
    "rules": ["QW-ACT-R1", "b5c3f8"], // Array of rules to execute, can be passed the QualWeb Rule ID or the ACT Rule ID
    "exclude": ["QW-ACT-R1", "b5c3f8"], // Array of rules to exclude, can be passed the QualWeb Rule ID or the ACT Rule ID
    "levels": ["A", "AA", "AAA"], // Conformance levels to execute,
    "principles": ["Perceivable", "Operable", "Understandable", "Robust"] // Principles to execute
  },
  "wcag-techniques": {
    // More information about this options at https://github.com/qualweb/wcag-techniques
    "techniques": ["QW-WCAG-T1", "H39"], // Array of techniques to execute, can be passed the QualWeb Technique ID or the WCAG 2.1 Technique Code
    "exclude": ["QW-WCAG-T1", "H39"], // Array of techniques to exclude, can be passed the QualWeb Technique ID or the WCAG 2.1 Technique Code
    "levels": ["A", "AA", "AAA"], // Conformance levels to execute,
    "principles": ["Perceivable", "Operable", "Understandable", "Robust"] // Principles to execute
  },
  "best-practices": {
    // More information about this options at https://github.com/qualweb/best-practices
    "bestPractices": ["QW-BP1", "QW-BP2"], // Array of best practices to execute
    "exclude": ["QW-BP1", "QW-BP2"] // Array of best practices to exclude
  }
}

The available options fot the generateEARLReport() function are:

{
  "aggregated": true, // default value = false
  "aggregatedName": "websites.json", // The name to save the aggregated earl reports. default value = first url of the list
  "modules": {
    // Choose which modules to convert the report to earl, by default all modules are converted if they were executed
    "act": true, // default value = true
    "wcag": false, // default value = true
    "best-practices": false // default value = true
  } // If the "modules" value is given, any missing module value missing it's automatically set to false
}

Report details

In this section it's explained the evaluation report in detail. For a detailed version of the EARL report check @qualweb/earl-reporter.

  {
    "type": "evaluation",
    "system": {
      "name": "QualWeb",
      "description": "QualWeb is an automatic accessibility evaluator for webpages.",
      "version": "QualWeb version",
      "homepage": "http://www.qualweb.di.fc.ul.pt/",
      "date": "date of the evaluation",
      "hash": "unique hash",
      "url": {
        "inputUrl": "inserted url",
        "protocol": "protocol of the url",
        "domainName": "domain name of the url",
        "domain": "domain of the url",
        "uri": "uri of the url",
        "completeUrl": "complete url after all redirects"
      },
      "page": {
        "viewport": {
          "mobile": "was evaluated on a mobile context or not",
          "landscape": "was evaluated on a landscape context or not",
          "userAgent": "user agent used",
          "resolution": {
            "width": "window's width used",
            "height": "window's height used",
          }
        },
        "dom": {
          "html": "html code as a string",
          "title": "Title of the webpage",
          "elementCount": "Element count of the webpage"
        }
      }
    },
    "metadata": {
      "passed": "number of passed rules/techniques/best practices",
      "warning": "number of warning rules/techniques/best practices",
      "failed": "number of failed rules/techniques/best practices",
      "inapplicable": "number of inapplicable rules/techniques/best practices",
    },
    "modules": {
      "act-rules": {
        "type": "act-rules",
        "metadata": {
          "passed": "number of passed rules",
          "warning": "number of warning rules",
          "failed": "number of failed rules",
          "inapplicable": "number of inapplicable rules",
        },
        "assertions": {
          "QW_ACT_R1": {
            "name": "Name of the rule",
            "code": "QualWeb rule id",
            "mapping": "ACT rule id mapping",
            "description": "Description of the rule",
            "metadata": {
              "target": "Any target, can be one element, multiple elements, attributes, a relation between elements",
              "success-criteria?": [
                {
                  "name": "Name of the success criteria",
                  "level": "Level of conformance of the success criteria",
                  "principle": "Principle of the success criteria",
                  "url": "Url of the success criteria"
                }
              ],
              "related?": [], // related WCAG 2.1 techniques
              "url?": "Url of the rule",
              "passed": "Number of passed results",
              "warning": "Number of warning results",
              "failed": "Number ff failed results",
              "type?": [], // usually "ACTRule" or "TestCase"
              "a11yReq?": [], // WCAG 2.1 relation - something like "WCAG21:language"
              "outcome": "Outcome of the rule",
              "description": "Description of the outcome";
            },
            "results": [
              {
                "verdict": "Outcome of the test",
                "description": "Description of the test",
                "resultCode": "Test identifier",
                "pointer?": "Element pointer in CSS notation",
                "htmlCode?": "Element html code",
                "attributes?": "Attributes of the element",
                "accessibleName?": "Accessible name of the test target"
              },
              { ... }
            ]
          },
          "...": { ... }
        }
      },
      "wcag-techniques": {
        "type": "wcag-techniques",
        "metadata": {
          "passed": "number of passed techniques",
          "warning": "number of warning techniques",
          "failed": "number of failed techniques",
          "inapplicable": "number of inapplicable techniques",
        },
        "assertions": {
          "QW_WCAG_T1": {
            "name": "Name of the technique",
            "code": "QualWeb technique id",
            "mapping": "WCAG techniques code mapping",
            "description": "Description of the technique",
            "metadata": {
              "target": "Any target, can be one element, multiple elements, attributes, a relation between elements",
              "success-criteria?": [
                {
                  "name": "Name of the success criteria",
                  "level": "Level of conformance of the success criteria",
                  "principle": "Principle of the success criteria",
                  "url": "Url of the success criteria"
                }
              ],
              "related?": [], // related WCAG 2.1 techniques
              "url?": "Url of the technique",
              "passed": "Number of passed results",
              "warning": "Number of warning results",
              "failed": "Number ff failed results",
              "type?": [], // usually "ACTRule" or "TestCase"
              "a11yReq?": [], // WCAG 2.1 relation - something like "WCAG21:language"
              "outcome": "Outcome of the technique",
              "description": "Description of the outcome";
            },
            "results": [
              {
                "verdict": "Outcome of the test",
                "description": "Description of the test",
                "resultCode": "Test identifier",
                "pointer?": "Element pointer in CSS notation",
                "htmlCode?": "Element html code",
                "attributes?": "Attributes of the element" // if available
              },
              { ... }
            ]
          },
          "...": { ... }
        }
      },
      "best-practices": {
        "type": "best-practices",
        "metadata": {
          "passed": "number of passed best practices",
          "warning": "number of warning best practices",
          "failed": "number of failed best practices",
          "inapplicable": "number of inapplicable best practices",
        },
        "assertions": {
          "QW_BP1": {
            "name": "Name of the technique",
            "code": "QualWeb best practices id",
            "description": "Description of the best practices",
            "metadata": {
              "target": "Any target, can be one element, multiple elements, attributes, a relation between elements",
              "success-criteria?": [
                {
                  "name": "Name of the success criteria",
                  "level": "Level of conformance of the success criteria",
                  "principle": "Principle of the success criteria",
                  "url": "Url of the success criteria"
                }
              ],
              "related?": [], // related WCAG 2.1 techniques
              "passed": "Number of passed results",
              "warning": "Number of warning results",
              "failed": "Number ff failed results",
              "type?": [], // usually "ACTRule" or "TestCase"
              "a11yReq?": [], // WCAG 2.1 relation - something like "WCAG21:language"
              "outcome": "Outcome of the best practices",
              "description": "Description of the outcome";
            },
            "results": [
              {
                "verdict": "Outcome of the test",
                "description": "Description of the test",
                "resultCode": "Test identifier",
                "pointer?": "Element pointer in CSS notation",
                "htmlCode?": "Element html code",
                "attributes?": "Attributes of the element" // if available
              },
              { ... }
            ]
          },
          "...": { ... }
        }
      },
      "counter": {
        "type": "counter",
        "data": {
          "roles": {
            "button": 2,
            "link": 4,
            ...
          },
          "tags": {
            "div": 10,
            "table": 3,
            ...
          }
        }
      }
    }
  }

Implemented ACT Rules

QualWeb Rule IDACT Rule IDACT Rule Name
QW-ACT-R12779a5HTML Page has a title
QW-ACT-R2b5c3f8HTML has lang attribute
QW-ACT-R35b7ae0HTML lang and xml:lang match
QW-ACT-R4bc659aMeta-refresh no delay
QW-ACT-R5bf051aValidity of HTML Lang attribute
QW-ACT-R659796fImage button has accessible name
QW-ACT-R7b33effOrientation of the page is not restricted using CSS transform property
QW-ACT-R9b20e66Links with identical accessible names have equivalent purpose
QW-ACT-R104b1c6ciframe elements with identical accessible names have equivalent purpose
QW-ACT-R1197a4e1Button has accessible name
QW-ACT-R12c487aeLink has accessible name
QW-ACT-R136cfa84Element with aria-hidden has no focusable content
QW-ACT-R14b4f0c3meta viewport does not prevent zoom
QW-ACT-R1580f0bfaudio or video has no audio that plays automatically
QW-ACT-R16e086e5Form control has accessible name
QW-ACT-R1723a2a8Image has accessible name
QW-ACT-R183ea0c8id attribute value is unique
QW-ACT-R19cae760iframe element has accessible name
QW-ACT-R20674b10role attribute has valid value
QW-ACT-R217d6734svg element with explicit role has accessible name
QW-ACT-R22de46e4Element within body has valid lang attribute
QW-ACT-R23c5a4eavideo element visual content has accessible alternative
QW-ACT-R2473f2c2autocomplete attribute has valid value
QW-ACT-R255c01eaARIA state or property is permitted
QW-ACT-R26eac66bvideo element auditory content has accessible alternative
QW-ACT-R275f99a7This rule checks that each aria- attribute specified is defined in ARIA 1.1.
QW-ACT-R284e8ab6Element with role attribute has required states and properties
QW-ACT-R29e7aa44Audio element content has text alternative
QW-ACT-R302ee8b8Visible label is part of accessible name
QW-ACT-R31c3232fVideo element visual-only content has accessible alternative
QW-ACT-R321ec09bvideo element visual content has strict accessible alternative
QW-ACT-R33ff89c9ARIA required context role
QW-ACT-R346a7281ARIA state or property has valid value
QW-ACT-R35ffd0e9Heading has accessible name
QW-ACT-R36a25f45Headers attribute specified on a cell refers to cells in the same table element
QW-ACT-R37afw4f7Text has minimum contrast
QW-ACT-R38bc4a75ARIA required owned elements
QW-ACT-R39d0f69eAll table header cells have assigned data cells
QW-ACT-R4059br37Zoomed text node is not clipped with CSS overflow
QW-ACT-R4136b590Error message describes invalid form field value
QW-ACT-R428fc3b6Object element has non-empty accessible name
QW-ACT-R430ssw9kScrollable element is keyboard accessible
QW-ACT-R44fd3a94Links with identical accessible names and context serve equivalent purpose
QW-ACT-R4846ca7fElement marked as decorative is not exposed
QW-ACT-R49aaa1bfAudio or video that plays automatically has no audio that lasts more than 3 seconds
QW-ACT-R504c31dfAudio or video that plays automatically has a control mechanism
QW-ACT-R51fd26cfvideo element visual-only content is media alternative for text
QW-ACT-R52ac7dc6video element visual-only content has description track
QW-ACT-R53ee13b5video element visual-only content has transcript
QW-ACT-R54d7ba54video element visual-only content has audio track alternative
QW-ACT-R551ea59cvideo element visual content has audio description
QW-ACT-R56ab4d13video element content is media alternative for text
QW-ACT-R57f196cevideo element visual content has description track
QW-ACT-R582eb176audio element content has transcript
QW-ACT-R59afb423audio element content is media alternative for text
QW-ACT-R60f51b46video element auditory content has captions
QW-ACT-R611a02b0video element visual content has transcript
QW-ACT-R62oj04fdElement in sequential focus order has visible focus
QW-ACT-R63b40fd1Document has a landmark with non-repeated content
QW-ACT-R64047fe0Document has heading for non-repeated content
QW-ACT-R65307n5zElement with presentational children has no focusable content
QW-ACT-R66m6b1q3Menuitem has non-empty accessible name
QW-ACT-R6724afc2Letter spacing in style attributes is not !important
QW-ACT-R6878fd32Line height in style attributes is not !important
QW-ACT-R699e45ecWord spacing in style attributes is not !important
QW-ACT-R70akn7bnframe with negative tabindex has no interactive elements
QW-ACT-R71bisz58meta element has no refresh delay (no exception)
QW-ACT-R728a213cFirst focusable element is link to non-repeated content
QW-ACT-R733e12e1Block of repeated content is collapsible
QW-ACT-R74ye5d6eDocument has an instrument to move focus to non-repeated content
QW-ACT-R75cf77f2Bypass Blocks of Repeated Content
QW-ACT-R7609o5cgText has enhanced contrast
QW-ACT-R77in6db8ARIA required ID references exist

Implemented WCAG 2.1 Techniques

QualWeb Technique IDWCAG Technique IDWCAG Technique Name
QW-WCAG-T1H24Providing text alternatives for the area elements of image maps
QW-WCAG-T2H39Using caption elements to associate data table captions with data tables
QW-WCAG-T3H71Providing a description for groups of form controls using fieldset and legend elements
QW-WCAG-T4H73Using the summary attribute of the table element to give an overview of data tables
QW-WCAG-T5H36Using alt attributes on images used as submit buttons
QW-WCAG-T6SCR20Using both keyboard and other device-specific functions
QW-WCAG-T7H28Providing definitions for abbreviations by using the abbr element
QW-WCAG-T8F30Failure of Success Criterion 1.1.1 and 1.2.1 due to using text alternatives that are not alternatives
QW-WCAG-T9G141Organizing a page using headings
QW-WCAG-T10H2Combining adjacent image and text links for the same resource
QW-WCAG-T11H35Providing text alternatives on applet elements
QW-WCAG-T12F46Failure of Success Criterion 1.3.1 due to using th elements, caption elements, or non-empty summary attributes in layout tables
QW-WCAG-T13F47Failure of Success Criterion 2.2.2 due to using the blink element
QW-WCAG-T14H43Using id and headers attributes to associate data cells with header cells in data tables
QW-WCAG-T15H59Using the link element and navigation tools
QW-WCAG-T16H88Using HTML according to spec
QW-WCAG-T17G162Positioning labels to maximize predictability of relationships
QW-WCAG-T18H51Using table markup to present tabular information
QW-WCAG-T19H32Providing submit buttons
QW-WCAG-T20H33Supplementing link text with the title attribute
QW-WCAG-T21F89Failure of Success Criteria 2.4.4, 2.4.9 and 4.1.2 due to not providing an accessible name for an image which is the only content in a link
QW-WCAG-T22F52Failure of Success Criterion 3.2.1 and 3.2.5 due to opening a new window as soon as a new page is loaded
QW-WCAG-T23G1Adding a link at the top of each page that goes directly to the main content area
QW-WCAG-T24F55Failure of Success Criteria 2.1.1, 2.4.7, and 3.2.1 due to using script to remove focus when focus is received
QW-WCAG-T25H63Using the scope attribute to associate header cells and data cells in data tables
QW-WCAG-T26F59Failure of Success Criterion 4.1.2 due to using script to make div or span a user interface control in HTML without providing a role for the control
QW-WCAG-T27F88Failure of Success Criterion 1.4.8 due to using text that is justified (aligned to both the left and the right margins)
QW-WCAG-T28C12 C13 C14Using percent, em, names for font sizes
QW-WCAG-T29C19Specifying alignment either to the left or right in CSS
QW-WCAG-T30F4Failure of Success Criterion 2.2.2 due to using text-decoration:blink without a mechanism to stop it in less than five seconds
QW-WCAG-T31F24Failure of Success Criterion 1.4.3, 1.4.6 and 1.4.8 due to specifying foreground colors without specifying background colors or vice versa
QW-WCAG-T32H48Using ol, ul and dl for lists or groups of links

Evaluation problems

Sometimes, some webpages fail to evaluate, or the evaluation may take a really long time. Before creating an issue check the error.log file and verify that:

  • The URL is correct, and it uses http or https, or www, or both;
  • The webpage exists;
  • If using https, that the certificate is valid;
    • If you really want to evaluate the page with an invalid certificate, add "--ignore-certificate-errors" to the args in qualweb puppeteer launch options.
  • The webpage is not password protected;
  • The webpage is an HTML Document.

License

ISC

Versions

  • 0.7.32 - Updated ACT-Rules c487ae(R12), 6cfa84 (R13), 73f2c2 (R24), 46ca7f (R48) and 78fd32 (R68)
  • 0.7.31 - Removed dependencies on Wappalyzer module (continued)
  • 0.7.30 - Removed dependencies on Wappalyzer module
  • 0.7.29 - Fixed ACT-Rules bf051a (R5) and bc4a75 (R38)

Keywords

FAQs

Last updated on 04 May 2024

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc