Yanıtlar:
Orada birkaç seçenek var. Örnek kod Java'dadır, ancak diğer dillere bağlantı basit olmalıdır.
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("./.."));
WebElementNot: Gördüğünüz gibi, JavaScript sürümü için driver. Doğrudan erişiminiz yoksa, aşağıdakileri WebElementkullanarak geri alabilirsiniz :
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
By.xpath(“./..”)kullanırken doğru DOM ağacı yürümeye element.findElement. Bağlam düğümünü ayarlamak için baştaki "./" gereklidir.
Hakkında biraz daha XPath axes
Diyelim ki aşağıdaki HTMLyapıya sahibiz :
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*- doğrudan ebeveyn olan herhangi bir öğeyi döndürür .Bu durumda çıktı <div class="parent">
//span/parent::div[@class="parent"]- yalnızca tam düğüm türündeki ana öğeyi döndürür ve yalnızca belirtilen koşul Doğru ise.Çıktı: <div class="parent">
//span/ancestor::*- tüm ataları döndürür (ebeveyn dahil).Çıktı: <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...
//span/ancestor-or-self::*- tüm ataları ve geçerli öğeyi döndürür .Çıktı: <span>Child</span>, <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...
//span/ancestor::div[2]- türün ikinci atasını (ebeveynden başlayarak) döndürür div.Çıktı: <div class="third_level_ancestor">
DOM'nuzu şöyle düşünelim:
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
Artık <span>metne göre "a" üst etiketini seçmeniz gerektiğine göre , ardından şunu kullanın:
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
Açıklama: Düğümü, alt düğümünün değerine göre seçin
divHangisinin birden çok div ile iç içe geçmiş olduğunu arıyorsak , o zaman .//spanin yerine By.xpath("//div[.//span[text()='Close']]")kullanabiliriz *//span, verilen aralıktaki çoğu ebeveyn div öğesini arayacaktır. Şimdi şöyle görünecekdriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
Olası XPath eksenlerine bir göz atın, muhtemelenparent . İlk öğeyi nasıl bulduğunuza bağlı olarak, bunun için xpath'i ayarlayabilirsiniz.
Alternatif deneyebileceğiniz çift nokta sözdizimi , ..geçerli düğümün ebeveynini seçer.
Bu başka biri için yararlı olabilir: Bu örnek html'yi kullanma
<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>
Örneğin, aynı bölümdeki bir öğeyi (örn. Div) bir etiket olarak seçmek istersem, bunu kullanabilirsiniz
//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect']
Bu sadece a, h2adı verilen bir etiketi arayın (herhangi bir şey olabilir ) anlamına gelir labelName. Bu etiketin üstüne gidin (yani div class="ParentDiv"). Değerine sahip herhangi bir alt öğe bulmak için bu ebeveynin soyundan gelenler içinde arama yapın elementToSelect. Bununla ikinciyi elementToSelectseçmeyecekDontSelect ebeveyn olarak div.
İşin püf noktası, önce ebeveyne gidip daha sonra ihtiyacınız olan element için o ebeveynin soyundan gelenleri arayarak bir öğenin arama alanlarını azaltabilmenizdir. Benzer diğer Sözdizimi following-sibling::h2de bazı durumlarda kullanılabilir. Bu, kardeşi takip eden kardeş anlamına gelir h2. Bu, aynı ebeveyni olan aynı seviyedeki öğeler için çalışacaktır.
Bunu xpath içinde / parent :: node () kullanarak yapabilirsiniz . Xpath alt öğelerine / parent :: node () öğesini ekleyin .
Örneğin: xpath of child element, childElementXpath olsun .
O zaman, yakın atasının xpath'i childElementXpath / parent :: node () olacaktır .
Bir sonraki atasının X yolu childElementXpath / parent :: node () / parent :: node () olacaktır.
ve bunun gibi..
Ayrıca, kullanarak bir elemanın atasına gidebilirsiniz
'childElementXpath/ancestor::*[@attr="attr_value"]'. Bu, benzersiz olan ancak benzersiz olarak tanımlanamayan bir ana öğeye sahip bilinen bir alt öğeniz olduğunda yararlı olacaktır.
Selenium yardımıyla ana etiketi şu şekilde seçebiliriz:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
bu, bilinen Unsurun büyük ebeveynini bulmanıza yardımcı olacaktır. Hemen Üst Öğeyi bulmak için birini (/ ..) kaldırın.
Sevmek:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
Bunu uygulamanın başka yolları da var, ancak benim için iyi çalıştı.