diff --git a/lib/ferrum/frame.rb b/lib/ferrum/frame.rb index 5c3266c9..3e9d850c 100644 --- a/lib/ferrum/frame.rb +++ b/lib/ferrum/frame.rb @@ -94,6 +94,23 @@ def main? @parent_id.nil? end + # + # Returns the parent frame if this frame is nested in another one. + # + # @return [Frame, nil] + # + # @example + # browser.go_to("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe") + # frame = browser.frames.last + # frame.url # => "https://www.openstreetmap.org/export/embed.html?bbox=-0.004017949104309083%2C51.47612752641776%2C0.00030577182769775396%2C51.478569861898606&layer=mapnik" + # frame.parent.main? # => false + # frame.parent.parent.main? # => false + # frame.parent.parent.parent.main? # => true + # + def parent + @page.frame_by(id: @parent_id) if @parent_id + end + # # Sets a content of a given frame. # diff --git a/spec/frame_spec.rb b/spec/frame_spec.rb index a7f095ff..33e1b493 100644 --- a/spec/frame_spec.rb +++ b/spec/frame_spec.rb @@ -43,6 +43,12 @@ expect(opened_page.main_frame.url).to end_with("/frames") end + it "finds parent frame properly" do + page.go_to("/frames") + parent_frame = page.at_xpath("//iframe").frame.parent + expect(parent_frame.url).to end_with("/frames") + end + it "waits for the frame to load" do page.go_to page.execute <<-JS