Я использую RSpec2 и Capybara для приемочных испытаний.
Я хотел бы сказать, что ссылка отключена или нет в Capybara. Как я могу это сделать?
Я использую RSpec2 и Capybara для приемочных испытаний.
Я хотел бы сказать, что ссылка отключена или нет в Capybara. Как я могу это сделать?
Как отключить ссылку? Это класс, который вы добавляете? Атрибут?
# 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!
Еще одно простое решение - получить доступ к атрибуту 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
будет автоматически пытаться дождаться завершения асинхронных запросов, но в некоторых случаях это может не работать:
Ниже приведено одно обходное решение, если у вас возникли проблемы с утверждениями для элементов, которые обновляются асинхронно:
Было немного беспорядочно узнать правильный xpath, вот правильный,
используя capybara 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")
Параметр класса будет проигнорирован.
Я рекомендую использовать have_link
и find_link(name)[:disabled]
в двух отдельных утверждениях. В то время как выполнение второго утверждения проще, это делает сообщения об ошибках в отношении недостающих ссылок более приятными, что облегчает чтение результатов теста.
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
Обратите внимание, что "Example"
можно изменить на имя или идентификатор ссылки.
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
has_link ожидает хеш опций, который пуст, если вы его не предоставили. Вы можете указать любые атрибуты, которые должна иметь ссылка - просто убедитесь, что вы передаете все опции в ОДНОМ хеше.
Надеюсь, что это поможет
PS: Для атрибутов, таких как data-method, вы должны передать имя атрибута в виде строки, так как дефис разбивает символ.
По возможности, вы должны попытаться использовать предоставленные 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.
Загрузочный тестовый файл здесь.
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
Используя синтаксис Rspec3, я сделал это следующим образом:
expect(page).not_to have_selector(:link_or_button, 'Click here')
Просто вы можете использовать метод page.has_css?
page.has_css?('.class_name')
это вернет true
, если элемент существует.
Выполните некоторые действия, основанные на проверке.
page.has_css?('.class_name') do
#some code
end
Для инвалидов вы также можете сделать это:
expect(find('#selector').disabled?).to be(true)