Родительский термин в xpath [дубликат]

Я использую <span style="display: inline-block; width: 2ch;">&#9;</span> для вкладок шириной в два символа.

74
задан Peter Mortensen 17 September 2016 в 10:29
поделиться

7 ответов

Немного больше о XPath axes

Допустим, что мы имеем структуру ниже HTML:

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::* - возвращает любой элемент , который является прямым родителем.

В этом случае вывод <div class="parent">

  1. //span/parent::div[@class="parent"] - возвращает родительский элемент только точного типа узла и только , если указанный предикат - True.

Выход: <div class="parent">

  1. //span/ancestor::* - возвращает всех предков (включая родителя).

Выход: <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor"> ...

  1. //span/ancestor-or-self::* - возвращает все предков и .

Выход: <span>Child</span>, <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor"> ...

  1. //span/ancestor::div[2] - возвращает второго предка (начиная с родителя) типа div.

Выход: <div class="third_level_ancestor">

12
ответ дан Andersson 15 August 2018 в 15:32
поделиться

позволяет рассматривать ваш dom как

<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>

Теперь, когда вам нужно выбрать родительский тег 'a' на основе текста <span>, используйте

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));

Объяснение: Выберите узел на основе значения его дочернего узла

10
ответ дан Bhuvanesh Mani 15 August 2018 в 15:32
поделиться
  • 1
    Если мы ищем div, который снова вложен в несколько div, тогда вместо .//span в By.xpath("//div[.//span[text()='Close']]") мы можем использовать *//span, он будет искать большинство родительских элементов div данного диапазона. Теперь это будет выглядеть так driver.findElement(By.xpath("//div[*//span[text()='Close']]")); – Jai Prak 20 June 2018 в 09:25

Взгляните на возможные оси XPath , вы, вероятно, ищете parent. В зависимости от того, как вы находите первый элемент, вы можете просто настроить xpath для этого.

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

13
ответ дан drkthng 15 August 2018 в 15:32
поделиться

Вы можете сделать это, используя / parent :: node () в xpath. Просто добавьте / parent :: node () к дочерним элементам xpath.

Например: пусть xpath дочернего элемента - childElementXpath .

Тогда xpath его непосредственного предка будет childElementXpath / parent :: node ( ) .

Xpath своего следующего предка будет childElementXpath / parent :: node () / parent :: node ()

и и так далее.

Кроме того, вы можете перейти к предку элемента с помощью 'childElementXpath/ancestor::*[@attr="attr_value"]' . Это было бы полезно, если у вас есть дочерний элемент, который является уникальным, но имеет родительский элемент, который не может быть идентифицирован однозначно.

0
ответ дан Johnes Jose 15 August 2018 в 15:32
поделиться

Мы можем выбрать родительский тег с помощью Selenium следующим образом:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));

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

Нравится:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));

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

0
ответ дан Moritz 15 August 2018 в 15:32
поделиться

Это может быть полезно для кого-то другого: использование этого примера html

<div class="ParentDiv">
    <label for="label">labelName</label>
    <input type="button" value="elementToSelect">
</div>
<div class="DontSelect">
    <label for="animal">pig</label>
    <input type="button" value="elementToSelect">
</div>

Если, например, я хочу выбрать элемент в том же разделе (например, div) в качестве метки, вы можете использовать это

//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect'] 

Это просто означает, что вы ищете метку (это может быть как a, h2), называемое labelName. Перейдите к родительскому элементу этой метки (т. Е. div class="ParentDiv"). Найдите в потомках этого родителя, чтобы найти дочерний элемент со значением elementToSelect. При этом он не будет выбирать второй elementToSelect с DontSelect div как родительский.

Фокус в том, что вы можете уменьшить области поиска для элемента, сначала перейдя к родительскому объекту, а затем выполните поиск потомка этот родительский элемент для элемента, который вам нужен. В некоторых случаях также можно использовать другой синтаксис, например following-sibling::h2. Это означает следующий элемент h2. Это будет работать для элементов на одном уровне с одним и тем же родителем.

4
ответ дан papigee 15 August 2018 в 15:32
поделиться

Там есть пара вариантов. Код примера находится на Java, но порт на другие языки должен быть простым.

JavaScript:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
                                   "return arguments[0].parentNode;", myElement);

XPath:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath(".."));

Получение драйвер из WebElement

Примечание. Как вы можете видеть, для версии JavaScript вам понадобится driver. Если у вас нет прямого доступа к нему, вы можете получить его из WebElement, используя:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
119
ответ дан Peter Mortensen 15 August 2018 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: