webentwicklung-frage-antwort-db.com.de

Wählen Sie das übergeordnete Element eines bekannten Elements in Selenium aus

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?

83
f l

Dort gibt es mehrere Möglichkeiten. Der Beispielcode ist in Java, ein Port für andere Sprachen sollte jedoch unkompliziert sein.

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

Beziehen des Treibers von der 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();
133
acdcjunior

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>
  1. //span/parent::* - gibt jedes Element zurück, das direkt übergeordnet ist. 

In diesem Fall lautet die Ausgabe <div class="parent"> 

  1. //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"> 

  1. //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">... 

  1. //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">...

  1. //span/ancestor::div[2] - gibt den zweiten Vorfahren vom Typ div zurück (beginnend mit dem übergeordneten Element). 

Ausgabe: <div class="third_level_ancestor">

22
Andersson

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.

13
prestomanifesto

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

12
Bhuvanesh Mani

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.

4
papigee

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.

0
Utsav Jain

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.

0
Johnes Jose