Package: pyshadow
pyshadowSelenium plugin to manage multi level shadow DOM elements on web page.Shadow DOM:Shadow DOM is a web standard that offers component style and markup encapsulation. It is a critically important piece of the Web Components story as it ensures that a component will work in any environment even if other CSS or JavaScript is at play on the page.Custom HTML Tags:Custom HTML tags can't be directly identified with selenium tools. Using this plugin you can handle any custom HTML tags.Problem Statement:You have already developed your web-based automation framework in java selenium. Your frontend application uses Polymer that uses shadow dom. Selenium doesn't provide any way to deal with shadow-dom elements.Your application page contains custom HTML tags that can't be identified directly using selenium.Solution:You can use this plugin by adding jar file or by including maven dependency in your java selenium project.How it works:Methods:find_element(str css_selector): use this method if want single element from DOMfind_elements(str css_selector): use this if you want to find all elements from DOMfind_element(object parent, str css_selector): use this if you want to find a single elements from parent object DOMfind_elements(object parent, str css_selector): use this if you want to find all elements from parent object DOMset_implicit_wait(int seconds): use this method for implicit waitset_explicit_wait(int seconds, int polling_time) raise Exception: use this method for explicit waitget_shadow_element(object parent,str css_selector): use this if you want to find a single element from parent DOMget_all_shadow_element(object parent, str css_selector): use this if you want to find all elements from parent DOMget_parent_element(object element): use this to get the parent element if web element.get_child_elements(object parent): use this to get all the child elements of parent element.get_sibling_elements(object element): use this to get all adjacent (sibling) elements.get_sibling_element(object element, str css_selector): use this to get adjacent(sibling) element using css selector.get_next_sibling_element(object element): use this to get next adjacent(sibling) element.get_previous_sibling_element(object element): use this to get previous adjacent(sibling) element..is_visible(object element): use this if you want to find visibility of elementis_checked(object element): use this if you want to check if checkbox is selectedis_disabled(object element): use this if you want to check if element is disabledget_attribute(object element, str attribute): use this if you want to get attribute like aria-selected and other custom attributes of elements.select_checkbox(str label): use this to select checkbox element using label.select_checkbox(object parent, str label): use this to select checkbox element using label.select_radio(str label): use this to select radio element using label.select_radio(object parent, str label): use this to select radio element from parent DOM using label.select_dropdown(str label): use this to select dropdown list item using label (use this if only one dropdown is present or loaded on UI).select_dropdown(object parent, str label): use this to select dropdown list item from parent DOM using label.scroll_to(object element): use this to scroll to web element.How to use this plugin:You will have to install this plugin from PyPi.Mavenpip install pyshadowSelector:Examples:for html tag<paper-tab title="Settings">You can use this code in your framework to grab the paper-tab element Object.fromseleniumimportwebdriverfrompyshadow.mainimportShadowfromwebdriver_manager.chromeimportChromeDriverManagerdriver=webdriver.Chrome(ChromeDriverManager().install())shadow=Shadow(driver)element=shadow.find_element("paper-tab[title='Settings']")elements=shadow.find_elements("paper-tab[title='Settings']")text=element.textfor html tag that resides under a shadow-root dom element<input title="The name of the employee">You can use this code in your framework to grab the paper-tab element Object.fromseleniumimportwebdriverfrompyshadow.mainimportShadowfromwebdriver_manager.chromeimportChromeDriverManagerdriver=webdriver.Chrome(ChromeDriverManager().install())shadow=Shadow(driver)element=shadow.find_element("input[title='The name of the employee']")text=element.textfor html tag that resides under a shadow-root dom element<properties-pageid="settingsPage"><textareaid="textarea"></properties-page>You can use this code in your framework to grab the textarea element Object.fromseleniumimportwebdriverfrompyshadow.mainimportShadowfromwebdriver_manager.chromeimportChromeDriverManagerdriver=webdriver.Chrome(ChromeDriverManager().install())shadow=Shadow(driver)element=shadow.find_element("properties-page#settingsPage>textarea#textarea")text=element.textWait: Implicit and ExplicitIf you want to use wait to synchronize your scripts then you should use the implicit or explicit wait feature.For Implicit wait, you can useshadow.set_implicit_wait(int seconds)method.For Explicit wait, you can useshadow.set_explicit_wait(int seconds, int pollingTime)method.In Implicit wait, the driver will wait for at least n seconds as set inshadow.set_implicit_wait(n).In Explicit wait, the driver will wait for at max n seconds as set inshadow.set_implicit_wait(n,m). In between driver will check for presence of WebElement every m seconds.Note: > is used to combine multi level dom structure. So you can combine 5 levels of dom. If you want some more level modify the script and ready to rock.DocumentationLink