Respostas:
Existem algumas opções lá. O código de amostra está em Java, mas uma porta para outras linguagens deve ser direta.
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
Nota: Como você pode ver, para a versão JavaScript você precisará do driver
. Se você não tiver acesso direto a ele, pode recuperá-lo WebElement
usando:
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
By.xpath(“./..”)
para subir corretamente a árvore DOM ao usar element.findElement
. O primeiro “./“ é necessário para definir o nó de contexto.
Um pouco mais sobre XPath axes
Digamos que temos a HTML
estrutura abaixo :
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
- retorna qualquer elemento que seja pai direto.Neste caso, a saída é <div class="parent">
//span/parent::div[@class="parent"]
- retorna o elemento pai apenas do tipo de nó exato e apenas se o predicado especificado for True.Resultado: <div class="parent">
//span/ancestor::*
- retorna todos os ancestrais (incluindo o pai).Saída: <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor-or-self::*
- retorna todos os ancestrais e o próprio elemento atual.Saída: <span>Child</span>
, <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor::div[2]
- retorna o segundo ancestral (começando do pai) do tipo div
.Resultado: <div class="third_level_ancestor">
Vamos considerar o seu DOM como
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
Agora que você precisa selecionar a tag pai 'a' com base no <span>
texto, use
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
Explicação: Selecione o nó com base no valor de seu nó filho
div
qual está novamente aninhado com vários divs, então, em vez de .//span
in By.xpath("//div[.//span[text()='Close']]")
, podemos usar *//span
, ele irá procurar a maioria dos elementos div pai de determinado período. Agora será parecido com istodriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
Dê uma olhada nos possíveis eixos XPath que você provavelmente está procurando parent
. Dependendo de como você está encontrando o primeiro elemento, você pode apenas ajustar o xpath para isso.
Como alternativa, você pode tentar a sintaxe de ponto duplo , ..
que seleciona o pai do nó atual.
Isso pode ser útil para outra pessoa: Usando este exemplo de 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>
Se, por exemplo, eu quiser selecionar um elemento na mesma seção (por exemplo, div) como um rótulo, você pode usar este
//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect']
Isso significa apenas, procure um rótulo (poderia ser qualquer coisa como a
, h2
) chamado labelName
. Navegue até o pai dessa etiqueta (ou seja div class="ParentDiv"
). Pesquise nos descendentes desse pai para encontrar qualquer elemento filho com o valor de elementToSelect
. Com isso, ele não selecionará o segundo elementToSelect
com DontSelect
div como pai.
O truque é que você pode reduzir as áreas de pesquisa de um elemento navegando até o pai primeiro e, em seguida, pesquisando no descendente desse pai o elemento de que você precisa. Outra sintaxe semelhante following-sibling::h2
também pode ser usada em alguns casos. Isso significa o elemento irmão seguinte h2
. Isso funcionará para elementos no mesmo nível, tendo o mesmo pai.
Você pode fazer isso usando / parent :: node () no xpath. Simplesmente anexe / parent :: node () aos elementos filhos xpath.
Por exemplo: Deixe xpath do elemento filho ser childElementXpath .
Então xpath de seu ancestral imediato seria childElementXpath / parent :: node () .
Xpath de seu próximo ancestral seria childElementXpath / parent :: node () / parent :: node ()
e assim por diante..
Além disso, você pode navegar até um ancestral de um elemento usando
'childElementXpath/ancestor::*[@attr="attr_value"]'
. Isso seria útil quando você tiver um elemento filho conhecido que é único, mas possui um elemento pai que não pode ser identificado exclusivamente.
Podemos selecionar a tag pai com a ajuda do Selenium da seguinte maneira:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
isso o ajudará a encontrar o avô do elemento conhecido. Basta remover um (/ ..) para encontrar o elemento pai imediato.
Gostar:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
Existem algumas outras maneiras de implementar isso, mas funcionou bem para mim.