From 395d5fc165c97f0c297176eb69eb58d2510c938f Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Mon, 13 Feb 2023 10:58:55 -0700 Subject: [PATCH] fix: work with extremely large results (#667) * fix: work with extremely large partial results * fix tests * try again --- packages/playwright/package-lock.json | 4 +- packages/playwright/src/browser.ts | 9 ++- packages/playwright/src/index.ts | 20 +++++- packages/playwright/src/types.ts | 1 - .../playwright/tests/axe-playwright.spec.ts | 20 ++++++ packages/puppeteer/package-lock.json | 4 +- packages/puppeteer/src/axePuppeteer.ts | 21 +++++- packages/puppeteer/src/browser.ts | 13 ++-- packages/puppeteer/test/axePuppeteer.test.ts | 21 ++++++ packages/webdriverio/package-lock.json | 4 +- packages/webdriverio/src/test.ts | 18 +++++ packages/webdriverio/src/utils.ts | 41 +++++++++--- packages/webdriverjs/package-lock.json | 4 +- packages/webdriverjs/src/browser.ts | 65 +++++++++++++------ .../webdriverjs/tests/axe-webdriverjs.spec.ts | 19 ++++++ .../tests/example/package-lock.json | 37 +++++------ .../webdriverjs/tests/example/package.json | 2 +- 17 files changed, 232 insertions(+), 71 deletions(-) diff --git a/packages/playwright/package-lock.json b/packages/playwright/package-lock.json index de7b89e81b..ca6fb4139a 100644 --- a/packages/playwright/package-lock.json +++ b/packages/playwright/package-lock.json @@ -803,7 +803,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "license": "MPL-2.0" }, @@ -4290,7 +4290,7 @@ "integrity": "sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, diff --git a/packages/playwright/src/browser.ts b/packages/playwright/src/browser.ts index ebc06e3e09..435f82778a 100644 --- a/packages/playwright/src/browser.ts +++ b/packages/playwright/src/browser.ts @@ -14,6 +14,7 @@ import axeCore from 'axe-core'; declare global { interface Window { axe: typeof axeCore; + partialResults: string; } } export const axeGetFrameContexts = ({ @@ -36,8 +37,12 @@ export const axeRunPartial = ({ }; export const axeFinishRun = ({ - partialResults, options }: FinishRunParams): Promise => { - return window.axe.finishRun(partialResults, options); + return window.axe.finishRun(JSON.parse(window.partialResults), options); }; + +export function chunkResultString(chunk: string) { + window.partialResults ??= ''; + window.partialResults += chunk; +} diff --git a/packages/playwright/src/index.ts b/packages/playwright/src/index.ts index c4c4b23014..797eabb403 100644 --- a/packages/playwright/src/index.ts +++ b/packages/playwright/src/index.ts @@ -17,7 +17,8 @@ import { axeFinishRun, axeGetFrameContexts, axeRunPartial, - axeShadowSelect + axeShadowSelect, + chunkResultString } from './browser'; import AxePartialRunner from './AxePartialRunner'; @@ -283,9 +284,24 @@ export default class AxeBuilder { blankPage.evaluate(this.script()); blankPage.evaluate(await this.axeConfigure()); + + // evaluate has a size limit on the number of characters so we'll need + // to split partialResults into chunks if it exceeds that limit. + const sizeLimit = 60_000_000; + const partialString = JSON.stringify(partialResults); + + async function chunkResults(result: string): Promise { + const chunk = result.substring(0, sizeLimit); + await blankPage.evaluate(chunkResultString, chunk); + + if (result.length > sizeLimit) { + return await chunkResults(result.substr(sizeLimit)); + } + } + + await chunkResults(partialString); return await blankPage .evaluate(axeFinishRun, { - partialResults, options }) .finally(async () => { diff --git a/packages/playwright/src/types.ts b/packages/playwright/src/types.ts index f1606e9d57..5c1f27433d 100644 --- a/packages/playwright/src/types.ts +++ b/packages/playwright/src/types.ts @@ -39,6 +39,5 @@ export interface RunPartialParams { } export interface FinishRunParams { - partialResults: PartialResults[]; options: RunOptions; } diff --git a/packages/playwright/tests/axe-playwright.spec.ts b/packages/playwright/tests/axe-playwright.spec.ts index 026c3d32ba..22ab62c27d 100644 --- a/packages/playwright/tests/axe-playwright.spec.ts +++ b/packages/playwright/tests/axe-playwright.spec.ts @@ -35,6 +35,10 @@ describe('@axe-core/playwright', () => { path.join(externalPath, 'axe-force-legacy.js'), 'utf8' ); + const axeLargePartial = fs.readFileSync( + path.join(externalPath, 'axe-large-partial.js'), + 'utf8' + ); before(async () => { const app = express(); @@ -118,6 +122,22 @@ describe('@axe-core/playwright', () => { assert.isUndefined(err); }); + it('handles large results', async function () { + /* this test handles a large amount of partial results a timeout may be required */ + this.timeout(100_000); + const res = await await page.goto(`${addr}/external/index.html`); + + assert.equal(res?.status(), 200); + + const results = await new AxeBuilder({ + page, + axeSource: axeSource + axeLargePartial + }).analyze(); + + assert.lengthOf(results.passes, 1); + assert.equal(results.passes[0].id, 'duplicate-id'); + }); + it('reports frame-tested', async () => { const res = await page.goto(`${addr}/external/crash-parent.html`); const results = await new AxeBuilder({ diff --git a/packages/puppeteer/package-lock.json b/packages/puppeteer/package-lock.json index c58007b628..72e90f3cc0 100644 --- a/packages/puppeteer/package-lock.json +++ b/packages/puppeteer/package-lock.json @@ -987,7 +987,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "license": "MPL-2.0" }, @@ -4995,7 +4995,7 @@ "integrity": "sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, diff --git a/packages/puppeteer/src/axePuppeteer.ts b/packages/puppeteer/src/axePuppeteer.ts index d6ce5f3845..ff02e06c33 100644 --- a/packages/puppeteer/src/axePuppeteer.ts +++ b/packages/puppeteer/src/axePuppeteer.ts @@ -14,7 +14,8 @@ import { axeFinishRun, axeConfigure, axeRunLegacy, - axeRunPartialSupport + axeRunPartialSupport, + chunkResultString } from './browser'; import { AnalyzeCB, PartialResults } from './types'; import { iframeSelector, injectJS } from './legacy'; @@ -280,8 +281,24 @@ export class AxePuppeteer { ); await frameSourceInject(blankPage.mainFrame(), axeSource, config); + + // evaluate has a size limit on the number of characters so we'll need + // to split partialResults into chunks if it exceeds that limit. + const sizeLimit = 60_000_000; + const partialString = JSON.stringify(partialResults); + + async function chunkResults(result: string): Promise { + const chunk = result.substring(0, sizeLimit); + await blankPage.evaluate(chunkResultString, chunk); + + if (result.length > sizeLimit) { + return await chunkResults(result.substr(sizeLimit)); + } + } + + await chunkResults(partialString); return await blankPage - .evaluate(axeFinishRun, partialResults, axeOptions) + .evaluate(axeFinishRun, axeOptions) .finally(async () => { await blankPage.close(); }); diff --git a/packages/puppeteer/src/browser.ts b/packages/puppeteer/src/browser.ts index 261ebb09dc..3e56b34932 100644 --- a/packages/puppeteer/src/browser.ts +++ b/packages/puppeteer/src/browser.ts @@ -9,6 +9,7 @@ declare global { // tslint:disable-next-line:interface-name interface Window { axe: typeof Axe; + partialResults: string; } } @@ -48,11 +49,8 @@ export function axeRunPartial( return window.axe.runPartial(context, options); } -export function axeFinishRun( - partials: PartialResults, - options: Axe.RunOptions -): Promise { - return window.axe.finishRun(partials, options); +export function axeFinishRun(options: Axe.RunOptions): Promise { + return window.axe.finishRun(JSON.parse(window.partialResults), options); } // Defined at top-level to clarify that it can't capture variables from outer scope. @@ -62,3 +60,8 @@ export function axeRunLegacy( ): Promise { return window.axe.run(context || document, options || {}); } + +export function chunkResultString(chunk: string) { + window.partialResults ??= ''; + window.partialResults += chunk; +} diff --git a/packages/puppeteer/test/axePuppeteer.test.ts b/packages/puppeteer/test/axePuppeteer.test.ts index 8f8d2c80f8..5ce43f257e 100644 --- a/packages/puppeteer/test/axePuppeteer.test.ts +++ b/packages/puppeteer/test/axePuppeteer.test.ts @@ -33,6 +33,7 @@ describe('AxePuppeteer', function () { let axeSource: string; let axeCrasherSource: string; let axeForceLegacy: string; + let axeLargePartial: string; before(async () => { const axePath = require.resolve('axe-core'); @@ -46,6 +47,10 @@ describe('AxePuppeteer', function () { path.join(externalPath, 'axe-force-legacy.js'), 'utf8' ); + axeLargePartial = fs.readFileSync( + path.join(externalPath, 'axe-large-partial.js'), + 'utf8' + ); }); before(async () => { @@ -171,6 +176,22 @@ describe('AxePuppeteer', function () { assert.isUndefined(err); }); + it('handles large results', async function () { + /* this test handles a large amount of partial results a timeout may be required */ + this.timeout(50_000); + const res = await await page.goto(`${addr}/external/index.html`); + + assert.equal(res?.status(), 200); + + const results = await new AxePuppeteer( + page, + axeSource + axeLargePartial + ).analyze(); + + assert.lengthOf(results.passes, 1); + assert.equal(results.passes[0].id, 'duplicate-id'); + }); + it('returns the same results from runPartial as from legacy mode', async () => { const res = await page.goto(`${addr}/external/nested-iframes.html`); const legacyResults = await new AxePuppeteer( diff --git a/packages/webdriverio/package-lock.json b/packages/webdriverio/package-lock.json index de2ff33c5d..99a60eeeda 100644 --- a/packages/webdriverio/package-lock.json +++ b/packages/webdriverio/package-lock.json @@ -1230,7 +1230,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "license": "MPL-2.0" }, @@ -6346,7 +6346,7 @@ "integrity": "sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, diff --git a/packages/webdriverio/src/test.ts b/packages/webdriverio/src/test.ts index 736ffb8144..46b7ce6de7 100644 --- a/packages/webdriverio/src/test.ts +++ b/packages/webdriverio/src/test.ts @@ -85,6 +85,10 @@ describe('@axe-core/webdriverio', () => { path.join(axeTestFixtures, 'axe-force-legacy.js'), 'utf8' ); + const axeLargePartial = fs.readFileSync( + path.join(axeTestFixtures, 'axe-large-partial.js'), + 'utf8' + ); beforeEach(async () => { const app = express(); @@ -482,6 +486,20 @@ describe('@axe-core/webdriverio', () => { assert.isNull(error); }); + it('handles large results', async function () { + /* this test handles a large amount of partial results a timeout may be required */ + this.timeout(100_000); + await client.url(`${addr}/external/index.html`); + + const results = await new AxeBuilder({ + client, + axeSource: axeSource + axeLargePartial + }).analyze(); + + assert.lengthOf(results.passes, 1); + assert.equal(results.passes[0].id, 'duplicate-id'); + }); + it('returns correct results metadata', async () => { await client.url(`${addr}/index.html`); const title = await client.getTitle(); diff --git a/packages/webdriverio/src/utils.ts b/packages/webdriverio/src/utils.ts index 242a7678d8..9644c789a4 100644 --- a/packages/webdriverio/src/utils.ts +++ b/packages/webdriverio/src/utils.ts @@ -165,23 +165,48 @@ export const axeFinishRun = ( partialResults: PartialResults, options: RunOptions ): Promise => { - return promisify( - client - .executeAsync( - `var callback = arguments[arguments.length - 1]; + // executeScript has a size limit of ~32 million characters so we'll need + // to split partialResults into chunks if it exceeds that limit. + // since we need to stringify twice we need to leave room for the double escaped quotes + const sizeLimit = 15_000_000; + const partialString = JSON.stringify( + partialResults.map(res => JSON.stringify(res)) + ); + function chunkResults(result: string): Promise { + const chunk = JSON.stringify(result.substring(0, sizeLimit)); + return promisify( + client.execute( + ` + window.partialResults ??= ''; + window.partialResults += ${chunk}; + ` + ) + ).then(() => { + if (result.length > sizeLimit) { + return chunkResults(result.substr(sizeLimit)); + } + }); + } + + return chunkResults(partialString) + .then(() => { + return promisify( + client.executeAsync( + `var callback = arguments[arguments.length - 1]; ${axeSource}; window.axe.configure({ branding: { application: 'webdriverio' } }); - var partialResults = ${JSON.stringify(partialResults)}; + var partialResults = JSON.parse(window.partialResults).map(res => JSON.parse(res)); var options = ${JSON.stringify(options || {})}; window.axe.finishRun(partialResults, options).then(function (axeResults) { callback(JSON.stringify(axeResults)) });` - ) - .then((r: string) => deserialize(r)) - ); + ) + ); + }) + .then((r: string) => deserialize(r)); }; export const configureAllowedOrigins = ( diff --git a/packages/webdriverjs/package-lock.json b/packages/webdriverjs/package-lock.json index 60e7ab7da8..415e61a979 100644 --- a/packages/webdriverjs/package-lock.json +++ b/packages/webdriverjs/package-lock.json @@ -1010,7 +1010,7 @@ }, "node_modules/axe-test-fixtures": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "resolved": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "license": "MPL-2.0" }, @@ -5741,7 +5741,7 @@ "integrity": "sha512-lCZN5XRuOnpG4bpMq8v0khrWtUOn+i8lZSb6wHZH56ZfbIEv6XwJV84AAueh9/zi7qPVJ/E4yz6fmsiyOmXR4w==" }, "axe-test-fixtures": { - "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#464337d0fb0f3f051dbb8483ca30c559d91b1746", + "version": "git+ssh://git@github.com/dequelabs/axe-test-fixtures.git#09469d613991c108cd76f070839cc46f59668ebb", "dev": true, "from": "axe-test-fixtures@github:dequelabs/axe-test-fixtures#v1" }, diff --git a/packages/webdriverjs/src/browser.ts b/packages/webdriverjs/src/browser.ts index 0079a47757..637137b024 100644 --- a/packages/webdriverjs/src/browser.ts +++ b/packages/webdriverjs/src/browser.ts @@ -61,31 +61,54 @@ export function axeFinishRun( partialResults: Array, options: RunOptions ): Promise { + // executeScript has a size limit of ~32 million characters so we'll need + // to split partialResults into chunks if it exceeds that limit. + // since we need to stringify twice we need to leave room for the double escaped quotes + const sizeLimit = 15_000_000; + const partialString = JSON.stringify(partialResults); + + function chunkResults(result: string): Promise { + const chunk = JSON.stringify(result.substring(0, sizeLimit)); + return promisify( + driver.executeScript( + ` + window.partialResults ??= ''; + window.partialResults += ${chunk}; + ` + ) + ).then(() => { + if (result.length > sizeLimit) { + return chunkResults(result.substr(sizeLimit)); + } + }); + } + // Inject source and configuration a second time with a mock "this" context, // to make it impossible to sniff the global window.axe for results. - return promisify( - driver - .executeAsyncScript( - ` - var callback = arguments[arguments.length - 1]; + return chunkResults(partialString) + .then(() => { + return promisify( + driver.executeAsyncScript( + ` + var callback = arguments[arguments.length - 1]; - ${axeSource}; - window.axe.configure({ - branding: { application: 'webdriverjs' } - }); - var config = ${JSON.stringify(config)}; - if (config) { - window.axe.configure(config); - } + ${axeSource}; + window.axe.configure({ + branding: { application: 'webdriverjs' } + }); + var config = ${JSON.stringify(config)}; + if (config) { + window.axe.configure(config); + } - var partialResults = ${JSON.stringify(partialResults)}; - partialResults = partialResults.map(res => JSON.parse(res)); - var options = ${JSON.stringify(options || {})}; - window.axe.finishRun(partialResults, options).then(res => JSON.stringify(res)).then(callback); - ` - ) - .then(res => JSON.parse(res)) - ); + var partialResults = JSON.parse(window.partialResults).map(res => JSON.parse(res)); + var options = ${JSON.stringify(options || {})}; + window.axe.finishRun(partialResults, options).then(res => JSON.stringify(res)).then(callback); + ` + ) + ); + }) + .then(res => JSON.parse(res)); } export function axeGetFrameContext( diff --git a/packages/webdriverjs/tests/axe-webdriverjs.spec.ts b/packages/webdriverjs/tests/axe-webdriverjs.spec.ts index ebd316e4ab..1b19fc8cb8 100644 --- a/packages/webdriverjs/tests/axe-webdriverjs.spec.ts +++ b/packages/webdriverjs/tests/axe-webdriverjs.spec.ts @@ -27,6 +27,7 @@ describe('@axe-core/webdriverjs', () => { let axeSource: string; let axeCrasherSource: string; let axeForceLegacy: string; + let axeLargePartial: string; before(async () => { const axePath = require.resolve('axe-core'); @@ -40,6 +41,10 @@ describe('@axe-core/webdriverjs', () => { path.join(externalPath, 'axe-force-legacy.js'), 'utf8' ); + axeLargePartial = fs.readFileSync( + path.join(externalPath, 'axe-large-partial.js'), + 'utf8' + ); chromedriver.start([`--port=${port}`]); await delay(500); @@ -122,6 +127,20 @@ describe('@axe-core/webdriverjs', () => { assert.isUndefined(err); }); + it('handles large results', async function () { + /* this test handles a large amount of partial results a timeout may be required */ + this.timeout(60_000); + await driver.get(`${addr}/external/index.html`); + + const results = await new AxeBuilder( + driver, + axeSource + axeLargePartial + ).analyze(); + + assert.lengthOf(results.passes, 1); + assert.equal(results.passes[0].id, 'duplicate-id'); + }); + it('throws if axe errors out on the top window', async () => { await driver.get(`${addr}/external/crash.html`); const title = await driver.getTitle(); diff --git a/packages/webdriverjs/tests/example/package-lock.json b/packages/webdriverjs/tests/example/package-lock.json index ef76f46ac7..a4e2ca2305 100644 --- a/packages/webdriverjs/tests/example/package-lock.json +++ b/packages/webdriverjs/tests/example/package-lock.json @@ -14,7 +14,7 @@ "@types/node": "^18.8.4", "@types/selenium-webdriver": "^4.1.5", "chai": "^4.3.6", - "chromedriver": "^108.0.0", + "chromedriver": "^110.0.0", "express": "^4.18.2", "mocha": "^10.0.0", "selenium-webdriver": "^4.3.0", @@ -25,10 +25,10 @@ }, "../..": { "name": "@axe-core/webdriverjs", - "version": "4.5.2", + "version": "4.6.0", "license": "MPL-2.0", "dependencies": { - "axe-core": "^4.5.2" + "axe-core": "^4.6.1" }, "devDependencies": { "@types/chai": "^4.3.3", @@ -40,10 +40,10 @@ "@types/selenium-webdriver": "^4.1.5", "@types/sinon": "^10.0.13", "@types/test-listen": "^1.1.0", - "axe-test-fixtures": "github:dequelabs/axe-test-fixtures", + "axe-test-fixtures": "github:dequelabs/axe-test-fixtures#v1", "chai": "^4.3.6", "chaimocha": "^1.10.0", - "chromedriver": "^108.0.0", + "chromedriver": "^109.0.0", "delay": "^5.0.0", "express": "^4.18.2", "expresss": "^0.0.0", @@ -5115,14 +5115,14 @@ } }, "node_modules/chromedriver": { - "version": "108.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-108.0.0.tgz", - "integrity": "sha512-/kb0rb0dlC4RfXh2BOT7RV87K6d+It3VV5YXebLzO5a8t2knNffiTE23XPJQCH+l1xmgoW8/sOX/NB9irskvOQ==", + "version": "110.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-110.0.0.tgz", + "integrity": "sha512-Le6q8xrA/3fAt+g8qiN0YjsYxINIhQMC6wj9X3W5L77uN4NspEzklDrqYNwBcEVn7PcAEJ73nLlS7mTyZRspHA==", "dev": true, "hasInstallScript": true, "dependencies": { "@testim/chrome-version": "^1.1.3", - "axios": "^1.1.3", + "axios": "^1.2.1", "compare-versions": "^5.0.1", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.1", @@ -6933,11 +6933,11 @@ "@types/selenium-webdriver": "^4.1.5", "@types/sinon": "^10.0.13", "@types/test-listen": "^1.1.0", - "axe-core": "^4.5.2", - "axe-test-fixtures": "github:dequelabs/axe-test-fixtures", + "axe-core": "^4.6.1", + "axe-test-fixtures": "github:dequelabs/axe-test-fixtures#v1", "chai": "^4.3.6", "chaimocha": "^1.10.0", - "chromedriver": "^108.0.0", + "chromedriver": "^109.0.0", "delay": "^5.0.0", "express": "^4.18.2", "expresss": "^0.0.0", @@ -10172,11 +10172,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "axe-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", - "integrity": "sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw==" - }, "axios": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", @@ -10302,13 +10297,13 @@ } }, "chromedriver": { - "version": "108.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-108.0.0.tgz", - "integrity": "sha512-/kb0rb0dlC4RfXh2BOT7RV87K6d+It3VV5YXebLzO5a8t2knNffiTE23XPJQCH+l1xmgoW8/sOX/NB9irskvOQ==", + "version": "110.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-110.0.0.tgz", + "integrity": "sha512-Le6q8xrA/3fAt+g8qiN0YjsYxINIhQMC6wj9X3W5L77uN4NspEzklDrqYNwBcEVn7PcAEJ73nLlS7mTyZRspHA==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.3", - "axios": "^1.1.3", + "axios": "^1.2.1", "compare-versions": "^5.0.1", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.1", diff --git a/packages/webdriverjs/tests/example/package.json b/packages/webdriverjs/tests/example/package.json index 6873fb2269..5a93891f6d 100644 --- a/packages/webdriverjs/tests/example/package.json +++ b/packages/webdriverjs/tests/example/package.json @@ -11,7 +11,7 @@ "@types/node": "^18.8.4", "@types/selenium-webdriver": "^4.1.5", "chai": "^4.3.6", - "chromedriver": "^108.0.0", + "chromedriver": "^110.0.0", "express": "^4.18.2", "mocha": "^10.0.0", "selenium-webdriver": "^4.3.0",