найти элемент по xpath с содержит (узел ()) И содержит (@attribute) - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь найти элемент, проверяя innerHTML (свойство node ()) и некоторый атрибут (например, @class).Оба метода работают отдельно, но я не могу объединить их с "и"

HTML-частью:

<tr class="tableRow1">
  <td nowrap="" class="ct">
    <input type="CheckBox" name="RowKey" tabindex="17" value="15635">
    <img src="/tm/images/1pixel.gif" style="height:9px;width:9px;border:0" name="RowIndicator">
  </td>
  <td class="lt" title="ID">XXXXX</td><nobr>0021234567</nobr><td class="rt">1.00</td>
</tr>

Поэтому мне нужно найти этот узел class = "tableRow1" (от многих других), поймав эту часть:

<nobr>002123456</nobr>.

Эти две работы (но поймав несколько элементов):

.find_element_by_xpath('//tr[contains(node(), "0021234567")]')
.find_element_by_xpath('//tr[contains(@class, "Row")]')

Эта не:

.find_element_by_xpath('//tr[contains(node(),"0021234567") and contains(@class,"Row")]')

Ответы [ 4 ]

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

Так что мне нужно найти этот узел class = "tableRow1" (из многих другие), поймав эту часть:

<nobr>002123456</nobr>

Выражение XPath должно быть:

//tr[@class='tableRow1'][.//nobr='002123456']

Это основное. Тогда вы можете приспособить это к вашей ситуации.

  • Пример 1 (много возможных токенов классов) :

    //tr[contains(concat(' ',@class,' '),' tableRow1 ')][.//nobr='002123456']

  • Пример 2 (возможный пробел в nobr) :

    //tr[contains(concat(' ',@class,' '),' tableRow1 ')] [.//nobr[normalize-space()='002123456']]

  • Пример 3 (токен класса начинается с 'tableRow') :

    //tr[contains(concat(' ',@class,' '),' tableRow')] [.//nobr[normalize-space()='002123456']]

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

Ваши два селектора XPath выбирают разные узлы.

Узел, содержащий строку, является потомком узла <tr> с именем класса.Вот почему, когда вы ставите оба условия для одного узла, он не находит ни одного подходящего узла.

Попробуйте это:

.find_element_by_xpath('//[contains(node(), "0021234567")]/ancestor::tr[contains(@class), "Row"]')

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

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

driver.find_element_by_xpath("//nobr//ancestor::tr[contains(@class, 'Row')]")

Примечание : предполагается, что innerText в <nobr> является переменной, иначе innerText может быть включено в выражение XPath .

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

Попробуйте выражение XPath-1.0:

descendant::*[contains(node(), "0021234567")]/ancestor::tr[contains(@class, "Row")][1]

или в полной инструкции

.find_element_by_xpath('descendant::*[contains(node(), "0021234567")]/ancestor::tr[contains(@class, "Row")][1]')

Эта инструкция выбирает первого tr предка - который имеет атрибут class, который содержит значение Row - (глобального) node(), который содержит значение 0021234567.

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