Использование Watir для перехода по определенной ссылке, когда есть другие ссылки с таким же отображаемым текстом
поэтому у меня есть таблица, которая выглядит примерно так, где есть список книг, а в самом первом столбце есть две ссылки: просмотреть и удалить для каждой книги.
Я хотел бы иметь возможность использовать Watir, чтобы найти строку с указанным названием книги и нажать на эту кнопку просмотра для этой книги.
Вот что у меня так далеко
And /^click on View link of "(.*)" on the result set table$/ do |cell_name|
cellButton("submit.view", cell_name, "")
end
#
#
And /^click on Delete link of "(.*)" on the result set table with no_wait$/ do |cell_name|
cellButton("submit.delete", cell_name, "no_wait")
end
#
#
def cellButton(submit_type, s_name, s_wait_type)
c_found = 0
@browser.tables do |tbl|
tbl.rows do |r|
r.each do |c|
if c.text.to_s.matches(s_name)
c_found += 1
end
break if c_found > 0
end
if c_found > 0
if s_wait_type == "no_wait"
r.button(:name, submit_type).click_no_wait
else
r.button(:name, submit_type).click
end
end
break if c_found > 0
end
end
end
а вот HTML для определенной кнопки просмотра
<tr class="even">
<td class="actionColumn">
<span style="margin: 0px; padding: 0px; display: inline;">[</span>
<input id="013c6e2c8187_885b_1bd1f6fc" name="submit.view" class="action_link" size="" value="View" type="button" onclick="location.href='book_details.html'">
<span style="margin: 0px; padding: 0px; display: inline;">]</span><br>
<div>
<span style="margin: 0px; padding: 0px; display: inline;">[</span>
<input id="013c6e2c8187_1194_75ae28a8" name="submit.delete" class="action_link" size="" value="Delete" type="button">
<span style="margin: 0px; padding: 0px; display: inline;">]</span>
</div>
</td>
<td>
book title
<td>
<td>
more tds
</td>
</tr>
при запуске скрипта ошибки нет, однако ссылка на просмотр не нажата.
я использую Watir 4.0, Ruby 1.9.3 и огурец 1.3.3
2 ответа
Предположим, что ваша таблица HTML:
<table>
<tr>
<td>
<input id="013c6e2c8187_885b_1bd1f6fc" name="submit.view" class="action_link" size value="View" type="button" onclick="location.href='book_details.html'">
</td>
<td>
book title 1
</td>
</tr>
<tr>
<td>
<input id="013c6e2c8122_885b_1bd1f6fc" name="submit.view" class="action_link" size value="View" type="button" onclick="location.href='book_details2.html'">
</td>
<td>
book title 2
</td>
</tr>
</table>
Затем вы можете увидеть, что название книги и кнопка просмотра связаны их родительской строкой (tr).
Самый простой способ получить доступ к элементу по его брату - это:
- Найдите элемент с уникальным атрибутом; в этом случае тд с названием книги.
- Получить родительский элемент (т.е. tr), используя
parent
метод. - Получить желаемый элемент по отношению к родительскому элементу (т.е. первая кнопка просмотра в строке).
Например, чтобы получить кнопку "Вид" для "Название книги 2", вы можете сделать:
book_title = 'book title 2'
table = browser.table(:id => 'my_table')
book_row = table.td(:text => book_title).parent
book_row.button(:value => 'View').click
Приведенное выше решение будет искать название книги в любом столбце. Это хорошо, если ожидается, что текст заголовка книги будет находиться только в одном столбце. Если возможно, что текст будет в другом столбце, вам нужно сделать:
book_title = 'book title 2'
table = browser.table(:id => 'my_table')
book_row = table.trs.find{ |tr| tr.td(:index => 1).text == book_title }
book_row.button(:value => 'View').click
Вероятно, есть более чистый путь, но я попробую.
Предполагая, что это упрощенный HTML (то есть таблица с двумя столбцами со ссылками вместо кнопок):
<table id="foo">
<tr><td><a href="http://www.example.com">View</a></td><td>Title One</td></tr>
<tr><td><a href="http://www.iana.org/domains/reserved">View</a></td><td>Title Two</td></tr>
<tr><td><a href="http://www.iana.org/numbers">View</a></td><td>Title Three</td></tr>
</table>
Этот код должен работать, ориентируясь на название книги:
title = "Title Three"
trs = b.table(:id => "foo").rows
row_index = 0
trs.each do |tr|
tr.each do |cell|
if cell.text == title
b.link(:text => "View", :index => "#{row_index}").click
# alternately, using the fire_event method
# b.link(:text => "View", :index => "#{row_index}").fire_event("onclick")
end
end
row_index += 1
end