Можно ли проверить порядок элементов через RSpec / Capybara? - PullRequest
39 голосов
/ 08 декабря 2011

Я использую RSpec / Capybara в качестве набора тестов.У меня есть некоторый JavaScript, который динамически добавляет <li> в конец <ul>.Я хочу написать спецификации запроса, чтобы убедиться, что это происходит.

Я пытался использовать метод has_css Capybara и расширенные селекторы CSS для проверки порядка элементов <li>, но Capybara не поддерживает селектор + CSS.

Пример:

page.should have_css('li:contains("ITEM #1")')
pseuo_add_new_li
page.should have_css('li:contains("ITEM #1")+li:contains("ITEM #2")')

Кто-нибудь знает другой способ проверки заказа?

Ответы [ 10 ]

33 голосов
/ 10 декабря 2011

Я решил эту проблему, протестировав соответствие регулярному выражению содержимому страницы.Немного клудый, но это работает.

page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
29 голосов
/ 08 ноября 2012

Я нашел более канонический способ тестирования этого поведения с помощью CSS.Вы можете использовать селекторы :first-child, :last-child и :nth-child(n) в зависимости от того, что вам нравится.

В вашем примере я бы попробовал следующие утверждения:

page.should have_tag("ul:last-child", :text => "ITEM #1")
pseuo_add_new_li
page.should have_tag("ul:nth-last-child(2)", :text => "ITEM #1")
page.should have_tag("ul:last-child", :text => "ITEM #2")

Надеюсь, это кому-нибудь поможет. Подробнее об этом .

26 голосов
/ 08 февраля 2013

в этой статье перечислены несколько способов проверки порядка сортировки в RSpec, лучшим из которых, по-видимому, является этот сопоставитель:

RSpec::Matchers.define :appear_before do |later_content|
  match do |earlier_content|
    page.body.index(earlier_content) < page.body.index(later_content)
  end
end
4 голосов
/ 31 июля 2014

У меня недавно была такая же проблема, и я нашел это идеальное и идеальное решение: http://launchware.com/articles/acceptance-testing-asserting-sort-order

Это даже упаковано как крошечный драгоценный камень.

2 голосов
/ 10 августа 2016

Вы можете использовать метод поиска all , чтобы выбрать несколько элементов, а затем использовать команду collect для извлечения текста в массив:

assert_equal page.all('#navigation ul li').collect(&:text), ['Item 1', 'Item 2', 'Item 3']

Если ваш список не виден на странице, такой как всплывающее меню навигации, вам нужно передать visible: false в метод all.

2 голосов
/ 28 декабря 2012

Эта страница имеет очень умный способ проверки порядка строковых элементов на странице - будь они в списке или нет:

https://makandracards.com/makandra/789-match-strings-in-a-given-order-with-cucumber-and-capybara

Это в форме шага огурца, но вы должны быть в состоянии извлечь то, что вам нужно для шага Rspec. Это похоже на решение Джона «клудги», но немного причудливее из того, что я могу разобрать. Все остальные шаги по тестированию хитрой капибары можно найти здесь:

https://github.com/makandra/spreewald

1 голос
/ 26 мая 2016

Используйте orderly драгоценный камень , написанный автором статьи , упомянутой ранее.

Это так же просто, как:

expect(this).to appear_before(that)
0 голосов
/ 25 января 2018

В вышеупомянутых решениях было очень трудно проверить порядок, если на странице было несколько элементов. Итак, я нашел другой способ.

Я разместил решение здесь - Тестовый порядок (последовательность) контента с использованием капибары

Отображение массивов, имеющих специфичные для CSS элементы, и затем сопоставление этого массива с ожидаемым массивом (сохраняйте элементы в последовательности)

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

Используя capybara-ui , вы можете использовать метод #widgets, чтобы получить все элементы в порядке сверху вниз.

# First define the widget,
# or reusable dom element reference.
# In this case in a role
class UserRole < Capybara::UI::Role
  widget :list_item, '.list-item'
end

# Then test the expected order using #widgets
role = UserRole.new
expected_order = ['buy milk', 'get gas', 'call dad']
actual_order = role.widgets(:list_item).map(&:text)

expect(actual_order).to eq(expected_order)
0 голосов
/ 08 декабря 2011

Капибара должна поддерживать селектор + (я думаю, что он использует Nokogiri, который, безусловно, поддерживает это) Возможно, вы используете старую версию? Или вы используете драйвер Capybara, который не поддерживает JavaScript, чтобы дополнительный элемент вообще не отображался?

Кроме того, не используйте RSpec для тестирования вашего HTML. Огурец гораздо лучше в этом. Для взаимодействия с JavaScript вам нужно использовать Selenium или Capybara-Webkit. Или, если у вас много JavaScript, попробуйте протестировать его с помощью Jasmine.

...