Capybara Webkit,找到特定的 li 元素,单击删除按钮并检查特定的 li 元素是否丢失
Capybara Webkit, find specific li element, click delete button and check if the specific li element is missing
我想测试简单的删除 jquery/ajax ,使用 capybara-webkit。
用户在 <li>
内点击删除按钮,之后该元素应该会消失。
我的 html 看起来像这样:
<div class="artist-songs">
<h3 tabindex="-1" id="song_h" class="song_h">Songs:</h3>
<ol id="song-list">
<li class="song">
<span>The Plug</span>
<span>
-
2000
-
</span>
<span>Downtempo</span>
<button name="button" type="submit" data-artist-id="5" data-song-id="14" class="delete del_song">Delete</button>
</li>
我决定用这样的测试生成模型:
feature 'Testing song methods', js: true do
let(:test_artist) { create :artist, name: 'Band' }
let!(:song1) { create :song, title: 'Song 1', year: 1987, genre: 'Hip Hop', artist: test_artist }
let!(:song2) { create :song, title: 'Song 2', artist: test_artist }
let!(:song3) { create :song, title: 'Song 3', artist: test_artist }
let!(:song4) { create :song, title: 'Song 4', artist: test_artist }
scenario 'Delets first song' do
visit artist_path(test_artist.id)
end
end
我了解了如何测试简单操作的基本概念,但是我不确定如何编写测试,所以我确定删除的是正确的 <li>
元素,而不是随机元素。
因此例如 "Song 1" 仅被删除。
要测试删除 song1 你可以做类似的事情
scenario 'Delete song 1' do
visit artist_path(test_artist.id)
within('#song-list') do
find(:css, 'li.song', text: song1.title).click_button('Delete')
expect(page).not_to have_css('li.song', text: song1.title) # RSpec
# page.assert_no_selector(:css, 'li.song', text: song1.title) # if not using RSpec
end
注意:如果 Capybara.default_selector == :css(默认)
,则可以省略 :css 参数
如果您要在测试中处理很多 li.song
元素,您还可以定义一个自定义选择器,例如
Capybara.add_selector(:song) do
xpath { |title| XPath.css('li.song')[XPath.string.n.is(title)] }
end
这意味着您可以这样做
find(:song, song1.title).click_button('Delete')
expect(page.not_to have_selector(:song, song1.title)
我想测试简单的删除 jquery/ajax ,使用 capybara-webkit。
用户在 <li>
内点击删除按钮,之后该元素应该会消失。
我的 html 看起来像这样:
<div class="artist-songs">
<h3 tabindex="-1" id="song_h" class="song_h">Songs:</h3>
<ol id="song-list">
<li class="song">
<span>The Plug</span>
<span>
-
2000
-
</span>
<span>Downtempo</span>
<button name="button" type="submit" data-artist-id="5" data-song-id="14" class="delete del_song">Delete</button>
</li>
我决定用这样的测试生成模型:
feature 'Testing song methods', js: true do
let(:test_artist) { create :artist, name: 'Band' }
let!(:song1) { create :song, title: 'Song 1', year: 1987, genre: 'Hip Hop', artist: test_artist }
let!(:song2) { create :song, title: 'Song 2', artist: test_artist }
let!(:song3) { create :song, title: 'Song 3', artist: test_artist }
let!(:song4) { create :song, title: 'Song 4', artist: test_artist }
scenario 'Delets first song' do
visit artist_path(test_artist.id)
end
end
我了解了如何测试简单操作的基本概念,但是我不确定如何编写测试,所以我确定删除的是正确的 <li>
元素,而不是随机元素。
因此例如 "Song 1" 仅被删除。
要测试删除 song1 你可以做类似的事情
scenario 'Delete song 1' do
visit artist_path(test_artist.id)
within('#song-list') do
find(:css, 'li.song', text: song1.title).click_button('Delete')
expect(page).not_to have_css('li.song', text: song1.title) # RSpec
# page.assert_no_selector(:css, 'li.song', text: song1.title) # if not using RSpec
end
注意:如果 Capybara.default_selector == :css(默认)
,则可以省略 :css 参数如果您要在测试中处理很多 li.song
元素,您还可以定义一个自定义选择器,例如
Capybara.add_selector(:song) do
xpath { |title| XPath.css('li.song')[XPath.string.n.is(title)] }
end
这意味着您可以这样做
find(:song, song1.title).click_button('Delete')
expect(page.not_to have_selector(:song, song1.title)