diff --git a/lib/capybara/webkit/browser.rb b/lib/capybara/webkit/browser.rb index e2c966e..ed48bfe 100644 --- a/lib/capybara/webkit/browser.rb +++ b/lib/capybara/webkit/browser.rb @@ -83,7 +83,7 @@ module Capybara::Webkit def frame_focus(selector=nil) if selector.respond_to?(:base) - selector.base.invoke('focus') + selector.base.invoke("focus_frame") elsif selector.is_a? Fixnum command("FrameFocus", "", selector.to_s) elsif selector diff --git a/spec/integration/session_spec.rb b/spec/integration/session_spec.rb index 5014970..68a0ace 100644 --- a/spec/integration/session_spec.rb +++ b/spec/integration/session_spec.rb @@ -325,6 +325,16 @@ describe Capybara::Session do end end end + + it "can swap to the same frame multiple times" do + subject.visit("/") + subject.within_frame("a_frame") do + expect(subject).to have_content("Page A") + end + subject.within_frame("a_frame") do + expect(subject).to have_content("Page A") + end + end end context 'click tests' do diff --git a/src/Node.cpp b/src/Node.cpp index 1ffcfc5..baed90a 100644 --- a/src/Node.cpp +++ b/src/Node.cpp @@ -11,7 +11,7 @@ void Node::start() { QString functionName = functionArguments.takeFirst(); QString allowUnattached = functionArguments.takeFirst(); InvocationResult result = page()->invokeCapybaraFunction(functionName, allowUnattached == "true", functionArguments); - if (functionName == "focus") { + if (functionName == "focus_frame") { page()->setCurrentFrameParent(page()->currentFrame()->parentFrame()); } finish(&result); diff --git a/src/capybara.js b/src/capybara.js index 512898b..b77b654 100644 --- a/src/capybara.js +++ b/src/capybara.js @@ -357,6 +357,14 @@ Capybara = { this.getNode(index).focus(); }, + focus_frame: function(index) { + var elem = this.getNode(index); + if (elem === document.activeElement) { + elem.blur(); + } + elem.focus(); + }, + selectOption: function(index) { var optionNode = this.getNode(index); var selectNode = optionNode.parentNode;