Seleziona l'elemento genitore dell'elemento noto in selenio


116

Ho un certo elemento che posso selezionare con Selenio 1.

Purtroppo devo fare clic sull'elemento genitore per ottenere il comportamento desiderato. L'elemento che posso facilmente individuare ha un attributo non selezionabile, rendendolo morto per il clic. Come si naviga verso l'alto con XPath ?

Risposte:


169

Ci sono un paio di opzioni lì. Il codice di esempio è in Java, ma una conversione in altri linguaggi dovrebbe essere semplice.

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("./.."));

Ottenere il driver dal file WebElement

Nota: come puoi vedere, per la versione JavaScript avrai bisogno del file driver. Se non hai accesso diretto ad esso, puoi recuperarlo WebElementutilizzando:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();

41
E se vuoi navigare fino al nonno, usa By.Xpath ("../ ..").
Monsignore

@Monsignor funziona proprio come i percorsi dei file ... o percorsi URL: stackoverflow.com/questions/8577636/../../questions/8577636/...
jpaugh

Nessuno di questi XPath è corretto per l'uso con selenio. Uno ha bisogno di usare By.xpath(“./..”)per camminare correttamente sull'albero DOM durante l'uso element.findElement. Il "./" iniziale è necessario per impostare il nodo del contesto.
JimEvans

35

Poco di più XPath axes

Diciamo che abbiamo la HTMLstruttura seguente :

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::*- restituisce qualsiasi elemento che è genitore diretto.

In questo caso l'output è <div class="parent">

  1. //span/parent::div[@class="parent"]- restituisce l'elemento genitore solo del tipo di nodo esatto e solo se il predicato specificato è True.

Produzione: <div class="parent">

  1. //span/ancestor::*- restituisce tutti gli antenati (incluso il genitore).

Uscita: <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor-or-self::*- restituisce tutti gli antenati e l'elemento corrente stesso.

Uscita: <span>Child</span>, <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor::div[2]- restituisce il secondo antenato (a partire dal genitore) di tipo div.

Produzione: <div class="third_level_ancestor">


Ciao @ Anderson, ho bisogno di aiuto con la mia domanda Hai tempo per dare un'occhiata? Grazie in anticipo. stackoverflow.com/questions/54647055/...

18

Consideriamo il tuo DOM come

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

Ora che è necessario selezionare il tag principale "a" in base al <span>testo, quindi utilizzare

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

Spiegazione: selezionare il nodo in base al valore del suo nodo figlio


Se siamo alla ricerca di divche è di nuovo nidificato con più div allora invece di .//spana By.xpath("//div[.//span[text()='Close']]")possiamo usare *//span, cercherà per la maggior parte genitori elemento div di determinato periodo. Ora sarà simile a questodriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
Jai Prak,

14

Dai un'occhiata ai possibili assi XPath , che probabilmente stai cercandoparent . A seconda di come stai trovando il primo elemento, potresti semplicemente regolare xpath per quello.

In alternativa puoi provare la sintassi del doppio punto , ..che seleziona il genitore del nodo corrente.


5

Questo potrebbe essere utile per qualcun altro: utilizzando questo html di esempio

<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 ad esempio, voglio selezionare un elemento nella stessa sezione (es. Div) come etichetta, puoi usarlo

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

Questo significa solo, cerca un'etichetta (potrebbe essere qualcosa di simile a, h2) chiamata labelName. Vai al genitore di quell'etichetta (cioè div class="ParentDiv"). Cerca tra i discendenti di quel genitore per trovare qualsiasi elemento figlio con il valore di elementToSelect. Con questo, non selezionerà il secondo elementToSelectconDontSelect div come genitore.

Il trucco è che puoi ridurre le aree di ricerca per un elemento navigando prima al genitore e poi cercando nel discendente di quel genitore l'elemento che ti serve. following-sibling::h2In alcuni casi possono essere utilizzate anche altre sintassi simili . Ciò significa l'elemento che segue il fratello h2. Funzionerà per elementi allo stesso livello, con lo stesso genitore.


0

Puoi farlo usando / parent :: node () in xpath. Aggiungi semplicemente / parent :: node () agli elementi figlio xpath.

Ad esempio: Lascia che xpath dell'elemento figlio sia childElementXpath .

Quindi xpath del suo antenato immediato sarebbe childElementXpath / parent :: node () .

Xpath del suo prossimo antenato sarebbe childElementXpath / parent :: node () / parent :: node ()

e così via..

Inoltre, puoi navigare a un antenato di un elemento utilizzando 'childElementXpath/ancestor::*[@attr="attr_value"]'. Ciò sarebbe utile quando si dispone di un elemento figlio noto che è unico ma ha un elemento padre che non può essere identificato in modo univoco.


0

Possiamo selezionare il tag genitore con l'aiuto di Selenium come segue:

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

questo ti aiuterà a trovare il nonno dell'Elemento conosciuto. Rimuovine uno (/ ..) per trovare l'elemento genitore immediato.

Piace:

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

Ci sono altri modi per implementarlo, ma per me ha funzionato bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.