2015-01-19 3 views
1

У меня есть таблица со следующей структурой:Получить содержимое ячейки таблицы на основе содержимого ячейки в окрестностях

<table class="table_class"> 
    <tr> 
     <td>Label A</td> 
     <td>Value A</td> 
     <td>Label B</td> 
     <td><div>Value B<a href="/some/href">Change</a></div></td> 
    </tr> 
    <tr> 
     <td>Label C</td> 
     <td><div><a href="/another/href">Value C</a></div></td> 
     <td>Label D</td> 
     <td><div><span><a href="/more/href"><span><img src="image/source.jpg"<img src="another/image.gif"></span></a><a href="even/more/href">Value D</a></span>&nbsp;<a href="/href">Change</a></div></td> 
    </tr> 
</table> 

Я хотел бы получить значение («Value A», «Value B»,. ..), но единственным уникальным идентификатором для ячеек таблицы, содержащих эти значения, являются ячейки таблицы, оставленные им («Метка А», «Метка B», ...).

Любая идея, как правильно обращаться в рамках объекта PageObject?

Спасибо заранее, Christian

+0

Вы можете объявить клетки по индексу, так что-то вроде 'ячейки (: value_a, индекс: 1)' и 'cell (: value_b, index: 3)' может работать. Лично для разбора html я бы использовал nokogiri, поскольку у него есть некоторые действительно приятные способы навигации. – engineersmnky

ответ

2

Вы можете использовать XPath с following-sibling оси, чтобы найти значения соседних ячеек.

Например, следующий объект страницы имеет метод, который найдет ячейку метки на основе ее текста. Оттуда перейдите к следующему td-элементу, который должен быть связанным значением.

class MyPage 
    include PageObject 

    def value_of(label) 
    # Find the table 
    table = table_element(class: 'table_class') 

    # Find the cell containing the desired label 
    label_cell = cell_element(text: label) 

    # Get the next cell, which will be the value 
    value_cell = label_cell.cell_element(xpath: './following-sibling::td[1]') 
    value_cell.text 
    end 
end 

page = MyPage.new(browser) 
p page.value_of('Label A') 
#=> "Value A" 
p page.value_of('Label B') 
#=> "Value BChange" 

В зависимости от ваших целей вы также можете реорганизовать это, чтобы использовать методы доступа. Это позволит вам иметь методы для возврата в ячейку значения, его текст, проверяя его существование, и т.д.:

class MyPage 
    include PageObject 

    cell(:value_a) { value_of('Label A') } 
    cell(:value_b) { value_of('Label B') } 

    def value_of(label) 
    table = table_element(class: 'table_class') 
    label_cell = cell_element(text: label) 
    value_cell = label_cell.cell_element(xpath: './following-sibling::td[1]') 
    value_cell 
    end 
end 

page = MyPage.new(browser) 
p page.value_a 
#=> "Value A" 
p page.value_a? 
#=> true 
+0

Спасибо, эта работа отлично подходит для ячеек с открытым текстом (например, «Значение А»). Любая идея о том, как буксир получает «значение B», которое вложен в div внутри ячейки? Спасибо! –

+0

Это решение работает, когда значение вложен в div. Как видно из первого примера, вы получаете «Значение BChange», поскольку это текст ячейки. Предполагая, что часть, которую вы не хотите, всегда является ссылкой «Изменить», вы можете удалить эту часть строки, если она присутствует. Это то, что вы ищете? –

Смежные вопросы