Skip to content

An R package enabling scraping of shadow DOM web elements, Shadowr integrates with Selenium to enhance web automation frameworks. It offers seamless handling of complex web components and custom HTML tags in shadow DOM environments, ideal for scraping and interacting with web pages built with technologies like Polymer.

Notifications You must be signed in to change notification settings

ricilandolt/shadowr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

shadowr

R-CMD-check codecov License CRAN_Status_Badge

Overview:

The shadowr package enables to use the shadow selenium plugin to manage multi level shadow DOM elements on web page.

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:

Depending on the method, either a RSelenium::WebElement or a boolean is returned. You can access the RSelenium::WebElement like you used to.

find_element(shadowObject, css_selector): Use this method if want single element from DOM

find_element(shadowObject, element, css_selector): Use this if you want to find a single elements from parent object

find_elements(shadowObject, css_selector): Use this if you want to find all elements from DOM

find_elements(shadowObject, element, css_selector): Use this if you want to find all elements from parent object

get_shadow_element(shadowObject, element,css_selector): Use this if you want to find a single element from parent DOM

get_all_shadow_element(shadowObject, element, css_selector): Use this if you want to find all elements from parent DOM

get_parent_element(shadowObject, element): Use this to get the parent element if web element

get_sibling_element(shadowObject, element, css_selector): Use this to get adjacent(sibling) element using css selector

get_previous_sibling_element(shadowObject, element): Use this to get previous adjacent(sibling) element

get_next_sibling_element(shadowObject, element): Use this to get next adjacent(sibling) element

scroll_to(shadowObject, element): Use this to scroll to web element

is_checked(shadowObject, element): Use this if you want to check if checkbox is selected

is_disabled(shadowObject, element): Use this if you want to check if element is disabled

is_visible(shadowObject, element): Use this if you want to find visibility of element

Installation

install.packages("shadowr")

Selector:

Examples:

for html tag <paper-tab title="Settings"> You can use this code in your framework to grab the paper-tab element Object.

library(shadowr)
library(RSelenium)
remDr <- RSelenium::remoteDriver(
remoteServerAddr = "host.docker.internal",
port = 4445 , browser = "chrome")
remDr$open(silent = TRUE)
remDr$navigate(url)
shadow_rd <- shadow(remDr)
element <- find_element(shadow_rd, 'paper-tab[title="Settings"]')
elements <- find_elements(shadow_rd, 'paper-tab[title="Settings"]')
element$getElementText()

for 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.

library(shadowr)
library(RSelenium)
remDr <- RSelenium::remoteDriver(
remoteServerAddr = "host.docker.internal",
port = 4445 , browser = "chrome")
remDr$open(silent = TRUE)
remDr$navigate(url)
shadow_rd <- shadow(remDr)
element <- find_element(shadow_rd, 'input[title="The name of the employee"]')
elements <- find_elements(shadow_rd, 'input[title="The name of the employee"]')
element$getElementText()

for html tag that resides under a shadow-root dom element

<properties-page id="settingsPage"> 
  <textarea id="textarea">
</properties-page>

You can use this code in your framework to grab the textarea element Object.

library(shadowr)
library(RSelenium)
remDr <- RSelenium::remoteDriver(
remoteServerAddr = "host.docker.internal",
port = 4445 , browser = "chrome")
remDr$open(silent = TRUE)
remDr$navigate(url)
shadow_rd <- shadow(remDr)
element <- find_element(shadow_rd, "properties-page#settingsPage>textarea#textarea")
element$getElementText()
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.

Documentation Link

About

An R package enabling scraping of shadow DOM web elements, Shadowr integrates with Selenium to enhance web automation frameworks. It offers seamless handling of complex web components and custom HTML tags in shadow DOM environments, ideal for scraping and interacting with web pages built with technologies like Polymer.

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published