Usamos isso dentro de nossas especificações de nabo para encontrar uma célula particular dentro de uma coluna particular dentro de uma tabela.
def within_cell(row, column)
within_row(row) do
within_column(column) { yield }
end
end
Este é composto por dois outros ajudantes within_column
e within_row
.
Eu gostaria de fazer deste um único seletor XPath, mas usar dois diferentes permite uma composição um pouco mais limpa.
def within_column(column)
within(:xpath, "//table/tbody/tr/td[count(//table/thead/tr/th[normalize-space()='#{column}']/preceding-sibling::th)+1]") do
yield
end
end
def within_row(name)
within(:xpath, "//tr[td='#{name}']") { yield }
end
Exemplo de uso
Isso verifica se a linha “Sr. John Citizen” contém um ícone específico na coluna “Ativado”.
And the item "Mr John Citizen" should be marked Activated
step 'the item :name should be marked :flag' do |name, flag|
within_cell(name, flag) do
send 'I should see a Yes badge'
end
end
Dividindo o XPath
count(
//table/thead/tr/th[
normalize-space()='#{column}'
]/preceding-sibling::th
)+1
Detecta o deslocamento da coluna que corresponde à column
string, encontrando a coluna, contando seus irmãos anteriores e adicionando 1.
//table/tbody/tr/td[ ...offset... ]
Isso seleciona células dentro de linhas que correspondem ao deslocamento detectado pelo seletor interno.
Vejo;
https://gist.github.com/garrow/6590179
Adaptado de um seletor XPath encontrado aqui;
http://stackoverflow.com/questions/14745478