Selenium, xpath для соответствия строке таблицы, содержащей несколько элементов - PullRequest
2 голосов
/ 28 октября 2010

Я пытаюсь найти Selenium / PHP XPath для сопоставления строки таблицы, содержащей несколько элементов (текст и элементы формы).

Пример:

<table class="foo">
  <tr>
    <td>Car</td><td>123</td><td><input type="submit" name="s1" value="go"></td>
  </tr>
</table>

Это работает для одного текстового элемента:

$this->isElementPresent( "//table/tbody/tr/td[contains(text(), 'Car')]" );

пока это НЕ (без локатора / td):

$this->isElementPresent( "//table/tbody/tr[contains(text(), 'Car')]" );

и, следовательно, это, очевидно, не будет работать для нескольких элементов:

$this->isElementPresent( "//table/tbody/tr[contains(text(), 'Car')][contains(text(), '123')]" );

Другой способ сделать это будет с getTable( "xpath=//table[@class='foo'].x.y") для каждой строки x, столбца y. Обременительно, но это сработало ... в основном. НЕ возвращает тег <input>! Для этой ячейки будет возвращена пустая строка: (

Есть идеи?

Ответы [ 5 ]

3 голосов
/ 28 октября 2010

Это XPath выражение:

/html/body/table[descendant::td[contains(.,'Car')]]

Примечание : если вы знаете свою схему, не используйте начальный оператор //. Используйте строковое значение вместо текстового узла (таким образом вы получите объединение всех потомков текстовых узлов).

2 голосов
/ 06 ноября 2010

Несколько путей могут быть объединены с | разделитель. Настроить это:

//tr/td[contains(text(), 'Car')]/text()  | //tr/td/input[@value="s1"]/@name
1 голос
/ 28 октября 2010

вы можете использовать

// td [содержит, 'Car'] и td [содержит, '123'] / ancestor :: tr

, которые выберутсодержит td, совпадающее с двумя содержит аргументы

Попробуйте использовать плагин View Xpath в Firefox, очень полезный плагин.

Подробнее об осях в Xpath: http://www.w3schools.com/xpath/xpath_axes.asp

0 голосов
/ 22 декабря 2011

В моей задаче у меня был список продуктов, где он был идентифицирован по уникальной комбинации SKU / каталог.Если я хотел добавить этот продукт в корзину, я выбрал его по SKU и каталогу.

На примере foob.ar:

//table[@class='foo']/tr[td[contains(text(), 'Car')] and td[contains(., '123')]]

Вы можете комбинировать его с решением dman для выбораконкретный элемент / столбец в этой строке

//table[@class='foo']/tr[td[contains(text(), 'Car')] and td[contains(., '123')]]//input[@name='s1']

Редактировать:

Решение выше работает, если я искал только эти два значения в любом из столбцов.Если вы хотите найти значение относительно определенного столбца, мне пришлось изменить его немного

//table[@class='foo']/tr[td[position()=1 and contains(text(), 'Car')] and td[position()=2 and contains(text(), '123')]]//input[@name='s1']
0 голосов
/ 08 декабря 2010

Спасибо knb за некоторые подсказки синтаксиса. Это немного не по теме, но относится к поиску, который привел меня сюда ...

У меня был стол с [имя | значение] ячеек. Мне нужно было получить значение из строки с предшествующим ей именем.

(поддельный пример, но каждая ссылка, которую я искал, имела один и тот же текст и не имела идентификаторов - дело в том, что контекстная информация была в соседней ячейке)

<table id="options"><tbody>
<tr>
 <td>other</td>
 <td><a href="#clicky">edit</a></td>
</tr>
<tr>
 <td>this label</td>
 <td><a href="#clicky">edit</a></td> <!-- I want this button -->
</tr>
<tr>
 <td>other</td>
 <td><a href="#clicky">edit</a></td>
</tr>
</tbody></table>

Я мог получить нужную кнопку, используя вложенные условия [[]]:

//table[@id='options']/tbody/tr[td[contains(text(), 'this label')]]/td[2]/a

"получить" a "в строке, которая содержит другую ячейку с текстом, который я ищу"

Я думаю, что такого рода задачи могут быть обычным делом, поэтому я выкладываю их здесь. К вашему сведению

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...