Capybara没有找到元标签

时间:2013-04-17 23:51:59

标签: ruby-on-rails rspec capybara

Capybara 2.1.0似乎没有找到任何元标记:

(rdb:1) p page.find 'meta'
*** Capybara::ElementNotFound Exception: Unable to find css "meta"

即使它们出现在page.source

(rdb:1) p page.source
"<!doctype html>\n<html>\n<head>\n<title>MyTitle</title>\n<meta charset='utf-8'>\n<meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'>\n<meta content='width=device-width, initial-scale=1' name='viewport'>\n<meta name='description'>\n\n..."

3 个答案:

答案 0 :(得分:37)

解决方案是在:visible => falsefind中使用have_selector

page.should have_css 'meta[name="description"]', :visible => false

或:

page.find 'meta[name="description"]', :visible => false

答案 1 :(得分:10)

如果您想查看更具体的元数据,包括说明文字等:

https://gist.github.com/Lordnibbler/6247531

RSpec::Matchers.define :have_meta do |name, expected|
  match do |actual|
    has_css?("meta[name='#{name}'][content='#{expected}']")
  end

  failure_message_for_should do |actual|
    actual = first("meta[name='#{name}']")
    if actual
      "expected that meta #{name} would have content='#{expected}' but was '#{actual[:content]}'"
    else
      "expected that meta #{name} would exist with content='#{expected}'"
    end
  end
end

RSpec::Matchers.define :have_title do |expected|
  match do |actual|
    has_css?("title", :text => expected)
  end

  failure_message_for_should do |actual|
    actual = first("title")
    if actual
      "expected that title would have been '#{expected}' but was '#{actual.text}'"
    else
      "expected that title would exist with '#{expected}'"
    end
  end
end

然后,像这样查找元:

page.should have_meta(:description, 'Brand new Ruby on Rails TShirts')

借着施普雷的爱:https://github.com/spree/spree/blob/master/core/lib/spree/testing_support/capybara_ext.rb

答案 2 :(得分:0)

提议的解决方案在 2021 年不起作用,但以下方法起作用

page.find('//head/meta[name="description"]', visible: false)[:content]

根据https://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Element

<块引用>

Element 还可以访问 HTML 属性和其他属性 元素:

bar.value 条形文字 栏[:标题]