Skip to content

Instantly share code, notes, and snippets.

@chapmanjacobd
Created October 29, 2023 05:32
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 chapmanjacobd/69075d77dae99c71a4195f01963830c3 to your computer and use it in GitHub Desktop.
Save chapmanjacobd/69075d77dae99c71a4195f01963830c3 to your computer and use it in GitHub Desktop.
Shadow DOM WebElement generator
def flatten_shadows(driver):
# Shadow DOM can go to hell !!
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
def get_all_elements(driver, elements):
for el in elements:
shadow_root = driver.execute_script("return arguments[0].shadowRoot", el)
if shadow_root:
shadow_els = driver.execute_script('return arguments[0].shadowRoot.querySelectorAll("*")', el)
yield from get_all_elements(driver, shadow_els)
else:
yield el
els = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "*")))
yield from get_all_elements(driver, els)
@chapmanjacobd
Copy link
Author

chapmanjacobd commented Oct 30, 2023

nb. it's much faster to just do:

html_text = driver.execute_script('function s(n=document.body){if(!n)return"";if(n.nodeType===Node.TEXT_NODE)return n.textContent.trim();if(n.nodeType!==Node.ELEMENT_NODE)return"";let t="";let r=n.cloneNode();n=n.shadowRoot||n;if(n.children.length)for(let o of n.childNodes)if(o.assignedNodes){if(o.assignedNodes()[0])t+=s(o.assignedNodes()[0]);else t+=o.innerHTML}else t+=s(o);else t=n.innerHTML;return r.innerHTML=t,r.outerHTML}; return s()')

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment