Selenium'da bilinen öğenin ana öğesini seçin


116

Selenium 1 ile seçebileceğim belirli bir elementim var .

Maalesef istenen davranışı elde etmek için ana öğeye tıklamam gerekiyor. Kolayca bulabildiğim öğenin seçilemez niteliği var, bu da onu tıklamak için ölü yapıyor. XPath ile nasıl yukarı doğru gezinirim ?

Yanıtlar:


169

Orada birkaç seçenek var. Örnek kod Java'dadır, ancak diğer dillere bağlantı basit olmalıdır.

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

Sürücüyü WebElement

Not: 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();

41
Büyük ebeveyne gitmek istiyorsanız, By.Xpath ("../ ..") kullanın.
Monsenyör

@Monsignor, tıpkı dosya yolları gibi çalışır ... veya URL yolları: stackoverflow.com/questions/8577636/../../questions/8577636/…
jpaugh

Bu XPath'lerin hiçbiri Selenium ile kullanım için doğru değildir. Bir ihtiyaçları kullanmaya 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.
JimEvans

35

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>
  1. //span/parent::*- doğrudan ebeveyn olan herhangi bir öğeyi döndürür .

Bu durumda çıktı <div class="parent">

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

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

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

  1. //span/ancestor::div[2]- türün ikinci atasını (ebeveynden başlayarak) döndürür div.

Çıktı: <div class="third_level_ancestor">


Merhaba @Anderson Sorumla ilgili yardıma ihtiyacım var Göz atmak için vaktiniz var mı? Şimdiden teşekkür ederim. stackoverflow.com/questions/54647055/…

18

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']]"));
Jai Prak


5

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.


0

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.


0

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ı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.