From d3d57d7ff0434049d10248b2635988e31a4db51b Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Fri, 6 Jul 2018 08:56:40 -0700 Subject: [PATCH] `within_frame` should allow no arguments when theres only one frame in scope --- lib/capybara/session.rb | 4 ++++ .../spec/session/frame/within_frame_spec.rb | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index d140e1ae..3bde4f7a 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -397,6 +397,8 @@ module Capybara scopes.slice!(idx..-1) driver.switch_to_frame(:top) end + else + raise ArgumentError, "You must provide a frame element, :parent, or :top when calling switch_to_frame" end end @@ -846,6 +848,8 @@ module Capybara end def _find_frame(*args) + return find(:frame) if args.length.zero? + case args[0] when Capybara::Node::Element args[0] diff --git a/lib/capybara/spec/session/frame/within_frame_spec.rb b/lib/capybara/spec/session/frame/within_frame_spec.rb index 9eb3a7d9..872a9965 100644 --- a/lib/capybara/spec/session/frame/within_frame_spec.rb +++ b/lib/capybara/spec/session/frame/within_frame_spec.rb @@ -54,6 +54,20 @@ Capybara::SpecHelper.spec '#within_frame', requires: [:frames] do end end + it "should default to the :frame selector when no options passed" do + container = @session.find(:css, '#divInMainWindow') + @session.within(container) do + # Ensure only one frame in scope + @session.within_frame do + expect(@session).to have_css('body#parentBody') + end + end + expect { + # Multiple frames in scope here + @session.within_frame do; end + }.to raise_error Capybara::Ambiguous + end + it "should find multiple nested frames" do @session.within_frame 'parentFrame' do @session.within_frame 'childFrame' do