diff --git a/.travis.yml b/.travis.yml index 82c747e..5bec8e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,18 +25,18 @@ addons: matrix: include: - rvm: 1.9.3 - gemfile: gemfiles/2.6.gemfile + gemfile: gemfiles/2.7.gemfile env: QMAKE=/usr/lib/x86_64-linux-gnu/qt4/bin/qmake - rvm: 1.9.3 - gemfile: gemfiles/2.5.gemfile + gemfile: gemfiles/2.11.gemfile env: QMAKE=/usr/lib/x86_64-linux-gnu/qt4/bin/qmake - rvm: 2.3.1 gemfile: gemfiles/master.gemfile allow_failures: - gemfile: gemfiles/master.gemfile gemfile: - - gemfiles/2.6.gemfile - - gemfiles/2.5.gemfile + - gemfiles/2.7.gemfile + - gemfiles/2.11.gemfile before_install: - gem install bundler install: bundle diff --git a/Appraisals b/Appraisals index 1597718..ad81039 100644 --- a/Appraisals +++ b/Appraisals @@ -1,9 +1,13 @@ -appraise "2.6" do - gem "capybara", "~> 2.6.0" -end - appraise "2.7" do gem "capybara", "~> 2.7.0" + gem 'addressable', '< 2.5.0', :platforms=>[:ruby_19, :jruby_19] # 2.5 requires public_suffix which requires ruby 2.0 + gem 'nokogiri', '< 1.7.0', :platforms=>[:ruby_19, :jruby_19] # 1.7.0 requires ruby 2.1+ +end + +appraise "2.11" do + gem "capybara", "~> 2.11.0" + gem 'addressable', '< 2.5.0', :platforms=>[:ruby_19, :jruby_19] # 2.5 requires public_suffix which requires ruby 2.0 + gem 'nokogiri', '< 1.7.0', :platforms=>[:ruby_19, :jruby_19] # 1.7.0 requires ruby 2.1+ end appraise "master" do diff --git a/Gemfile.lock b/Gemfile.lock index 779b8e6..3056141 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,70 +2,63 @@ PATH remote: . specs: capybara-webkit (1.11.1) - capybara (>= 2.3.0, < 2.8.0) + capybara (>= 2.3.0, < 2.13.0) json GEM remote: https://rubygems.org/ specs: - addressable (2.3.6) - appraisal (0.4.0) + addressable (2.5.0) + public_suffix (~> 2.0, >= 2.0.2) + appraisal (0.4.1) bundler rake - capybara (2.5.0) + capybara (2.11.0) + addressable mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) rack-test (>= 0.5.4) xpath (~> 2.0) - childprocess (0.5.5) - ffi (~> 1.0, >= 1.0.11) - diff-lcs (1.2.4) - ffi (1.9.8) - ffi (1.9.8-java) - ffi (1.9.8-x86-mingw32) + diff-lcs (1.2.5) + ffi (1.9.14-java) json (1.8.3) - launchy (2.4.2) + json (1.8.3-java) + launchy (2.4.3) addressable (~> 2.3) - launchy (2.4.2-java) + launchy (2.4.3-java) addressable (~> 2.3) spoon (~> 0.0.1) - mime-types (2.6.1) - mini_magick (3.2.1) - subexec (~> 0.0.4) - mini_portile2 (2.0.0) - multi_json (1.11.0) - nokogiri (1.6.7.2) - mini_portile2 (~> 2.0.0.rc2) - rack (1.6.4) - rack-protection (1.3.2) + mime-types (2.99.3) + mini_magick (4.6.0) + mini_portile2 (2.1.0) + nokogiri (1.7.0.1) + mini_portile2 (~> 2.1.0) + nokogiri (1.7.0.1-java) + nokogiri (1.7.0.1-x86-mingw32) + mini_portile2 (~> 2.1.0) + public_suffix (2.0.5) + rack (1.6.5) + rack-protection (1.5.3) rack rack-test (0.6.3) rack (>= 1.0) - rake (0.9.2) - rspec (2.14.1) - rspec-core (~> 2.14.0) - rspec-expectations (~> 2.14.0) - rspec-mocks (~> 2.14.0) - rspec-core (2.14.4) - rspec-expectations (2.14.1) + rake (11.3.0) + rspec (2.99.0) + rspec-core (~> 2.99.0) + rspec-expectations (~> 2.99.0) + rspec-mocks (~> 2.99.0) + rspec-core (2.99.2) + rspec-expectations (2.99.2) diff-lcs (>= 1.1.3, < 2.0) - rspec-mocks (2.14.3) - rubyzip (1.1.7) - selenium-webdriver (2.45.0) - childprocess (~> 0.5) - multi_json (~> 1.0) - rubyzip (~> 1.0) - websocket (~> 1.0) - sinatra (1.3.5) - rack (~> 1.4) - rack-protection (~> 1.3) - tilt (~> 1.3, >= 1.3.3) - spoon (0.0.4) + rspec-mocks (2.99.4) + sinatra (1.4.7) + rack (~> 1.5) + rack-protection (~> 1.4) + tilt (>= 1.3, < 3) + spoon (0.0.6) ffi - subexec (0.0.4) - tilt (1.3.3) - websocket (1.2.1) + tilt (2.0.5) xpath (2.0.0) nokogiri (~> 1.3) @@ -77,13 +70,13 @@ PLATFORMS DEPENDENCIES appraisal (~> 0.4.0) capybara-webkit! + json (< 2.0) launchy mime-types (< 3.0) mini_magick - rake - rspec (~> 2.14.0) - selenium-webdriver + rake (< 12.0.0) + rspec (~> 2.14) sinatra BUNDLED WITH - 1.11.2 + 1.13.6 diff --git a/capybara-webkit.gemspec b/capybara-webkit.gemspec index ffaf6a1..45e5720 100644 --- a/capybara-webkit.gemspec +++ b/capybara-webkit.gemspec @@ -21,16 +21,15 @@ Gem::Specification.new do |s| s.requirements << "Qt >= 4.8" - s.add_runtime_dependency("capybara", ">= 2.3.0", "< 2.8.0") + s.add_runtime_dependency("capybara", ">= 2.3.0", "< 2.13.0") s.add_runtime_dependency("json") - s.add_development_dependency("rspec", "~> 2.14.0") + s.add_development_dependency("rspec", "~> 2.14") # Sinatra is used by Capybara's TestApp s.add_development_dependency("sinatra") s.add_development_dependency("mini_magick") - s.add_development_dependency("rake") + s.add_development_dependency("rake", "< 12.0.0") s.add_development_dependency("appraisal", "~> 0.4.0") - s.add_development_dependency("selenium-webdriver") s.add_development_dependency("launchy") end diff --git a/gemfiles/2.6.gemfile b/gemfiles/2.11.gemfile similarity index 52% rename from gemfiles/2.6.gemfile rename to gemfiles/2.11.gemfile index fbd8399..625fb3f 100644 --- a/gemfiles/2.6.gemfile +++ b/gemfiles/2.11.gemfile @@ -4,7 +4,8 @@ source "https://rubygems.org" gem "mime-types", "< 3.0", :platforms=>[:ruby_19, :jruby_19] gem "json", "< 2.0", :platforms=>[:ruby_19, :jruby_19] - -gem "capybara", "~> 2.6.0" +gem "capybara", "~> 2.11.0" +gem "addressable", "< 2.5.0", :platforms=>[:ruby_19, :jruby_19] +gem "nokogiri", "< 1.7.0", :platforms=>[:ruby_19, :jruby_19] gemspec :path=>"../" \ No newline at end of file diff --git a/gemfiles/2.7.gemfile b/gemfiles/2.7.gemfile index 19fbf8e..12bcf40 100644 --- a/gemfiles/2.7.gemfile +++ b/gemfiles/2.7.gemfile @@ -4,7 +4,8 @@ source "https://rubygems.org" gem "mime-types", "< 3.0", :platforms=>[:ruby_19, :jruby_19] gem "json", "< 2.0", :platforms=>[:ruby_19, :jruby_19] - gem "capybara", "~> 2.7.0" +gem "addressable", "< 2.5.0", :platforms=>[:ruby_19, :jruby_19] +gem "nokogiri", "< 1.7.0", :platforms=>[:ruby_19, :jruby_19] gemspec :path=>"../" \ No newline at end of file diff --git a/gemfiles/master.gemfile b/gemfiles/master.gemfile index 4765268..4c50ac0 100644 --- a/gemfiles/master.gemfile +++ b/gemfiles/master.gemfile @@ -4,7 +4,6 @@ source "https://rubygems.org" gem "mime-types", "< 3.0", :platforms=>[:ruby_19, :jruby_19] gem "json", "< 2.0", :platforms=>[:ruby_19, :jruby_19] - gem "capybara", :github=>"jnicklas/capybara" gemspec :path=>"../" \ No newline at end of file diff --git a/lib/capybara/webkit/browser.rb b/lib/capybara/webkit/browser.rb index dc14533..9aab4b5 100644 --- a/lib/capybara/webkit/browser.rb +++ b/lib/capybara/webkit/browser.rb @@ -223,13 +223,13 @@ https://github.com/thoughtbot/capybara-webkit/wiki/Reporting-Crashes MESSAGE end - def evaluate_script(script) - json = command('Evaluate', script) + def evaluate_script(script, *args) + json = command('Evaluate', script, args.to_json) JSON.parse("[#{json}]").first end - def execute_script(script) - command('Execute', script) + def execute_script(script, *args) + command('Execute', script, args.to_json) end def render(path, width, height) diff --git a/lib/capybara/webkit/driver.rb b/lib/capybara/webkit/driver.rb index 0987afb..b16d4e6 100644 --- a/lib/capybara/webkit/driver.rb +++ b/lib/capybara/webkit/driver.rb @@ -76,13 +76,18 @@ module Capybara::Webkit @browser.title end - def execute_script(script) - value = @browser.execute_script script - value.empty? ? nil : value + def execute_script(script, *args) + value = @browser.execute_script(script, *encode_args(args)) + + if value.empty? + nil + else + value + end end - def evaluate_script(script) - @browser.evaluate_script script + def evaluate_script(script, *args) + @browser.evaluate_script(script, *encode_args(args)) end def console_messages @@ -144,6 +149,21 @@ module Capybara::Webkit end end + def switch_to_frame(frame) + case frame + when :top + begin + loop { @browser.frame_focus } + rescue Capybara::Webkit::InvalidResponseError => e + raise unless e.message =~ /Already at parent frame/ + end + when :parent + @browser.frame_focus + else + @browser.frame_focus(frame) + end + end + def within_window(selector) current_window = current_window_handle switch_to_window(selector) @@ -391,5 +411,15 @@ module Capybara::Webkit "This option is global and can be configured once" \ " (not in a `before` or `setup` block)." end + + def encode_args(args) + args.map do |arg| + if arg.is_a?(Capybara::Webkit::Node) + { ELEMENT: arg.native }.to_json + else + arg.to_json + end + end + end end end diff --git a/lib/capybara/webkit/node.rb b/lib/capybara/webkit/node.rb index 2f88f05..11619bc 100644 --- a/lib/capybara/webkit/node.rb +++ b/lib/capybara/webkit/node.rb @@ -114,11 +114,13 @@ module Capybara::Webkit end def disabled? - if %w(option optgroup).include? tag_name - self['disabled'] || find_xpath("parent::*")[0].disabled? - else - self['disabled'] - end + xpath = "parent::optgroup[@disabled] | " \ + "ancestor::select[@disabled] | " \ + "parent::fieldset[@disabled] | " \ + "ancestor::*[not(self::legend) or " \ + "preceding-sibling::legend][parent::fieldset[@disabled]]" + + self["disabled"] || !find_xpath(xpath).empty? end def path diff --git a/spec/driver_spec.rb b/spec/driver_spec.rb index c6faa6e..1ac9462 100644 --- a/spec/driver_spec.rb +++ b/spec/driver_spec.rb @@ -62,12 +62,25 @@ describe Capybara::Webkit::Driver do