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("./.."));
WebElement
Nota: come puoi vedere, per la versione JavaScript avrai bisogno del file driver
. Se non hai accesso diretto ad esso, puoi recuperarlo WebElement
utilizzando:
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 HTML
struttura 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
div
che è di nuovo nidificato con più div allora invece di .//span
a 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 elementToSelect
conDontSelect
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::h2
In 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.