From 7e6a80d856118cceae598de5f91592d6e6c4dc39 Mon Sep 17 00:00:00 2001 From: yokra <53964890+yokra9@users.noreply.github.com> Date: Wed, 5 May 2021 20:04:14 +0900 Subject: [PATCH] fix(webdriverio): Recursively find (#238) Co-authored-by: Michael <45568605+michael-siek@users.noreply.github.com> Co-authored-by: Dylan Barrell --- packages/webdriverio/fixtures/frames/bar.html | 7 ++- packages/webdriverio/fixtures/frames/foo.html | 7 ++- .../fixtures/frames/recursive.html | 7 ++- .../webdriverio/fixtures/iframes/bar.html | 10 ++++ .../webdriverio/fixtures/iframes/baz.html | 9 ++++ .../webdriverio/fixtures/iframes/foo.html | 10 ++++ .../fixtures/iframes/recursive.html | 10 ++++ .../webdriverio/fixtures/nested-frames.html | 8 ++-- .../webdriverio/fixtures/nested-iframes.html | 11 +++++ .../fixtures/recursive-frames.html | 10 ++-- .../fixtures/recursive-iframes.html | 12 +++++ packages/webdriverio/src/index.ts | 22 ++++++++- packages/webdriverio/src/test.ts | 48 ++++++++++++++++--- 13 files changed, 140 insertions(+), 31 deletions(-) create mode 100644 packages/webdriverio/fixtures/iframes/bar.html create mode 100644 packages/webdriverio/fixtures/iframes/baz.html create mode 100644 packages/webdriverio/fixtures/iframes/foo.html create mode 100644 packages/webdriverio/fixtures/iframes/recursive.html create mode 100644 packages/webdriverio/fixtures/nested-iframes.html create mode 100644 packages/webdriverio/fixtures/recursive-iframes.html diff --git a/packages/webdriverio/fixtures/frames/bar.html b/packages/webdriverio/fixtures/frames/bar.html index 3b816e7b..f831db4a 100644 --- a/packages/webdriverio/fixtures/frames/bar.html +++ b/packages/webdriverio/fixtures/frames/bar.html @@ -3,8 +3,7 @@ Bar - -

Bar

- - + + + diff --git a/packages/webdriverio/fixtures/frames/foo.html b/packages/webdriverio/fixtures/frames/foo.html index 9ab66c76..d906571a 100644 --- a/packages/webdriverio/fixtures/frames/foo.html +++ b/packages/webdriverio/fixtures/frames/foo.html @@ -3,8 +3,7 @@ Foo - -

Foo

- - + + + diff --git a/packages/webdriverio/fixtures/frames/recursive.html b/packages/webdriverio/fixtures/frames/recursive.html index 3a3ce063..402f7f91 100644 --- a/packages/webdriverio/fixtures/frames/recursive.html +++ b/packages/webdriverio/fixtures/frames/recursive.html @@ -3,8 +3,7 @@ Recursive - -

Recursive

- - + + + diff --git a/packages/webdriverio/fixtures/iframes/bar.html b/packages/webdriverio/fixtures/iframes/bar.html new file mode 100644 index 00000000..594c0dc2 --- /dev/null +++ b/packages/webdriverio/fixtures/iframes/bar.html @@ -0,0 +1,10 @@ + + + + Bar + + +

Bar

+ + + diff --git a/packages/webdriverio/fixtures/iframes/baz.html b/packages/webdriverio/fixtures/iframes/baz.html new file mode 100644 index 00000000..b5f94320 --- /dev/null +++ b/packages/webdriverio/fixtures/iframes/baz.html @@ -0,0 +1,9 @@ + + + + Baz + + +

Baz

+ + diff --git a/packages/webdriverio/fixtures/iframes/foo.html b/packages/webdriverio/fixtures/iframes/foo.html new file mode 100644 index 00000000..86fe0d49 --- /dev/null +++ b/packages/webdriverio/fixtures/iframes/foo.html @@ -0,0 +1,10 @@ + + + + Foo + + +

Foo

+ + + diff --git a/packages/webdriverio/fixtures/iframes/recursive.html b/packages/webdriverio/fixtures/iframes/recursive.html new file mode 100644 index 00000000..20627835 --- /dev/null +++ b/packages/webdriverio/fixtures/iframes/recursive.html @@ -0,0 +1,10 @@ + + + + Recursive + + +

Recursive

+ + + diff --git a/packages/webdriverio/fixtures/nested-frames.html b/packages/webdriverio/fixtures/nested-frames.html index 6f6f75b4..c9dd981b 100644 --- a/packages/webdriverio/fixtures/nested-frames.html +++ b/packages/webdriverio/fixtures/nested-frames.html @@ -3,9 +3,7 @@ Nested Frames - -

This page has nested frames!

-


- - + + + diff --git a/packages/webdriverio/fixtures/nested-iframes.html b/packages/webdriverio/fixtures/nested-iframes.html new file mode 100644 index 00000000..3a7a1433 --- /dev/null +++ b/packages/webdriverio/fixtures/nested-iframes.html @@ -0,0 +1,11 @@ + + + + Nested Frames + + +

This page has nested frames!

+


+ + + diff --git a/packages/webdriverio/fixtures/recursive-frames.html b/packages/webdriverio/fixtures/recursive-frames.html index 6725009f..f413660d 100644 --- a/packages/webdriverio/fixtures/recursive-frames.html +++ b/packages/webdriverio/fixtures/recursive-frames.html @@ -3,10 +3,8 @@ Recursive Frames - -

This page has a weird recursive frams!

-


- - - + + + + diff --git a/packages/webdriverio/fixtures/recursive-iframes.html b/packages/webdriverio/fixtures/recursive-iframes.html new file mode 100644 index 00000000..42f9deb6 --- /dev/null +++ b/packages/webdriverio/fixtures/recursive-iframes.html @@ -0,0 +1,12 @@ + + + + Recursive Frames + + +

This page has a weird recursive frams!

+


+ + + + diff --git a/packages/webdriverio/src/index.ts b/packages/webdriverio/src/index.ts index 7c767828..04a849fa 100644 --- a/packages/webdriverio/src/index.ts +++ b/packages/webdriverio/src/index.ts @@ -196,7 +196,12 @@ export default class AxeBuilder { await this.setBrowsingContext(browsingContext); await this.client.execute(this.script); - const iframes = (await this.client.$$(this.iframeSelector())) || []; + const frames = + (await this.client.$$(this.frameSelector())) || + /* istanbul ignore next */ []; + const iframes = + frames.concat(await this.client.$$(this.iframeSelector())) || + /* istanbul ignore next */ []; if (!iframes.length) { return; } @@ -218,7 +223,7 @@ export default class AxeBuilder { } /** - * Get a CSS selector for retrieving child frames. + * Get a CSS selector for retrieving child iframes. * @returns {String} */ @@ -230,6 +235,19 @@ export default class AxeBuilder { return selector; } + /** + * Get a CSS selector for retrieving child frames. + * @returns {String} + */ + + private frameSelector(): string { + let selector = 'frame'; + for (const disableFrameSelector of this.disableFrameSelectors) { + selector += `:not(${disableFrameSelector})`; + } + return selector; + } + /** * Set browsing context - when `null` sets top level page as context * - https://webdriver.io/docs/api/webdriver.html#switchtoframe diff --git a/packages/webdriverio/src/test.ts b/packages/webdriverio/src/test.ts index 7342e41b..67141b3f 100644 --- a/packages/webdriverio/src/test.ts +++ b/packages/webdriverio/src/test.ts @@ -120,6 +120,26 @@ describe('@axe-core/webdriverio', () => { }); }); + describe('disableIframe', () => { + it('does not inject into disabled iframes', async () => { + await client.url(`${addr}/recursive-iframes.html`); + const executeSpy = sinon.spy(client, 'execute'); + await new AxeBuilder({ client }) + .disableFrame('[src*="recursive.html"]') + .analyze(); + assert.strictEqual(executeSpy.callCount, 2); + }); + + it('does not error when disabled iframe does not exist', async () => { + await client.url(`${addr}/recursive-iframes.html`); + const executeSpy = sinon.spy(client, 'execute'); + await new AxeBuilder({ client }) + .disableFrame('[src*="does-not-exist.html"]') + .analyze(); + assert.strictEqual(executeSpy.callCount, 5); + }); + }); + describe('disableFrame', () => { it('does not inject into disabled frames', async () => { await client.url(`${addr}/recursive-frames.html`); @@ -171,16 +191,16 @@ describe('@axe-core/webdriverio', () => { }); describe('iframe tests', () => { - it('injects into nested frames', async () => { - await client.url(`${addr}/nested-frames.html`); + it('injects into nested iframes', async () => { + await client.url(`${addr}/nested-iframes.html`); const executeSpy = sinon.spy(client, 'execute'); await new AxeBuilder({ client }).analyze(); /** * Ensure we called execute 4 times - * 1. nested-frames.html - * 2. foo.html - * 3. bar.html - * 4. baz.html + * 1. nested-iframes.html + * 2. iframes/foo.html + * 3. iframes/bar.html + * 4. iframes/baz.html */ assert.strictEqual(executeSpy.callCount, 4); }); @@ -192,6 +212,22 @@ describe('@axe-core/webdriverio', () => { }); }); + describe('frame tests', () => { + it('injects into nested frames', async () => { + await client.url(`${addr}/nested-frames.html`); + const executeSpy = sinon.spy(client, 'execute'); + await new AxeBuilder({ client }).analyze(); + /** + * Ensure we called execute 4 times + * 1. nested-frames.html + * 2. frames/foo.html + * 3. frames/bar.html + * 4. frames/baz.html + */ + assert.strictEqual(executeSpy.callCount, 4); + }); + }); + describe('logOrRethrowError', () => { it('log a StaleElementReference Error with `seleniumStack`', () => { const error = {