diff --git a/src/js/Audit.js b/src/js/Audit.js index b6cda4f4..99013ba1 100644 --- a/src/js/Audit.js +++ b/src/js/Audit.js @@ -232,6 +232,7 @@ axs.Audit.getRulesCannotRun = function(opt_configuration) { * { * result, // @type {axs.constants.AuditResult} * elements, // @type {Array.} + * selectors, // @type {Array.} * rule // @type {axs.AuditRule} - data only (name, severity, code) * } */ diff --git a/src/js/AuditRule.js b/src/js/AuditRule.js index 6f1a0b12..2e85f9a7 100644 --- a/src/js/AuditRule.js +++ b/src/js/AuditRule.js @@ -217,12 +217,14 @@ axs.AuditRule.Result.prototype.update = function(auditResult, element) { var result = this; if (auditResult === axs.constants.AuditResult.FAIL) { var failingElements = result.elements || (result.elements = []); + var failingSelectors = result.selectors || (result.selectors = []); result.result = auditResult; // If FAIL then we change the result to FAIL no matter what it is if (this.maxResults && result.elements.length >= this.maxResults) { result.resultsTruncated = true; } else if (element) { // element should always be defined here but testing first avoids pushing undefined onto the array failingElements.push(element); + failingSelectors.push(axs.utils.getQuerySelectorText(element)) } } else if (auditResult === axs.constants.AuditResult.PASS) { if (!result.elements) diff --git a/test/js/audit-configuration-test.js b/test/js/audit-configuration-test.js index bdd359b9..1ad938ae 100644 --- a/test/js/audit-configuration-test.js +++ b/test/js/audit-configuration-test.js @@ -111,6 +111,32 @@ test('Configure audit rules to ignore', function() { }); +test("Check that selectors are returned in the results", function() { + var fixture = document.getElementById('qunit-fixture'); + var div = document.createElement('div'); + div.setAttribute('role', 'not-an-aria-role'); + fixture.appendChild(div); + var div2 = document.createElement('div'); + div2.setAttribute('role', 'also-not-an-aria-role'); + fixture.appendChild(div2); + var auditConfig = new axs.AuditConfiguration(); + auditConfig.auditRulesToRun = ['badAriaRole']; + auditConfig.scope = fixture; // limit scope to just fixture element + auditConfig.walkDom = false; + + var results = axs.Audit.run(auditConfig); + equal(results.length, 1); + equal(results[0].selectors.length, 2); + equal(results[0].selectors[0], '#qunit-fixture > DIV'); + equal(results[0].selectors[1], '#qunit-fixture > DIV:nth-of-type(2)'); + + auditConfig.maxResults = 1; + results = axs.Audit.run(auditConfig); + equal(results.length, 1); + equal(results[0].selectors.length, 1); + equal(results[0].selectors[0], '#qunit-fixture > DIV'); +}); + var __warnings = []; console.warn = function(msg) { __warnings.push(msg);