Я использую <span style="display: inline-block; width: 2ch;">	</span>
для вкладок шириной в два символа.
Немного больше о XPath axes
Допустим, что мы имеем структуру ниже HTML
:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
- возвращает любой элемент , который является прямым родителем. В этом случае вывод <div class="parent">
//span/parent::div[@class="parent"]
- возвращает родительский элемент только точного типа узла и только , если указанный предикат - True. Выход: <div class="parent">
//span/ancestor::*
- возвращает всех предков (включая родителя). Выход: <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor-or-self::*
- возвращает все предков и . Выход: <span>Child</span>
, <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor::div[2]
- возвращает второго предка (начиная с родителя) типа div
. Выход: <div class="third_level_ancestor">
позволяет рассматривать ваш dom как
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
Теперь, когда вам нужно выбрать родительский тег 'a' на основе текста <span>
, используйте
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
Объяснение: Выберите узел на основе значения его дочернего узла
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 для этого.
В качестве альтернативы вы можете попробовать синтаксис с двумя точками , ..
, который выбирает родительский текущего узла.
Вы можете сделать это, используя / parent :: node () в xpath. Просто добавьте / parent :: node () к дочерним элементам xpath.
Например: пусть xpath дочернего элемента - childElementXpath .
Тогда xpath его непосредственного предка будет childElementXpath / parent :: node ( ) .
Xpath своего следующего предка будет childElementXpath / parent :: node () / parent :: node ()
и и так далее.
Кроме того, вы можете перейти к предку элемента с помощью 'childElementXpath/ancestor::*[@attr="attr_value"]'
. Это было бы полезно, если у вас есть дочерний элемент, который является уникальным, но имеет родительский элемент, который не может быть идентифицирован однозначно.
Мы можем выбрать родительский тег с помощью Selenium следующим образом:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
это поможет вам найти прародителя известного Элемента. Просто удалите один (/ ..), чтобы найти ближайший родительский элемент.
Нравится:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
Есть некоторые другие способы реализовать это, но он отлично работает для меня.
Это может быть полезно для кого-то другого: использование этого примера 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
. Это будет работать для элементов на одном уровне с одним и тем же родителем.
Там есть пара вариантов. Код примера находится на Java, но порт на другие языки должен быть простым.
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath(".."));
WebElement
Примечание. Как вы можете видеть, для версии JavaScript вам понадобится driver
. Если у вас нет прямого доступа к нему, вы можете получить его из WebElement
, используя:
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();