Selenium Webdriver Xpath: найдите и сравните текст элемента, затем щелкните ссылку, которая находится через 4 строки после

Я хочу найти и сравнить заголовок в таблице. Затем нажмите на кнопку удаления, которая находится в следующих 3-х строках заголовка.

Пример: Допустим, данный ввод — это Заголовок 2. Я хочу найти Заголовок 2 и посмотреть, существует ли он, а затем нажать кнопку удаления, которая связана с «Заголовком 2» (например, через 3-4 строки после).

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

String HeadingName = "Заголовок 2"
driver.findElement(By.xpath("//tr[contains(.,'" + HeadingName + "')]/tr[position()=4]/td[2 ]/div/a[2]")).click();

Вот как выглядит таблица и ее код.

Заголовок 1
Имя: Джо
Пол: Мужской
Параметры: Обновить | Удалить
Заголовок 2
Имя: Jenny
Пол: Женский
Опции: Обновить | Удалить

 <table>
 <tbody>
  <tr>
       <th class="st-head-row" colspan="2">Heading 1</th>
  </tr>
  <tr class="even">
      <td class="st-key">Name:</td>
      <td class="st-val">Joe</td>
  </tr>
  <tr class="even">
      <td class="st-key">Gender:</td>
      <td class="st-val">Male</td>
  </tr>
  <tr class="even last-row">
      <td class="st-key">Options:</td>
      <td class="st-val">
           <div style="white-space:nowrap;">
                <a id="save" href="linkaddress">save</a>
                | 
                <a id="delete" href="linkaddress">delete</a>
           </div>
      </td>
  </tr>
  <tr>
       <th class="st-head-row" colspan="2">Heading 2</th>
  </tr>
  <tr class="even">
      <td class="st-key">Name:</td>
      <td class="st-val">Jenny</td>
  </tr>
  <tr class="even">
      <td class="st-key">Gender:</td>
      <td class="st-val">female</td>
  </tr>
  <tr class="even last-row">
      <td class="st-key">Options:</td>
      <td class="st-val">
           <div style="white-space:nowrap;">
                <a id="save" href="linkaddress">save</a>
                | 
                <a id="delete" href="linkaddress">delete</a>
           </div>
      </td>
  </tr>
 </tbody>
</table>

person Joe    schedule 02.03.2015    source источник
comment
Обратите внимание, что пакетов строк может быть больше или меньше (один пакет — от заголовка до параметров). а   -  person Joe    schedule 03.03.2015


Ответы (4)


Попробуйте этот код, надеюсь, он вам поможет.

driver.findElement(By.xpath("//tr/th[contains(text(),'" + HeadingName + "')]//following::tr[3]/td[2]/div/a[2]")).click();

Спасибо

person Juhi Saxena    schedule 03.03.2015
comment
Здравствуйте, Джухи, к сожалению, я пробовал таким образом, и это не сработало. Спасибо - person Joe; 03.03.2015

Попробуйте следующий код с помощью xpath

String headingName = "Heading 2";

driver.findElement(By.xpath("//th[text()='"+ headingName +"']/parent::tr/following-sibling::tr[@class='even last-row']/td[@class='st-val']/div/a[@id='delete']")).click();

Если это работает, для получения подробной информации о том, как создается этот xpath, посмотрите здесь - http://www.w3schools.com/xpath/xpath_axes.asp

person Dmitry Shyshkin    schedule 02.03.2015
comment
Привет @Dmitry, к сожалению, этот код не работает. Я взглянул на ссылку, которую вы прислали, и каким-то образом получил хорошее представление о том, что делать. Мне все еще нужна помощь, если у вас есть больше идей по этому вопросу. Спасибо. - person Joe; 03.03.2015
comment
Я пропустил .click(); в конце моего кода. Не могли бы вы поделиться ошибкой, которую вы получаете после его использования - person Dmitry Shyshkin; 03.03.2015

Я бы попытался сохранить XPath немного более «семантически», например.

//tr[th = 'Heading 2']/following-sibling::tr[starts-with(td[1], 'Options')][1]//a[. = 'delete']

Здесь я специально ищу ссылку «удалить» в следующей строке «Параметры», а не что-то более хрупкое, например «вторую ссылку в следующей, но второй строке».

person Ian Roberts    schedule 03.03.2015

Я действительно сделал ответ, который на удивление сработал для меня.

dUtil.findElement(By.xpath("//tr/th[содержит(text(),'" + headingName + "')]/../following::tr[3]/td[2]/div/a [2]")).клик();

Я получил все условия, которые хотел.

  1. Ищет заголовок, похожий на заданный входной заголовок
  2. Щелкает по ссылке «Удалить», которая находится на 3 строки ниже искомого элемента.
  3. Должен работать, даже если имеется более одной партии строк (пакет означает от заголовка до удаления)
  4. Партия не обязательно должна быть в порядке.
person Joe    schedule 03.03.2015