Usando capivara para selecionar uma célula específica dentro de uma tabela.

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_columne 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 à columnstring, 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