Капибара утверждает атрибуты элемента - PullRequest
85 голосов
/ 01 марта 2011

Я использую RSpec2 и Capybara для приемочных испытаний.

Я хотел бы заявить, что ссылка отключена или нет в Capybara. Как я могу это сделать?

Ответы [ 10 ]

142 голосов
/ 21 августа 2011

Другим простым решением является доступ к искомому 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 автоматически попытается дождаться завершения асинхронных запросов, но можетработать в некоторых случаях:

Вот один из обходных путей, если у вас возникают проблемы с утверждениями об элементах, которые обновляются асинхронно:

http://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara
90 голосов
/ 01 марта 2011

Как вы отключаете ссылку?Это класс, который вы добавляете?Атрибут?

# 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!

4 голосов
/ 19 марта 2015

Я рекомендую использовать have_link и find_link(name)[:disabled] в двух отдельных утверждениях. Хотя выполнение второго утверждения проще, это делает сообщения об ошибках о отсутствующих ссылках более приятными, что облегчает чтение результатов теста.

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

Обратите внимание, что "Example" можно изменить на имя или идентификатор ссылки.

4 голосов
/ 25 марта 2011

Было немного сложно найти правильный 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")

Параметр класса будет игнорироваться.

1 голос

По возможности, вы должны стараться использовать упаковщики, предоставляемые Capybara, которые будут работать более согласованно для всех драйверов.

Для частного случая disabled была добавлена ​​оболочка в 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

Если вы используете его, вы получите ощутимые результаты как в RackTest, так и в Poltergeist:

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 тесты Javascript будут работать без каких-либо изменений, если вы начнете использовать драйвер с поддержкой Js.

Исполняемый файл теста здесь .

1 голос
/ 20 сентября 2011
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})

have_link ожидает хэш опций, который является пустым, если вы его не предоставите. Вы можете указать любые атрибуты, которые должна иметь ссылка - просто убедитесь, что вы передаете все параметры в ОДНОМ хэше.

Надеюсь, это поможет

PS: Для таких атрибутов, как data-method, вы должны передать имя атрибута в виде строки, поскольку дефис разбивает символ.

0 голосов
/ 23 января 2019

В соответствии с документами вы можете использовать синтаксис доступа [attribute]:

find('#selector')['class'] => "form-control text optional disabled"

Для инвалидов вы также можете сделать это:

expect(find('#selector').disabled?).to be(true)
0 голосов
/ 25 ноября 2015

Просто вы можете использовать page.has_css? метод

page.has_css?('.class_name') 

, который вернет true, если элемент существует.

Выполните какое-либо действие на основе проверки.

page.has_css?('.class_name') do
  #some code
end
0 голосов
/ 08 мая 2015

Используя синтаксис Rspec3, я сделал это следующим образом:

expect(page).not_to have_selector(:link_or_button, 'Click here')
0 голосов
/ 10 июня 2014

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
...