Ich habe ein bestimmtes Element, das ich mit Selenium 1 auswählen kann.
Leider muss ich auf das übergeordnete Element klicken, um das gewünschte Verhalten zu erhalten. Das Element, das ich leicht finden kann, hat ein Attribut, das nicht ausgewählt werden kann. Wie navigiere ich mit XPath aufwärts?
Dort gibt es mehrere Möglichkeiten. Der Beispielcode ist in Java, ein Port für andere Sprachen sollte jedoch unkompliziert sein.
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
Hinweis: Wie Sie sehen, benötigen Sie für die JavaScript-Version diedriver
. Wenn Sie keinen direkten Zugriff darauf haben, können Sie es von der WebElement
abrufen:
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
Ein wenig mehr über XPath axes
Nehmen wir an, wir haben folgende HTML
-Struktur:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
- gibt jedes Element zurück, das direkt übergeordnet ist. In diesem Fall lautet die Ausgabe <div class="parent">
//span/parent::div[@class="parent"]
- gibt das übergeordnete Element only des genauen Knotentyps und only zurück, wenn das angegebene Prädikat "True" ist. Ausgabe: <div class="parent">
//span/ancestor::*
- gibt alle Vorfahren zurück (einschließlich der übergeordneten). Ausgabe: <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor-or-self::*
- gibt alle Vorfahren und aktuelles Element selbst zurück.Ausgabe: <span>Child</span>
, <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor::div[2]
- gibt den zweiten Vorfahren vom Typ div
zurück (beginnend mit dem übergeordneten Element). Ausgabe: <div class="third_level_ancestor">
Schauen Sie sich die möglichen XPath-Achsen an, Sie suchen wahrscheinlich nach parent
. Je nachdem, wie Sie das erste Element finden, können Sie den Xpath dafür anpassen.
Alternativ können Sie die Doppelpunkt-Syntax , ..
verwenden, die den übergeordneten Knoten des aktuellen Knotens auswählt.
Betrachten wir Ihr DOM als
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
Nun müssen Sie das übergeordnete Tag 'a' basierend auf <span>
-Text auswählen und dann verwenden
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
Erläuterung: Wählen Sie den Knoten basierend auf dem Wert seines untergeordneten Knotens aus
Dies kann für andere Personen nützlich sein: Verwenden dieser Beispiel-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>
Wenn ich zum Beispiel ein Element im selben Abschnitt (z. B. div) als Beschriftung auswählen möchte, können Sie dieses verwenden
//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect']
Dies bedeutet nur, dass Sie nach einem Label suchen (es könnte etwas wie a
, h2
) mit dem Namen labelName
sein. Navigieren Sie zum übergeordneten Element dieser Bezeichnung (d. H. div class="ParentDiv"
). Suchen Sie in den Nachkommen dieses übergeordneten Elements nach einem untergeordneten Element mit dem Wert von elementToSelect
. Dadurch wird die zweite elementToSelect
mit DontSelect
div nicht als übergeordnetes Element ausgewählt.
Der Trick besteht darin, dass Sie die Suchbereiche für ein Element reduzieren können, indem Sie zuerst zum übergeordneten Element navigieren und dann nach dem Nachkommen dieses übergeordneten Elements nach dem von Ihnen benötigten Element suchen. __ Andere Syntax wie following-sibling::h2
kann in einigen Fällen auch verwendet werden. Dies bedeutet das gleichgeordnete Element h2
. Dies funktioniert für Elemente auf derselben Ebene mit demselben übergeordneten Element.
Wir können das übergeordnete Tag mit Hilfe von Selenium wie folgt auswählen:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
dies hilft Ihnen, den Großelternteil des bekannten Elements zu finden. Entfernen Sie einfach eines (/ ..), um das unmittelbare übergeordnete Element zu finden.
Mögen:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
Es gibt einige andere Möglichkeiten, dies zu implementieren, aber es hat gut funktioniert.
Sie können dies tun, indem Sie im xpath / parent :: node () verwenden. Hängen Sie einfach / parent :: node () an die xpath der untergeordneten Elemente.
Beispiel: Der xpath des untergeordneten Elements lautet childElementXpath.
Dann wäre xpath seines unmittelbaren Vorfahren childElementXpath/parent :: node ().
Xpath seines nächsten Vorfahren wäre childElementXpath/parent :: node ()/parent :: node ()
und so weiter..
Sie können auch mit 'childElementXpath/ancestor::*[@attr="attr_value"]'
zu einem Vorfahren eines Elements navigieren. Dies ist nützlich, wenn Sie über ein bekanntes untergeordnetes Element verfügen, das eindeutig ist, jedoch über ein übergeordnetes Element verfügt, das nicht eindeutig identifiziert werden kann.