2011-03-01 111 views

回答

89

如何禁用鏈接?這是你添加的課程嗎?屬性?

# Check for a link that has a "disabled" class: 
page.should have_css("a.my_link.disabled") 
page.should have_xpath("//a[@class='disabled']") 

# Check for a link that has a "disabled" attribute: 
page.should have_css("a.my_link[disabled]") 
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']") 

# Check that the element is visible 
find("a.my_link").should be_visible 
find(:xpath, "//a[@class='disabled']").should be_visible 

實際的xpath選擇器可能不正確。我不經常使用xpath!

+0

謝謝@idlefingers,我想斷言也使用xpath。我該怎麼做? – kriysna 2011-03-02 08:52:20

+0

我已經更新了我的答案。如果xpath選擇器是錯誤的,你必須做一些搜索或者打開一個新的問題。 – idlefingers 2011-03-02 09:49:55

+0

感謝這個答案幫助:) – 2011-06-28 04:33:20

4

這是一個有點亂,找出正確的XPath,這裏是正確的,使用
水豚0.4.1.1

# <a href="/clowns?ordered_by=clumsyness" class="weep">View Clowns</a> 

page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns") 

如果你只有無類的鏈接,使用

page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness') 

像這樣的事情會黯然不起作用:

page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep") 

類選項將被忽略。

136

另一種簡單的解決方法是訪問屬性您正在尋找[]的HTML:

find('#my_element')['class'] 
# => "highlighted clearfix some_other_css_class" 

find('a#my_element')['href'] 
# => "http://example.com 

# or in general, find any attribute, even if it does not exist 
find('a#my_element')['no_such_attribute'] 
# => "" 

注意Capybara將自動嘗試等待異步請求完成,但它可能不會在某些情況下工作:

這裏是一個解決辦法,如果你有麻煩與被異步更新的元素斷言:

+4

Vrey有用的解決方案。謝謝! – 2012-06-01 21:08:09

+0

我有一個字符串的CSS位置,例如。 'find('a#my_element [href]')',是否有可能檢索該屬性的值?嘗試使用類似'find('a#my_element [href]')。value'的表達式,但似乎不起作用:( – mickael 2012-12-16 04:00:28

+0

@mickael嘗試'find('a#my_element [href]').text'或'find ('a#my_element [href]')。native'。讓我知道,如果其中任何一個給你預期的結果。 – bowsersenior 2012-12-17 18:59:30

1
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"}) 

have_link預計hash選項裏面是空的,如果你不提供任何。您可以指定鏈接應具有的任何屬性 - 只要確保您通過ONE散列中的所有選項。

希望這有助於

PS:對於像數據方法的屬性,你必須通過屬性名稱作爲字符串,因爲連字符打破符號。

+0

在花括號裏貼他們似乎對我很有用。謝謝。 – 2012-03-23 12:13:36

+6

[它從來沒有工作](https://github.com/jnicklas/capybara/issues/1016#issuecomment-15020730),並不適用於水豚。我不知道爲什麼有9個人投了這個票。 – 2013-03-17 10:58:15

+0

這不再適用於水豚2.使用水豚<2的人可以使用上述 – Tian 2013-06-26 18:01:01

0

bowsersenior,感謝暗示

另一種簡單的解決方法是訪問HTML屬性你正在尋找[]

下面是一個例子:

let(:action_items) { page.find('div.action_items') } 

it "action items displayed as buttons" do 
    action_items.all(:css, 'a').each do |ai| 
    expect(ai[:class]).to match(/btn/) 
    end 
end 
1

只要有可能,你應該嘗試使用Capybara提供的包裝,這將更加一致地工作驅動程序。

對於disabled的特定情況下,一個包裝在2.1中引入:https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

如果你使用它,你會得到兩個RackTest和騷靈有意義的結果:

HTML:

<input type="text" id="disabled-false"   ></div> 
<input type="text" id="disabled-true"  disabled></div> 
<input type="text" id="disabled-js-true"   ></div> 
<input type="text" id="disabled-js-false" disabled></div> 
<script> 
    document.getElementById('disabled-js-true').disabled = true 
    document.getElementById('disabled-js-false').disabled = false 
</script> 

測試:

!all(:field, 'disabled-false', disabled: false).empty? or raise 
all(:field, 'disabled-false', disabled: true).empty? or raise 
all(:field, 'disabled-true',  disabled: false).empty? or raise 
!all(:field, 'disabled-true',  disabled: true).empty? or raise 
all(:field, 'disabled-js-true', disabled: true).empty? or raise 
all(:field, 'disabled-js-false', disabled: false).empty? or raise 

Capybara.current_driver = :poltergeist 
!all(:field, 'disabled-false', disabled: false).empty? or raise 
all(:field, 'disabled-false', disabled: true).empty? or raise 
all(:field, 'disabled-true',  disabled: false).empty? or raise 
!all(:field, 'disabled-true',  disabled: true).empty? or raise 
!all(:field, 'disabled-js-true', disabled: true).empty? or raise 
!all(:field, 'disabled-js-false', disabled: false).empty? or raise 

請注意,如果使用這種替代CSS選擇器的方式,那麼如果您開始使用支持Js的驅動程序,則JavaScript測試將無需任何更改即可正常工作。

可運行的測試文件here

3

我建議在兩個單獨的斷言中使用have_linkfind_link(name)[:disabled]。雖然單獨執行第二個斷言更簡單,但這會使有關缺失鏈接的錯誤消息看起來更好,從而使您的測試結果更易於閱讀。

expect(page).to have_link "Example" 
expect(find_link("Example")[:disabled]).to be false 

注意"Example"可以更改爲鏈接的名稱或ID。

0

使用Rspec3的語法,我就是這麼做的:

expect(page).not_to have_selector(:link_or_button, 'Click here') 
0

只要您可以使用page.has_css?方法

page.has_css?('.class_name') 

如果元素存在,這將返回true

根據驗證做一些操作。

page.has_css?('.class_name') do 
    #some code 
end