Capybara:点击图标类找到的元素

时间:2015-09-30 10:19:42

标签: ruby-on-rails rspec capybara

我想检查一下,当点击图标链接时,current_path是'show'动作的路径。

所以,鉴于这个HTML:

<a class="btn btn-xs" href="/admin/hotels/1">
   <i class="fa fa-eye fa-lg"></i>
</a>

这次水豚测试:

describe "GET /hotels", js:true do
  before :each do
    @hotel = create(:hotel)
    visit admin.hotels_path
  end
  it "eye icon links to show" do
    find(:css, 'i.fa.fa-eye.fa-lg').find(:xpath,".//..").click
    expect(current_path).to eq(admin.hotel_path(@hotel))
  end
end

我收到此错误消息:

   1) Hotels index hotel creation GET /hotels eye icon link to show
      Failure/Error: expect(current_path).to eq(admin.hotel_path(@hotel))

   expected: "/admin/hotels/560bb674467261c7a4000002"
        got: "/admin/hotels"

我推断find(:css, 'i.fa.fa-eye.fa-lg').find(:xpath,".//..").click没有按预期工作。

find(:css, 'i.fa.fa-eye.fa-lg').find(:xpath,".//..")的执行正在返回:

=> #<Capybara::Element tag="a">

我做错了吗?

2 个答案:

答案 0 :(得分:3)

测试失败的原因:js是因为点击链接只会这样做。它不会等待点击的结果(加载新页面)。因为在仍然获得原始路径之后立即调用current_path。删除:js停止使用poltergeist,而是使用同步的rack-test,但缺少很多真正的浏览器行为。在capybara 2.4中,您需要检查显示页面上的内容,一旦出现然后获取当前路径,但是capybara 2.5具有将使用capybaras等待行为的have_current_path匹配器。此外,没有必要点击一个元素,点击其内容就像一个用户会做的应该工作得很好。所以

find(:css, 'i.fa.fa-eye.fa-lg').click
expect(page).to have_current_path(admin.hotel_path(@hotel))

既可以使用也可以不使用:js

答案 1 :(得分:0)

问题是:

describe "GET /hotels", js:true do

我已将其替换为:

describe "GET /hotels" do

然后它使用了poltergeist,没有错误。