首頁>Program>source

尝試測試该頁面包含 <title>My Title</title> 与:

# spec/features/reports_spec.rb
require 'spec_helper'
feature "Archive Management" do
  subject { page }
  describe "Index Page" do
    before(:all) { 10.times { FactoryGirl.create(:randomreport) } }
    after(:all) { Report.delete_all }
    describe "when no search terms present" do
      before { visit reports_path }
      it { should have_selector('title', text: 'My Title') } # <= Fails w/Capybara 2.0
      it { should have_selector('title') }                   # <= passes
      it { should have_text('My Title') }                    # <= passes
      it { should have_selector('h2', text: "Welcome") }     # <= passes
    end
  end
end

錯誤訊息:

Failure/Error: it { should have_selector('title', text: base_title) }
 Capybara::ExpectationNotMet:
   expected to find css "title" with text "My Title" but there were no matches. Also found "", which matched the selector but not all filters.

我知道我正在忽略這痛苦的事實,但無法弄清楚這是什麼吗? 是 <title> 標簽不再被视為"選擇器"?!? 要麼...?!?

Edit (debugger info)

如果我按照@shioyama的建議巧妙地进入除錯器,則顯然page.body包含 <title>My Title</title> .包含 <h2>Welcome to My Title Project</h2>的同一page.body 並通過!

似乎找到了 <title> ... </title> 標簽,但不是 My Title 在它裏面.但是它確實找到了 My Title 稍後在 <a href=\"/\" class=\"brand\">My Title</a>中的頁面中 和/或在 <h2>Welcome to The My Title Project</h2>

(rdb:1) p page
#<Capybara::Session>
(rdb:1) p page.body
"<!DOCTYPE html>\n<html>\n<head>\n<title>My Title</title>\n
<meta content='research, report, technology' name='keywords'>\n<meta 
content='Some Project' name='description'>\n<link href=\"/assets/application.css\"
...
</head>\n<body>\n<header class='navbar navbar-fixed-top 
navbar-inverse'>\n<div class='navbar-inner'>\n<div class='container'>\n
<a href=\"/\" class=\"brand\">My Title</a>\n<div class='pull-right'>\n
<ul class='nav'>\n<li><a href=\"/about\">About</a></li>\n<li><a href=\"/help\">Help</a>
</li>\n</ul>\n<form accept-charset=\"UTF-8\" action=\"/reports\" 
class=\"navbar-search\" method=\"get\"><div style=\"margin:0;padding:0;display:inline\">
<input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\" /></div>\n
<input class=\"search-query\" id=\"query\" name=\"query\" 
placeholder=\"Search\" type=\"text\" />\n</form>\n\n</div>\n</div>\n</div>\n</header>\n\n
<div class='container'>\n<div class='hero-unit center'>\n<h1>My Title</h1>\n
<h2>Welcome to The My Title Project</h2>\n<p>Lorem ipsum dolor sit amet, consectetur 
adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
...

我還能在除錯器中尝試什麼以弄清為什麼has_selector?('title',text:...)失败了吗?

So, what is the proper way to test for a title in Capybara 2.0?

最新回復
  • 5月前
    1 #

    我在升級到Capybara 2.0時遇到了相同的問题,並設法通過使用 Capybara.string建立以下自定義RSpec匹配器来解決了這些問题 :

    spec/support/utilities.rb

    RSpec::Matchers::define :have_title do |text|
      match do |page|
        Capybara.string(page.body).has_selector?('title', text: text)
      end
    end
    

    現在,在規格檔案中,其中 subject { page } ,我可以使用:

    it { should have_title("My Title") }
    it { should_not have_title("My Title") }
    

    順便說一句,關於這个問题的對话對於让我得到這个答案非常有帮助,所以谢谢!!

    更新1:

    如果您不想建立自定義RSpec匹配器,則感谢使用者dimuch的CoDebug迴答,我現在知道您可以致電 have_selector 直接在 page.source (別名 page.body )以測試不可见的DOM元素:

    it "should show the correct title" do
      page.source.should have_selector('title', text: 'My Title')
    end
    

    或哪裏 subject { page }

    its(:source) { should have_selector('title', text: 'My Title') }
    
    更新2:

    从Capybara 2.1開始,內建了 have_title / has_title? 匹配器,在此答案中不需要自定義RSpec匹配器.此外, its(:source) { ... } 更新1中描述的測試似乎在Capybara 2.1下失败; 我已经確认了 / have_title 可以按預期工作,因此如果計划升級,最好使用以下語法:

    has_title?

    subject { page }
    

    使用 it { should have_title("My Title") } it { should_not have_title("My Title") }expect中的語法 / it 阻止:

    scenario
    

  • 5月前
    2 #

    Capybara 2.1更改了對查詢title元素的支援.因此,以這種方式使用具有select選擇器来查詢html doc標题中的title元素將失败" page.should have_selector('title',:text =>'Some text')。根据我的理解,首選方法 在capybara 2.1中,新的API使用" page.should have_title('Some text')"来查詢title元素是否可以正常工作。

  • 5月前
    3 #

    从1.x版本升級水豚時,我遇到了同樣的問题 到>2.0

    問题是水豚会忽略其匹配器中的不可见文字.解決此問题的最干净方法是使用 expect(page).to have_title("My Title") expect(page).to_not have_title("My Title") 發現者的選擇.

    例如

    :visible => false

    要設置另一个(全域性)選項:

    it { should have_selector('title', text: 'My Title', visible: false) }

  • 5月前
    4 #

    我仅在使用" shared_examples_for"時才遇到此問题,可能是由於其他更改.我還註意到,当我放置

    Capybara.ignore_hidden_elements = false
    
    在頁面正文中(不屬於也不会呈現),測試通過了.這不是一件好事!

    工作正常:

    <title>My Title</title>
    

    (水豚2.1.0, 啟動2.3.0, nokogiri 1.5.9, rspec 2.13)

  • 5月前
    5 #

    我在這裏看到两个可能的問题:

    維兹威兹 標簽出現在頁面上,但文字 it{should have_title("My Title")} 在頁面上的其他位置,不在標記內.那可以解釋為什麼其他測試通過了:有一个 <title> 在頁面上標記,以便 My Title 通過,並且有 <title> 頁面上的文字,所以 have_selector('title') 通過。

    維兹威兹 標簽包含文字 My Title 以及其他可以解釋您看到的結果的地方:有一个 have_text(base_title) 在頁面上標記,以便 <title> 通過,並且有文字 My Title 因此, <title> 也通過了,但是 have_selector('title') My Title中的選項 是嚴格的,因此如果找到与 have_text(base_title)不完全相等的字元串,它將失败 .

    您可以使用xpath選擇器檢查這两種可能性中的後者: text .如果通過了,那麼標题文字週圍可能会有一些空格或換行符,匯致 have_selector 起来(我以為它忽略了那些,但我可能是錯的)。

    希望有帮助。

    My Title

  • windows下適用於Python 3x的OpenCV
  • javascript:AJAX jQuery每5秒重新整理一次div