github.com/web-platform-tests/wpt.fyi@v0.0.0-20240530210107-70cf978996f1/webdriver/util.js (about) 1 const puppeteer = require('puppeteer'); 2 3 /** 4 * Pierces shadow DOM in the page for the given selector. 5 * @param {puppeteer.Page} page 6 * @param {puppeteer.ElementHandle} root Root element to query. If null, page is 7 * used. 8 * @param {Array<string>} selectors Selectors in each level of shadow DOM. 9 * @returns {?puppeteer.ElementHandle} 10 */ 11 const shadowQuery = async function(page, root, ...selectors) { 12 if (!selectors || !selectors.length) { 13 return; 14 } 15 const [first, ...others] = selectors; 16 let result = await (root || page).$(first); 17 for (const next of others) { 18 result = await page.evaluateHandle( 19 (e, selector) => e.shadowRoot.querySelector(selector), 20 result, 21 next); 22 } 23 return result; 24 } 25 exports.shadowQuery = shadowQuery; 26 27 /** 28 * Pierces shadow DOM in the given element for the given selector. 29 * @param {puppeteer.ElementHandle} element 30 * @param {string} selector Selector for the shadow DOM 31 * @returns {Array<puppeteer.ElementHandle>} 32 */ 33 const shadowQueryAll = async function(page, element, selector) { 34 return await page.evaluateHandle( 35 (e, selector) => e.shadowRoot.querySelectorAll(selector), 36 element, 37 selector); 38 } 39 exports.shadowQueryAll = shadowQueryAll; 40 41