diff --git a/lib/capybara/node/finders.rb b/lib/capybara/node/finders.rb index 6ef1de870..a198f2b3a 100644 --- a/lib/capybara/node/finders.rb +++ b/lib/capybara/node/finders.rb @@ -145,7 +145,12 @@ def first(*args) def resolve_query(query, exact=nil) elements = synchronize do - base.find(query.xpath(exact)).map do |node| + # base.find(query.xpath(exact)).map do |node| + if query.selector.name==:css && base.respond_to?(:find_css) + base.find_css(query.locator) + else + base.find(query.xpath(exact)) + end.map do |node| Capybara::Node::Element.new(session, node, self, query) end end diff --git a/lib/capybara/query.rb b/lib/capybara/query.rb index 67b5e74ad..88ec0031f 100644 --- a/lib/capybara/query.rb +++ b/lib/capybara/query.rb @@ -85,7 +85,6 @@ def match def xpath(exact=nil) exact = @options[:exact] if exact == nil - if @xpath.respond_to?(:to_xpath) and exact @xpath.to_xpath(:exact) else diff --git a/lib/capybara/rack_test/browser.rb b/lib/capybara/rack_test/browser.rb index 53510e40c..7f756350a 100644 --- a/lib/capybara/rack_test/browser.rb +++ b/lib/capybara/rack_test/browser.rb @@ -80,8 +80,19 @@ def dom @dom ||= Nokogiri::HTML(html) end - def find(selector) - dom.xpath(selector).map { |node| Capybara::RackTest::Node.new(self, node) } + def find(selector, type=:xpath) + if type==:css + dom.css(selector, Class.new { + def disabled list + list.find_all { |node| node.has_attribute? 'disabled' } + end + def enabled list + list.find_all { |node| !node.has_attribute? 'disabled' } + end + }.new) + else + dom.xpath(selector) + end.map { |node| Capybara::RackTest::Node.new(self, node) } end def html diff --git a/lib/capybara/rack_test/driver.rb b/lib/capybara/rack_test/driver.rb index 7dc841201..8e13635fb 100644 --- a/lib/capybara/rack_test/driver.rb +++ b/lib/capybara/rack_test/driver.rb @@ -65,6 +65,10 @@ def status_code def find(selector) browser.find(selector) end + + def find_css(selector) + browser.find(selector, :css) + end def html browser.html diff --git a/lib/capybara/selenium/driver.rb b/lib/capybara/selenium/driver.rb index a620bbf66..76c00687b 100644 --- a/lib/capybara/selenium/driver.rb +++ b/lib/capybara/selenium/driver.rb @@ -49,6 +49,10 @@ def current_url def find(selector) browser.find_elements(:xpath, selector).map { |node| Capybara::Selenium::Node.new(self, node) } end + + def find_css(selector) + browser.find_elements(:css, selector).map { |node| Capybara::Selenium::Node.new(self, node) } + end def wait?; true; end def needs_server?; true; end diff --git a/lib/capybara/spec/session/find_spec.rb b/lib/capybara/spec/session/find_spec.rb index 22cc8a01b..8273c592b 100644 --- a/lib/capybara/spec/session/find_spec.rb +++ b/lib/capybara/spec/session/find_spec.rb @@ -41,6 +41,10 @@ @session.find(:css, 'h1').text.should == 'This is a test' @session.find(:css, "input[id='test_field']")[:value].should == 'monkey' end + + it "should support pseudo selectors" do + @session.find(:css, 'input:disabled').value.should == 'This is disabled' + end end context "with xpath selectors" do diff --git a/lib/capybara/spec/views/with_html.erb b/lib/capybara/spec/views/with_html.erb index babb19a91..fb5b8a990 100644 --- a/lib/capybara/spec/views/with_html.erb +++ b/lib/capybara/spec/views/with_html.erb @@ -89,3 +89,5 @@ banana
almost singular but not quite
almost singular
+ +