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("./.."));
WebElement
Not: Gördüğünüz gibi, JavaScript sürümü için driver
. Doğrudan erişiminiz yoksa, aşağıdakileri WebElement
kullanarak 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 HTML
yapı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
div
Hangisinin birden çok div ile iç içe geçmiş olduğunu arıyorsak , o zaman .//span
in 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
, h2
adı 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 elementToSelect
seç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::h2
de 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ı.