Как найти кнопку, принадлежащую строке с определенным именем в столбце, используя XPath?

272
26 ноября 2016, 19:51

Как мне найти кнопку, которая находится в одной строке с именем "Lois" используя XPath

    <!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
    border: 1px solid black;
}
</style>
</head>
<body>
<h2>Add a border to a table:</h2>
    <table>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
      </tr>
      <tr>
        <td>Peter</td>
        <td>Griffin</td>
        <td><button type="button">Click!</button></td>
      </tr>
      <tr>
        <td>Lois</td>
        <td>Griffin</td>
        <td><button type="button">Click!</button></td>
      </tr>
    </table>
    </body>
    </html>
Answer 1

Простой вариант - таблица как на картинке из 3 столбцов, поиск состоит из двух этапов:

  • находим столбец ячейки, который содержит имя "Lois"

    .//tr/td[text()[.="Lois"]]
    
  • Принимаем, что структура таблицы постоянна и получаем второй элемент-родственник относительно столбца "Lois" и его кнопку

    .//tr/td[text()[.="Lois"]]/following-sibling::td[position()=2]/button
    

Второй вариант - если длина таблицы неограничена (кроме имени и фамилии будет куча других параметров), но "Имя" будет начинать строку, а "Кнопка" - заканчивать, мы можем взять последний элемент, который соответствует кнопке:

    .//tr/td[text()[.="Lois"]]/following-sibling::td[last()]/button

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

   .//tr[td[text()[.="Lois"]]]/td/button

На еще более универсальный вариант натолкнул комментарий lospejos.

Учитываем, что имя "Lois" соответствует столбцу "Firstname", а не какому-нибудь другому. Мы находим позицию заголовка "Firstname" (позиция 1) с помощью запроса

  count(tr/th/text()[.="Firstname"]/preceding-sibling::*)+1

и используем ее для поиска имени "Lois" в строке

  .//tr[td[count(tr/th/text()[.="Firstname"]/preceding-sibling::*)+1][text()[.="Lois"]]]/td/button

что, с учетом вычисленного count, для машины выглядит так

 .//tr[td[1][text()[.="Lois"]]]/td/button

то есть наш элемент должен соответствовать двум условиям - находится под заголовком "Firstname" и иметь имя "Lois"

Answer 2

TL;DR;

Находим элемент кнопки:

/html/body/table/tr[td[1]/text()='Lois' and td[2]/text()='Griffin']/td/button

Находим элемент ячейки (с кнопкой):

/html/body/table/tr[td[1]/text()='Lois' and td[2]/text()='Griffin']/td

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

READ ALSO
Как заставить Perl отрабатывать на сервере?

Как заставить Perl отрабатывать на сервере?

Всем приветС перлом пока не знаком, вообще

272
Нужна помощь с кодом битрикса

Нужна помощь с кодом битрикса

В общем нужно было добавить в шапку некоторые блоки, отредактировал код через админку, а редактор кода "натворил" дел с ним, и теперь стили...

251
jQuery sortable, сортировка блоков

jQuery sortable, сортировка блоков

Добрый день! Есть задача отсортировать блоки внутри одного блокаHtml имеет такую структуру:

453
Нажатие на кнопку &ldquo;Вход&rdquo;, поверх которой открывается форма

Нажатие на кнопку “Вход”, поверх которой открывается форма

Приветствую! Необходимо создать страницу, где посередине была бы одна кнопка "Вход", нажав на которую ПОВЕРХ неё появилось бы окно, куда надо...

298