#' @title CLASS shadow
#' @description Selenium plugin to manage multi level shadow DOM elements on web page.
#' @param RemoteDriver The shadow class takes a RSelenium RemoteDriver
#' @import methods
#' @import RSelenium
#' @keywords shadow
#' @exportClass shadow
#' @rdname shadow-class
#' @name shadow-class
#' @examples
#' for html tag <paper-tab title="Settings"> You can use this code in your framework to grab the paper-tab element Object.
#' library(RSelenium)
#' library(shadowr)
#' rD <- rsDriver(browser="firefox", port=4545L, verbose=F)
#' remDr <- rD[["client"]]
#' shadow_rd <- shadow(remDr)
#' element <- find_element(shadow_rd,"paper-tab[title='Settings']")
#' element <- find_element(shadow_rd,'con-stream-section[node-code="ENGINES"]')
#' 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(RSelenium)
#' library(shadowr)
#' rD <- rsDriver(browser="firefox", port=4545L, verbose=F)
#' remDr <- rD[["client"]]
#' shadow_rd <- shadow(remDr)
#' element <- find_element(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(RSelenium)
#' library(shadowr)
#' rD <- rsDriver(browser="firefox", port=4545L, verbose=F)
#' remDr <- rD[["client"]]
#' shadow_rd <- shadow(remDr)
#' element = find_element(shadow_rd,'properties-page#settingsPage>textarea#textarea')
#' element$getElementText()
setClass("shadow",
slots = c(
driver = "remoteDriver",
javascript_library = "character"
)
)
#' @rdname shadow-class
#' @export
setGeneric(name="inject_shadow_executor",
def=function(theObject,script, element)
{
standardGeneric("inject_shadow_executor")
}
)
setMethod(f="inject_shadow_executor",
signature=c("shadow","character", "missing"),
definition=function(theObject,script, element)
{
result <- theObject@driver$executeScript(script)
if(length(result)>0){
if(is.list(result[[1]])){
result <- lapply(result, function(x) RSelenium::webElement$new(as.character(x))$import(theObject@driver))
} else {
if(grepl("TRUE|FALSE", result)){
result <- as.logical(result)
} else{
result <- RSelenium::webElement$new(as.character(result))$import(theObject@driver)
}
}
}
return(result)
}
)
setMethod(f="inject_shadow_executor",
signature=c("shadow","character","webElement" ),
definition=function(theObject,script, element)
{
result <- theObject@driver$executeScript(script, args=list(element))
if(length(result)>0){
if(is.list(result[[1]])){
result <- lapply(result, function(x) RSelenium::webElement$new(as.character(x))$import(theObject@driver))
} else {
if(grepl("TRUE|FALSE", result)){
result <- as.logical(result)
} else{
result <- RSelenium::webElement$new(as.character(result))$import(theObject@driver)
}
}
}
return(result)
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="executor_get_object",
def=function(theObject,script, element)
{
standardGeneric("executor_get_object")
}
)
setMethod(f="executor_get_object",
signature=c("shadow","character", "missing"),
definition=function(theObject,script, element)
{
javascript <- paste0(theObject@javascript_library,script)
return(inject_shadow_executor(theObject,javascript))
}
)
setMethod(f="executor_get_object",
signature=c("shadow","character","webElement" ),
definition=function(theObject,script, element)
{
javascript <- paste0(theObject@javascript_library,script)
return(inject_shadow_executor(theObject,javascript,element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="find_element",
def=function(theObject,css_selector,parent)
{
standardGeneric("find_element")
}
)
setMethod(f="find_element",
signature=c("shadow","character","missing"),
definition=function(theObject,css_selector,parent)
{
command <- paste0("return getObject('", css_selector, "');")
element <- executor_get_object(theObject,command)
if(length(element$elementId)==0){
stop(paste("Element with CSS",css_selector, "is not in dom"))
}
if(!is_present(theObject,element)){
warning(paste("Element with CSS", css_selector, "is not visible on screen"))
}
return(element)
}
)
setMethod(f="find_element",
signature=c("shadow","character","webElement"),
definition=function(theObject,css_selector,parent)
{
command <- paste0("return getObject('", css_selector, "', arguments[0]);")
element <- executor_get_object(theObject,command,parent)
if(length(element$elementId)==0){
stop(paste("Element with CSS",css_selector, "is not in dom"))
}
if(!is_present(theObject,element)){
warning(paste("Element with CSS", css_selector, "is not visible on screen"))
}
return(element)
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="find_elements",
def=function(theObject,css_selector,parent)
{
standardGeneric("find_elements")
}
)
setMethod(f="find_elements",
signature=c("shadow","character","missing"),
definition=function(theObject,css_selector,parent)
{
command <- paste0("return getAllObject('", css_selector, "');")
element <- executor_get_object(theObject,command)
if(length(element)==0){
stop(paste("Element with CSS",css_selector, "is not in dom"))
}
return(element)
}
)
setMethod(f="find_elements",
signature=c("shadow","character","webElement"),
definition=function(theObject,css_selector,parent)
{
command <- paste0("return getAllObject('", css_selector, "', arguments[0]);")
element <- executor_get_object(theObject,command,parent)
if(length(element)==0){
stop(paste("Element with CSS",css_selector, "is not in dom"))
}
return(element)
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="get_shadow_element",
def=function(theObject,element,selector)
{
standardGeneric("get_shadow_element")
}
)
setMethod(f="get_shadow_element",
signature=c("shadow","webElement","character"),
definition=function(theObject,element,selector)
{
command <- paste0("return getShadowElement(arguments[0], '", selector, "');")
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="get_all_shadow_element",
def=function(theObject,element,selector)
{
standardGeneric("get_all_shadow_element")
}
)
setMethod(f="get_all_shadow_element",
signature=c("shadow","webElement","character"),
definition=function(theObject,element,selector)
{
command <- paste0("return getShadowElement(arguments[0], '", selector, "');")
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="get_parent_element",
def=function(theObject,element)
{
standardGeneric("get_parent_element")
}
)
setMethod(f="get_parent_element",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return getParentElement(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="get_child_elements",
def=function(theObject,element)
{
standardGeneric("get_child_elements")
}
)
setMethod(f="get_child_elements",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return getChildElements(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="get_sibling_element",
def=function(theObject,element,selector)
{
standardGeneric("get_sibling_element")
}
)
setMethod(f="get_sibling_element",
signature=c("shadow","webElement","character"),
definition=function(theObject,element,selector)
{
command <- paste("return getSiblingElement(arguments[0],'",selector,"');")
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="get_previous_sibling_element",
def=function(theObject,element)
{
standardGeneric("get_previous_sibling_element")
}
)
setMethod(f="get_previous_sibling_element",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return getPreviousSiblingElement(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="get_next_sibling_element",
def=function(theObject,element)
{
standardGeneric("get_next_sibling_element")
}
)
setMethod(f="get_next_sibling_element",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return getNextSiblingElement(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="scroll_to",
def=function(theObject,element)
{
standardGeneric("scroll_to")
}
)
setMethod(f="scroll_to",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return scrollTo(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="is_checked",
def=function(theObject,element)
{
standardGeneric("is_checked")
}
)
setMethod(f="is_checked",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return isChecked(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="is_disabled",
def=function(theObject,element)
{
standardGeneric("is_disabled")
}
)
setMethod(f="is_disabled",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return isDisabled(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="is_visible",
def=function(theObject,element)
{
standardGeneric("is_visible")
}
)
setMethod(f="is_visible",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
command <- "return isVisible(arguments[0]);"
return(executor_get_object(theObject,command, element))
}
)
#' @rdname shadow-class
#' @export
setGeneric(name="is_present",
def=function(theObject,element)
{
standardGeneric("is_present")
}
)
setMethod(f="is_present",
signature=c("shadow","webElement"),
definition=function(theObject,element)
{
present <- executor_get_object(theObject, "return isVisible(arguments[0]);", element)
print(paste("QA--QAQA",present))
return(present)
}
)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.