diff --git a/lib/capybara/cuprite/driver.rb b/lib/capybara/cuprite/driver.rb index cc8bef0..8eaed54 100644 --- a/lib/capybara/cuprite/driver.rb +++ b/lib/capybara/cuprite/driver.rb @@ -110,10 +110,14 @@ def switch_to_frame(locator) handle = case locator when Capybara::Node::Element locator.native.description["frameId"] + when Capybara::Cuprite::Node + locator.description["frameId"] when :parent, :top locator end + raise ArgumentError, "Unable to switch to frame from #{locator.class}" unless handle + browser.switch_to_frame(handle) end diff --git a/spec/features/session_spec.rb b/spec/features/session_spec.rb index 0589160..427e5e6 100644 --- a/spec/features/session_spec.rb +++ b/spec/features/session_spec.rb @@ -813,6 +813,27 @@ end end + it "supports selection by driver node" do + @session.visit "/cuprite/frames" + frame = @session.driver.find_css("iframe[name]").first + + @session.driver.switch_to_frame(frame) + expect(@session.driver.frame_url).to end_with("/cuprite/slow") + ensure + @session.driver.switch_to_frame(:top) + end + + it "rejects driver nodes without frame ids" do + @session.visit "/cuprite/simple" + node = @session.driver.find_css("body").first + + expect do + @session.driver.switch_to_frame(node) + end.to raise_error(ArgumentError, /Unable to switch to frame/) + + expect(@session.driver.frame_url).to end_with("/cuprite/simple") + end + it "supports selection by element without name or id" do @session.visit "/cuprite/frames" frame = @session.find(:css, "iframe:not([name]):not([id])")