Selenium, xpath для соответствия строке таблицы, содержащей несколько элементов

Я пытаюсь найти 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 ответов

Решение

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

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

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

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

//tr/td[contains(text(), 'Car')]/text()  | //tr/td/input[@value="s1"]/@name

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

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

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

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

Узнайте больше об Axes в Xpath: http://www.w3schools.com/xpath/xpath_axes.asp

Спасибо 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

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

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

В моей задаче у меня был список продуктов, в которых он был идентифицирован по уникальной комбинации 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']
Другие вопросы по тегам