Нахождение содержимого в заданном столбце таблицы с помощью Capybara или Xpath? - PullRequest
3 голосов
/ 02 ноября 2011

Проблема: Для данной таблицы определенный фрагмент контента должен отображаться в том же столбце, что и конкретный заголовок.

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

Пример:

Name || Phone Number || Address
==============================================================
 ... || ...          || ...
 Joe || 555-787-7878 || 42 Nowhere Lane, Mulberry, California
 ... || ...          ||

С кодом, который выглядит примерно так:

<table>
  <tr>
    <th>Name</th>
    <th>Phone Number</th>
    <th>Registered</th>
    <th>Address</th>
  </tr>
  <tr>
    ...
  </tr>

  <tr>
    <td>Joe</td>
    <td>555-377-7347</td>
    <td>Yes</td>
    <td>42 Nowhere Lane1, Mulberry1, California</td>
  </tr>
  <tr>
    <td>Jerry</td>
    <td>555-787-7878</td>
    <td>Yes</td>
    <td>50 Nowhere Lane, Mulberry, California</td>
  </tr>

  <tr>
    <td>Tom</td>
    <td>555-678-0987</td>
    <td>No</td>
    <td>43 Nowhere Lane2, Mulberry2, California</td>
  </tr>
  <tr>
    ...
  </tr>
</table>

Сценарий: Я хочу, чтобы в столбце с заголовком «Адрес» отображался правильный адрес (42 Нигде ...).

Как это сделать?

Решение может быть таким же простым, как приличный запрос xpath, если честно, возможно, мне даже не нужно ничего особенно относящегося к "Капибаре"!

Я сталкивался с подобным, но здесьМне нужно проверить, зарегистрирован «Джерри» или нет.Пожалуйста, помогите мне, как я могу автоматизировать, используя ruby ​​/ capybara

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Я думаю, @Snekse очень близко. Вот некоторые выражения, которые были проверены. Далее возвращается ячейка таблицы, соответствующая th со значением Address:

/table/tr/td[(count(../../tr/th[.='Address']/preceding-sibling::*)+1)]

Это может быть использовано для получения значения ячейки:

42 Nowhere Lane, Mulberry, California

... который вы могли бы затем использовать для выполнения финального теста:

/table/tr/td[(count(../../tr/th[.='Address']/preceding-sibling::*)+1)]
                               [.='42 Nowhere Lane, Mulberry, California']

Это вернет саму ячейку, если адреса совпадают. Он вернет пустой набор узлов, который будет иметь значение false в логическом контексте, если такой узел не существует.

Возможно, вам также нужно указать строку, которую вы тестируете, что можно сделать с небольшим изменением начала выражения:

/table/tr[$n]/<rest_of_expression>

... где $n - индекс строки для выбора.

1 голос
/ 06 декабря 2011

Я бы подумал, что вам сначала нужно узнать позицию адреса, а затем использовать эту информацию, чтобы получить значение из таблицы данных.

Так что-то вроде:

var x = count(/table/tr/th[.='Address']/preceding-sibling::*)+1.
var address = /table/tr/td[position()=${x}]

Или объединить что-то вроде:

/table/tr/td[position()=(count(/table/tr/th[.='Address']/preceding-sibling::*)+1.)]

ПРИМЕЧАНИЕ. Я не выполнял эти операторы, поэтому понятия не имею, является ли они допустимым синтаксисом xpath или нет, но он должен быть достаточно близко, чтобы вы могли туда попасть.

ССЫЛКА: Найти положение узла, используя xPath

...