Как найти родительский элемент дочернего элемента, идентифицируемого с помощью innerText? - PullRequest
0 голосов
/ 05 апреля 2019

Мне нужно выбрать строку в таблице, в которой у меня есть текст, поэтому я хотел бы воспользоваться возможностью выбора текста и последующего выбора родителя

Теперь страница выглядит так:

<tr class=" tableRow1" id="_pu5ufb" dr="1" _awtisprimaryrow="1">
<td width="1" class="tableBody w-tbl-cell" align="center"><span 
class="selectColumnMarker">

<div class="w-chk-container">
<input bh="CHKINP" hasaction="false" class="w-chk-native" 
id="_m7iynb" value="1" type="checkbox" elementid="_jw4lmb" 
issender="false" awnomitcomponent="true" name="_jw4lmb"><label 
bh="CHK" class="w-chk w-chk-dsize"></label>
</div>
</span>
</td>
<td align="left" class="tableBody w-tbl-cell">
<span>


<table role="presentation" class="mls" cellpadding="0" 
cellspacing="0">
<tbody><tr>
<td class="" id="_tz87e" tabindex="0"><a id="_3iqrbb" href="#" 
bh="HL" _sf="true">Analyst</a>
</td>
</tr>
</tbody></table>


</span>
</td><td class="tableBody w-tbl-cell">



&nbsp;</td>
<td class="tableBody w-tbl-cell">
&nbsp;</td>
</tr>

Мне нужно найти текст Аналитик , а затем найти связанный класс <tr> и выбрать класс <tr>.

Любая помощь будет весьма заметна

Ответы [ 4 ]

2 голосов
/ 05 апреля 2019

Во-первых, всякий раз, когда у вас смешанный контент (текст и разметка), лучше сравнивать строковое значение элементов, чем текстовые узлы, потому что встроенная разметка может разбивать сравниваемый текст на разные текстовые узлы.

Во-вторых, вы можете использовать:

//tr[td='Analyst']/@class

Примечание : сравнение наборов узлов является экзистенциальным сравнением. Это означает, что вы спрашиваете, существует ли какой-либо узел (в данном случае элемент td) со строковым значением, равным 'Analyst'.

Конечно, в HTML есть элементы, для которых пробел не имеет значения для рендеринга (он не сохраняется), несмотря на его присутствие в исходном документе. В этом случае вы можете использовать это простое выражение XPath 1.0 :

//tr[td[normalize-space()='Analyst']]/@class

Заметьте : набор узлов имеет ложное логическое значение тогда и только тогда, когда он пуст; вы можете «вкладывать» предикаты (правильно предикатом может быть любое выражение XPath).

2 голосов
/ 05 апреля 2019

Мне нужно найти текстового аналитика, а затем найти связанный класс tr и выбрать класс tr.

XPath 2.0 1

Это XPath,

//tr[td/normalize-space() = "Analyst"]/@class

выберет все @class атрибуты tr элементов, содержащих td со строковым значением нормализованного пробела "Analyst".

Однако обратите внимание, что в вашем примере HTML такой tr не имеет @class.

1 Спасибо за исправление, @ DebanjanB

1 голос
/ 05 апреля 2019

Немного неясно, что именно вы имели в виду под ... найти связанный класс tr и выбрать класс tr ... , как только вы нашли ... текстовый аналитик ... .

Однако, поскольку элементы являются динамическими элементами, и для размещения элемента с текстом как Аналитик вы можете использовать любой из следующих Java based Locator Strategies :

  • LinkText

    WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.linkText("Analyst")));
    
  • CSSSelector

    WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("td.tableBody table.mls a[bh='HL']")))
    
  • * 1032 XPath *:

    WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//td[contains(@class, 'tableBody')]//table[@class='mls']//a[text()='Analyst']")));
    

Чтобы извлечь атрибут class элемента <tr> относительно текста как Analyst , вы можете использовать следующее решение на основе Java :

  • * 1052 XPath *:

    String tr_class_attrib = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//td[contains(@class, 'tableBody')]//table[@class='mls']//a[text()='Analyst']//preceding::tr[1]"))).getAttribute("class");
    
1 голос
/ 05 апреля 2019

Исправьте ваш XML-файл на

<?xml version="1.0"?>
<!DOCTYPE stylesheet [
<!ENTITY nbsp "&#160;">
]>
<root>
  <tr class=" tableRow1" id="_pu5ufb" dr="1" _awtisprimaryrow="1">
    <td width="1" class="tableBody w-tbl-cell" align="center">
      <span class="selectColumnMarker">
        <div class="w-chk-container">
          <input bh="CHKINP" hasaction="false" class="w-chk-native" id="_m7iynb" value="1" type="checkbox" elementid="_jw4lmb" issender="false" awnomitcomponent="true" name="_jw4lmb"/>
          <label bh="CHK" class="w-chk w-chk-dsize"/>
        </div>
      </span>
    </td>
    <td align="left" class="tableBody w-tbl-cell">
      <span>
        <table role="presentation" class="mls" cellpadding="0" cellspacing="0">
          <tbody>
            <tr>
              <td class="" id="_tz87e" tabindex="0">
                <a id="_3iqrbb" href="#" bh="HL" _sf="true">Analyst</a>
              </td>
            </tr>
          </tbody>
        </table>
      </span>
    </td>
    <td class="tableBody w-tbl-cell">



&nbsp;</td>
    <td class="tableBody w-tbl-cell">
&nbsp;</td>
  </tr>
</root>

Тогда выражение, которое вы ищете:

//tr[td/a/text()='Analyst']/@class

Но поскольку элемент tr не имеет атрибута class, результат будет пустым.

...