【问题标题】:Check if Capybara::Node::Element has been removed by jQuery.remove()检查 Capybara::Node::Element 是否已被 jQuery.remove() 删除
【发布时间】:2017-07-07 14:51:16
【问题描述】:

我正在尝试进行以下测试:

it 'remove item from cart' do
  visit cart_path
  button = page.find("a[href='/carts/#{item.id}/remove']")
  card = find_ancestor_with_class(button, '.card')
  button.click
  # check if card has been removed from page
end

这个测试应该可以工作,因为下面的 JS 从页面中移除了卡片:

$.ajax({
  url: link,
  method: "GET",
  success: function() {
    $('#alert-modal').modal('show');
    $(button).closest(".card").remove();
  }
});

如何验证.card html 是否已从页面中删除?

【问题讨论】:

    标签: jquery tdd capybara ruby-on-rails-5


    【解决方案1】:

    检查页面上是否有某些内容不可见

    expect(page).to have_no_css(".card")
    

    expect(page).not_to have_css(".card")
    

    所以总的来说它变成了

    visit cart_path
    click_link(href: "/cars/#{item.id}/remove")    
    expect(page).not_to have_css(".card")
    

    只有在删除所有 .card 元素时才有效。如果页面上仍有其他 .card 元素,则检查您希望卡片中的文本或卡片元素(id 等)上的其他属性/属性,如项目描述或其他内容显示为

    expect(page).not_to have_css(".card", text: item.description)
    

    如果您经常处理 .card 元素,您还可以编写自定义 Capybara 选择器以使内容更易于阅读,本地化“卡片”的 CSS 定义等

    Capybara.add_selector :card do
      xpath do |content| 
        xp = XPath.css('.card')
        xp = xp[XPath.string.n.is(content)] unless content.nil?
        xp
      end
    end
    

    这应该允许

    expect(page).to have_no_selector(:card)
    expect(page).to have_no_selector(:card, item.description)
    

    等等

    【讨论】:

    • 但是没有办法使用card进行检查?
    • @RodrigoChaves 并非如此,这取决于 card 的确切位置,当元素被删除时 card 可能实际上指向一个新元素,如演示中所示 - gist.github.com/twalpole/ac5c893a6f1f27ba3005908421d3e45d - 其中card 最终指向页面上的所有三个.card 元素,因为元素被删除。这是因为 Capybaras 自动重新加载处理动态页面刷新/重新加载。测试应该真正关注用户在页面上看到的内容,而不是担心特定的元素。
    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多