Skip to content

Commit 0a3cf33

Browse files
authored
feat: Add Frame#frame_element method (#524)
Faciliates easier retrieval of the `iframe` element that embeds the `window` (represented as a `Frame` object by Ferrum).
1 parent e6084e1 commit 0a3cf33

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

lib/ferrum/frame/dom.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,22 @@ def body
9595
evaluate("document.documentElement?.outerHTML") || ""
9696
end
9797

98+
#
99+
# Returns the element in which the window is embedded.
100+
#
101+
# @return [Node, nil]
102+
# The element in which the window is embedded.
103+
#
104+
# @example
105+
# browser.go_to("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")
106+
# frame = browser.frames.last
107+
# frame.frame_element # => [Node]
108+
# frame.parent.parent.parent.frame_element # => nil
109+
#
110+
def frame_element
111+
evaluate("window.frameElement")
112+
end
113+
98114
#
99115
# Finds nodes by using a XPath selector.
100116
#

spec/frame_spec.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,43 @@
205205
expect(page.doctype).to be_nil
206206
end
207207

208+
context "#frame_element" do
209+
it "gets the frame element" do
210+
page.go_to("/frames")
211+
212+
frame_element = page.at_xpath("//iframe")
213+
frame = frame_element.frame
214+
expect(frame.frame_element).to eq(frame_element)
215+
expect(frame.frame_element.frame_id).to eq frame.id
216+
expect(frame.frame_element.attribute(:src)).to end_with("/slow")
217+
end
218+
219+
it "returns nil if main frame" do
220+
page.go_to("/frames")
221+
222+
parent_frame = page.at_xpath("//iframe").frame.parent
223+
expect(parent_frame).to be_main
224+
expect(parent_frame.frame_element).to be_nil
225+
end
226+
227+
it "supports nested frames" do
228+
page.go_to("/frames")
229+
page.execute <<-JS
230+
document.body.innerHTML += "<iframe src='/nested_frame_test' name='outer_frame' style='padding:200px'>"
231+
JS
232+
page.network.wait_for_idle
233+
234+
outer_frame_element = page.at_xpath("//iframe[@name='outer_frame']")
235+
outer_frame = outer_frame_element.frame
236+
237+
inner_frame_element = outer_frame.at_xpath("//iframe")
238+
inner_frame = inner_frame_element.frame
239+
240+
expect(outer_frame.frame_element).to eq(outer_frame_element)
241+
expect(inner_frame.frame_element).to eq(inner_frame_element)
242+
end
243+
end
244+
208245
context "#xpath" do
209246
it "returns given nodes" do
210247
page.go_to("/with_js")

0 commit comments

Comments
 (0)