Risposte:
Ci sono un paio di opzioni lì. Il codice di esempio è in Java, ma una conversione in altri linguaggi dovrebbe essere semplice.
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("./.."));
WebElementNota: 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();
By.xpath(“./..”)per camminare correttamente sull'albero DOM durante l'uso element.findElement. Il "./" iniziale è necessario per impostare il nodo del contesto.
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>
//span/parent::*- restituisce qualsiasi elemento che è genitore diretto.In questo caso l'output è <div class="parent">
//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">
//span/ancestor::*- restituisce tutti gli antenati (incluso il genitore).Uscita: <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...
//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">...
//span/ancestor::div[2]- restituisce il secondo antenato (a partire dal genitore) di tipo div.Produzione: <div class="third_level_ancestor">
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
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']]"));
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.
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.
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.
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.