2015-04-22 4 views
0

Im пытаюсь выбрать td.col_4 в течение следующего HTML stucture с помощью водосвинку, но безуспешно до сих пор, так смотрел, если кто-нибудь может мне точку в правильном направленииВыбор элемента с помощью CSS и Капибара

<div id="potentialResults"> 
    <div class="result"> 
    <table class="report"> 
     <tbody> 
     <tr> 
      <td class="col_1"> 
      <img original-title="Sources : Telephone Directory"> 
      <a href="#"><u>Name 1</u></a> 
      </td> 
      <td class="col_2"></td> 
      <td class="col_3"></td> 
      <td class="col_4">Address 1</td> 
     </tr> 
     </tbody> 
    </table> 
    </div> 

    <div class="result"> 
    <table class="report"> 
     <tbody> 
     <tr> 
      <td class="col_1"> 
      <img original-title="Sources : Telephone Directory"> 
      <a href="#"><u>Name 2</u></a> 
      </td> 
      <td class="col_2"></td> 
      <td class="col_3"></td> 
      <td class="col_4">Address 2</td> 
     </tr> 
     </tbody> 
    </table> 
    </div> 

</div> 

Таким образом, на данный момент, чтобы получить текст address 1 для Name 1 Я делаю это

page.find("#potentialResults > .result > .report > tbody > tr > td.col_1 > a", text: "Name 1", match: :first).find('td.col_4').text 

но где я, кажется, изо всех сил получает тот же адрес, но с использованием данных IMG-атрибут, как мой идентификатор

page.find("#potentialResults > .result > .report > tbody > tr > td.col_1 > img[original-title='Sources : Telephone Directory'] + td.col_4", match: :first).text 

Но td.col_4 не совсем рядом в этом примере?

Как еще я смогу получить текст при условии, что он должен быть первым матчем.

Благодаря

ответ

0

устанавливаемым сотовым вы передаете свои искатель является слишком длинным. Его можно сократить, не вдаваясь в неоднозначные результаты.

Если вы хотите просто получить текст из td.col_4, просто сделать:

find('#potentialResults .col_4').text 

Если вы хотите, чтобы адрес для «Имени» 1, вы должны сначала найти этот элемент, траверсы вплоть до родительский уровень на несколько уровней, затем найдите свой путь назад. Это происходит потому, что элементы, которые вы ищете являются братьями и сестры, и Капибара на самом деле не обеспечивает простой способ найти это:

find('#potentialResults .col_1 a', :text => 'Name 1').find(:xpath, '../../..').find('.col_4').text 
+0

Спасибо за ваш ответ, но не я по-прежнему работать в неоднозначные вопросы, если имя я ищу существует в нескольких местах, поэтому im использует 'match:: first' .. Я не знал, что вы можете щелкнуть между' xpath' и 'css', так что это реально удобно. В конце концов я нашел решение xpath только, но ваш ответ - пища для размышлений, спасибо – Richlewis

+0

Я предположил, что имена будут уникальными. Вы можете использовать [сначала] (http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Node/Finders#first-instance_method) – Phil

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