Skip to content

Instantly share code, notes, and snippets.

@Xotabu4
Last active February 1, 2021 23:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Xotabu4/e85cf6c8762732c034e03074c2033fb4 to your computer and use it in GitHub Desktop.
Save Xotabu4/e85cf6c8762732c034e03074c2033fb4 to your computer and use it in GitHub Desktop.
Searching inside shadow doms in protractor helper function
import { element, By } from 'protractor';
/**
* Find element inside nested shadow doms:
* shadow1(shadowDOM -> shadow2(shadowDOM -> shadow3(shadowDOM -> button)))
*
* @example
* new SomeElement(shadow$(['shadow1', 'shadow2', 'shadow3'], 'button')).click()
*
* @param shadowDomCssSelectors
* @param innerElement
*/
export function shadow$(shadowDomCssSelectors: string[], innerElementCssLocator: string) {
return element(
// eslint-disable-next-line prefer-arrow-callback
By.js(function (_shadowDomCssSelectors, _innerElementCssLocator) {
const findElementInShadowDom = (shadowRoot, cssSelector) => shadowRoot.querySelector(cssSelector);
const getDeepestShadowRoot = (shadowContainersInNestedOrder) => shadowContainersInNestedOrder.reduce(
(shadowRoot, shadowContainer) => findElementInShadowDom(shadowRoot, shadowContainer).shadowRoot,
document.querySelector(shadowContainersInNestedOrder.shift()).shadowRoot,
);
return findElementInShadowDom(
getDeepestShadowRoot(_shadowDomCssSelectors),
_innerElementCssLocator,
);
}, shadowDomCssSelectors, innerElementCssLocator),
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment