найти элемент с наибольшим значением с XPath? - PullRequest
1 голос
/ 02 июля 2019
<div class="box box-0 box-hover-null">10828</div>

У меня есть серия из них в HTML-документе, с номером переменной в виде текста ().

Мне нужно найти первый div с самым высоким и самым низким значением текста.

мой текущий селектор:

//div[string-length(text()) > 0 and contains(concat(' ',normalize-space(@class),' '),' box-0 ')]

Ответы [ 2 ]

1 голос
/ 04 июля 2019
<div class="box box-0 box-hover-null">10828</div>

У меня есть серия из них в html-документе с номером переменной в виде text ().

Мне нужно найти первый div с самым высоким и самым низким текстовым значением.

Насколько мне известно, Selenium использует движок XPath соответствующего браузера - в настоящее время все браузеры поддерживают только XPath 1.0.

Таким образом, требуется выражение XPath 1.0.выбор первого <div> элемента, строковое значение которого можно преобразовать в число, и это число является минимумом всех таких <div> числовых значений.

Требуется аналогичное выражение XPath, но оно выбирает первое такое <div>элемент с максимальным числовым значением.

Вот два выражения XPath, которые выбирают нужные элементы <div>:

1-й <div> элемент с минимальным числовым значением :

(//div[number(.) = number(.)
     and number(.) = //div[number(.) = number(.)
                         and not(number(.) > //div[number(.) = number(.)]/text())
                          ]
      ]
)[1]

1-й <div> элемент с максимальным числовым значением :

(//div[number(.) = number(.)
     and number(.) = //div[number(.) = number(.)
                         and not(number(.) < //div[number(.) = number(.)]/text())
                          ]
      ]
)[1]

Вот проверка на основе XSLT 1.0 .Приведенное ниже преобразование оценивает эти два выражения XPath по отношению к документу XML и копирует в выходные данные результатов этой оценки (выбранные узлы):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    First node with Minimum value: <xsl:copy-of select=
    "(//div[number(.) = number(.)
    and number(.) = //div[number(.) = number(.)
                        and not(number(.) > //div[number(.) = number(.)]/text())
                         ]
           ]
      )[1]"/>

=======================

    First node with Maximum value: <xsl:copy-of select=
    "(//div[number(.) = number(.)
    and number(.) = //div[number(.) = number(.)
                        and not(number(.) &lt; //div[number(.) = number(.)]/text())
                         ]
           ]
      )[1]"/>
  </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к этому документу XML :

<html>
  <div class="box box-0 box-hover-null">100</div>
  <div class="box box-1 box-hover-null">100</div>
  <div class="box box-2 box-hover-null">0500</div>
  <div class="box box-3 box-hover-null">00500</div>
  <div class="box box-4 box-hover-null">300</div>
  <div class="box box-5 box-hover-null">200</div>
</html>

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

    First node with Minimum value: <div class="box box-0 box-hover-null">100</div>

=======================

    First node with Maximum value: <div class="box box-2 box-hover-null">0500</div>
0 голосов
/ 02 июля 2019

Чтобы получить максимум

max(//div[@class='box box-0 box-hover-null'])

, вы можете получить элемент с помощью

(//div[.=max(//div[@class='box box-0 box-hover-null'])][[@class='box box-0 box-hover-null'])[1]

Для минимального значения

min(//div[@class='box box-0 box-hover-null'])

Вы можете получить элемент с помощью

(//div[.=min(//div[@class='box box-0 box-hover-null'])][[@class='box box-0 box-hover-null'])[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...