Подтвердить что ты не робот

Можно ли проверить порядок элементов через RSpec/Capybara?

Я использую 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")')

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

4b9b3361

Ответ 1

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

page.body.should =~ /ITEM1.*ITEM2.*ITEM3/

Ответ 2

Я нашел более канонический способ тестирования этого поведения с помощью 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")

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

Ответ 3

в этой статье перечислены несколько способов проверки порядка сортировки в 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

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

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

Он находится в форме шага огурца, но вы должны иметь возможность извлекать то, что вам нужно для шага Rspec. Это похоже на решение Kludgy'а от Johns, но немного больше, чем я могу разобраться. Все их другие хитроумные шаги тестирования capybara можно найти здесь:

https://github.com/makandra/spreewald

Ответ 6

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

Это просто:

expect(this).to appear_before(that)

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Используя 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)