Module: Ferrum::Frame::DOM

Included in:
Ferrum::Frame
Defined in:
lib/ferrum/frame/dom.rb

Constant Summary collapse

SCRIPT_SRC_TAG =
"const script = document.createElement(\"script\");\nscript.src = arguments[0];\nscript.type = arguments[1];\nscript.onload = arguments[2];\ndocument.head.appendChild(script);\n"
SCRIPT_TEXT_TAG =
"const script = document.createElement(\"script\");\nscript.text = arguments[0];\nscript.type = arguments[1];\ndocument.head.appendChild(script);\narguments[2]();\n"
STYLE_TAG =
"const style = document.createElement(\"style\");\nstyle.type = \"text/css\";\nstyle.appendChild(document.createTextNode(arguments[0]));\ndocument.head.appendChild(style);\narguments[1]();\n"
"const link = document.createElement(\"link\");\nlink.rel = \"stylesheet\";\nlink.href = arguments[0];\nlink.onload = arguments[1];\ndocument.head.appendChild(link);\n"

Instance Method Summary collapse

Instance Method Details

#add_script_tag(url: nil, path: nil, content: nil, type: "text/javascript") ⇒ Object

Adds a ‘<script>` tag to the document.

Examples:

browser.add_script_tag(url: "http://example.com/stylesheet.css") # => true

Parameters:

  • url (String, nil) (defaults to: nil)
  • path (String, nil) (defaults to: nil)
  • content (String, nil) (defaults to: nil)
  • type (String) (defaults to: "text/javascript")


243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/ferrum/frame/dom.rb', line 243

def add_script_tag(url: nil, path: nil, content: nil, type: "text/javascript")
  expr, *args = if url
                  [SCRIPT_SRC_TAG, url, type]
                elsif path || content
                  if path
                    content = File.read(path)
                    content += "\n//# sourceURL=#{path}"
                  end
                  [SCRIPT_TEXT_TAG, content, type]
                end

  evaluate_async(expr, @page.timeout, *args)
end

#add_style_tag(url: nil, path: nil, content: nil) ⇒ Object

Adds a ‘<style>` tag to the document.

Examples:

browser.add_style_tag(content: "h1 { font-size: 40px; }") # => true

Parameters:

  • url (String, nil) (defaults to: nil)
  • path (String, nil) (defaults to: nil)
  • content (String, nil) (defaults to: nil)


269
270
271
272
273
274
275
276
277
278
279
280
281
# File 'lib/ferrum/frame/dom.rb', line 269

def add_style_tag(url: nil, path: nil, content: nil)
  expr, *args = if url
                  [LINK_TAG, url]
                elsif path || content
                  if path
                    content = File.read(path)
                    content += "\n//# sourceURL=#{path}"
                  end
                  [STYLE_TAG, content]
                end

  evaluate_async(expr, @page.timeout, *args)
end

#at_css(selector, within: nil) ⇒ Node?

Finds a node by using a CSS path selector.

Examples:

browser.go_to("https://github.com/")
browser.at_css("a[aria-label='Issues you created']") # => Node

Parameters:

  • selector (String)

    The CSS path selector.

  • within (Node, nil) (defaults to: nil)

    The parent node to search within.

Returns:

  • (Node, nil)

    The matching node.



218
219
220
221
222
223
224
225
226
227
# File 'lib/ferrum/frame/dom.rb', line 218

def at_css(selector, within: nil)
  expr = "    function(selector, within) {\n      within ||= document\n      return within.querySelector(selector);\n    }\n  JS\n\n  evaluate_func(expr, selector, within)\nend\n"

#at_xpath(selector, within: nil) ⇒ Node?

Finds a node by using a XPath selector.

Examples:

browser.go_to("https://github.com/")
browser.at_xpath("//a[@aria-label='Issues you created']") # => Node

Parameters:

  • selector (String)

    The XPath selector.

  • within (Node, nil) (defaults to: nil)

    The parent node to search within.

Returns:

  • (Node, nil)

    The matching node.



164
165
166
167
168
169
170
171
172
173
# File 'lib/ferrum/frame/dom.rb', line 164

def at_xpath(selector, within: nil)
  expr = "    function(selector, within) {\n      within ||= document\n      let xpath = document.evaluate(selector, within, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n      return xpath.snapshotItem(0);\n    }\n  JS\n  evaluate_func(expr, selector, within)\nend\n"

#bodyString

Returns current page’s html.

Examples:

browser.go_to("https://google.com/")
browser.body # => '<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"><head>...

Returns:

  • (String)

    The HTML source of the current page.



94
95
96
# File 'lib/ferrum/frame/dom.rb', line 94

def body
  evaluate("document.documentElement?.outerHTML") || ""
end

#css(selector, within: nil) ⇒ Array<Node>

Finds nodes by using a CSS path selector.

Examples:

browser.go_to("https://github.com/")
browser.css("a[aria-label='Issues you created']") # => [Node]

Parameters:

  • selector (String)

    The CSS path selector.

  • within (Node, nil) (defaults to: nil)

    The parent node to search within.

Returns:

  • (Array<Node>)

    The matching nodes.



191
192
193
194
195
196
197
198
199
200
# File 'lib/ferrum/frame/dom.rb', line 191

def css(selector, within: nil)
  expr = "    function(selector, within) {\n      within ||= document\n      return Array.from(within.querySelectorAll(selector));\n    }\n  JS\n\n  evaluate_func(expr, selector, within)\nend\n"

#current_titleString

Returns current top window title.

Examples:

browser.go_to("https://google.com/")
browser.current_title # => "Google"

Returns:

  • (String)

    The window’s current title.



76
77
78
# File 'lib/ferrum/frame/dom.rb', line 76

def current_title
  evaluate("window.top.document.title")
end

#current_urlString

Returns current top window ‘location href`.

Examples:

browser.go_to("https://google.com/")
browser.current_url # => "https://www.google.com/"

Returns:

  • (String)

    The window’s current URL.



62
63
64
# File 'lib/ferrum/frame/dom.rb', line 62

def current_url
  evaluate("window.top.location.href")
end

#doctypeObject



80
81
82
# File 'lib/ferrum/frame/dom.rb', line 80

def doctype
  evaluate("document.doctype && new XMLSerializer().serializeToString(document.doctype)")
end

#frame_elementNode?

Returns the element in which the window is embedded.

Examples:

browser.go_to("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
frame = browser.frames.last
frame.frame_element # => [Node]
frame.parent.parent.parent.frame_element # => nil

Returns:

  • (Node, nil)

    The element in which the window is embedded.



110
111
112
# File 'lib/ferrum/frame/dom.rb', line 110

def frame_element
  evaluate("window.frameElement")
end

#xpath(selector, within: nil) ⇒ Array<Node>

Finds nodes by using a XPath selector.

Examples:

browser.go_to("https://github.com/")
browser.xpath("//a[@aria-label='Issues you created']") # => [Node]

Parameters:

  • selector (String)

    The XPath selector.

  • within (Node, nil) (defaults to: nil)

    The parent node to search within.

Returns:

  • (Array<Node>)

    The matching nodes.



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/ferrum/frame/dom.rb', line 130

def xpath(selector, within: nil)
  expr = "    function(selector, within) {\n      let results = [];\n      within ||= document\n\n      let xpath = document.evaluate(selector, within, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n      for (let i = 0; i < xpath.snapshotLength; i++) {\n        results.push(xpath.snapshotItem(i));\n      }\n\n      return results;\n    }\n  JS\n\n  evaluate_func(expr, selector, within)\nend\n"