Выберите родительский элемент известного элемента в Selenium

У меня есть определенный элемент, который я могу выбрать с помощью Selenium 1.

К сожалению, мне нужно щелкнуть родительский элемент, чтобы получить желаемое поведение. Элемент, который я могу легко найти, имеет атрибут unselectable, делающий его мертвым для щелчка. Как перейти вверх с помощью XPath?

Ответ 1

Там есть пара вариантов. Код примера находится на 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();

Ответ 2

Немного больше об 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">

Ответ 3

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

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

Ответ 4

Давайте рассмотрим ваш DOM как

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

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

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

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

Ответ 5

Это может быть полезно для кого-то еще: Использование этого примера 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. При этом он не выберет второй elementToSelect с DontSelect div в качестве родительского.

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

Ответ 6

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

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

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

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

и т.д.

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

Ответ 7

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

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

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

Как

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

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