Pilih elemen induk dari elemen yang diketahui di Selenium


116

Saya memiliki elemen tertentu yang dapat saya pilih dengan Selenium 1.

Sayangnya saya perlu mengklik elemen induk untuk mendapatkan perilaku yang diinginkan. Elemen yang dapat saya temukan dengan mudah memiliki atribut unselectable, membuatnya mati untuk diklik. Bagaimana cara menavigasi ke atas dengan XPath ?

Jawaban:


169

Ada beberapa opsi di sana. Kode sampel ada di Java, tetapi port ke bahasa lain harus langsung.

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

Mendapatkan pengemudi dari WebElement

Catatan: Seperti yang Anda lihat, untuk versi JavaScript Anda memerlukan driver. Jika Anda tidak memiliki akses langsung ke sana, Anda dapat mengambilnya dari WebElementmenggunakan:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();

41
Dan jika ingin menavigasi ke eyang, gunakan By.Xpath ("../ ..").
Monsinyur

@Monsignor Bekerja seperti jalur file ... atau jalur URL: stackoverflow.com/questions/8577636/../../questions/8577636/…
jpaugh

Tak satu pun dari XPath ini benar untuk digunakan dengan Selenium. Seseorang perlu menggunakannya By.xpath(“./..”)untuk berjalan di pohon DOM dengan benar saat menggunakan element.findElement. Pengantar "./" diperlukan untuk mengatur simpul konteks.
JimEvans

35

Sedikit lebih banyak tentang XPath axes

Katakanlah kita memiliki HTMLstruktur di bawah ini :

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::*- mengembalikan elemen apa pun yang merupakan induk langsung.

Dalam hal ini keluarannya adalah <div class="parent">

  1. //span/parent::div[@class="parent"]- mengembalikan elemen induk hanya dari tipe node yang tepat dan hanya jika predikat yang ditentukan adalah True.

Keluaran: <div class="parent">

  1. //span/ancestor::*- mengembalikan semua leluhur (termasuk orang tua).

Output: <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor-or-self::*- mengembalikan semua leluhur dan elemen saat ini itu sendiri.

Output: <span>Child</span>, <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor::div[2]- mengembalikan leluhur kedua (mulai dari induk) dari tipe div.

Keluaran: <div class="third_level_ancestor">


Halo @Anderson Saya butuh bantuan untuk pertanyaan saya Apakah Anda punya waktu untuk melihat-lihat? Terima kasih sebelumnya. stackoverflow.com/questions/54647055/…

18

Anggap DOM Anda sebagai

<a>
    <!-- some other icons and texts -->
    <span>Close</span>
</a>

Sekarang Anda perlu memilih tag induk 'a' berdasarkan <span>teks, lalu gunakan

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));

Penjelasan: Pilih node berdasarkan nilai node turunannya


Jika kita mencari divyang lagi bersarang dengan beberapa div maka alih-alih .//spandi By.xpath("//div[.//span[text()='Close']]")kita bisa menggunakan *//span, itu akan mencari sebagian besar elemen div induk dari rentang yang diberikan. Sekarang akan terlihat seperti inidriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
Jai Prak


5

Ini mungkin berguna untuk orang lain: Menggunakan html contoh ini

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

Jika misalnya, saya ingin memilih elemen di bagian yang sama (misalnya div) sebagai label, Anda dapat menggunakan ini

//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect'] 

Artinya, cari label (bisa apa saja a, h2) bernama labelName. Arahkan ke induk label itu (yaitu div class="ParentDiv"). Cari di dalam turunan dari induk tersebut untuk menemukan elemen anak dengan nilai elementToSelect. Dengan ini, itu tidak akan memilih yang kedua elementToSelectdengan DontSelectdiv sebagai induk.

Triknya adalah Anda dapat mengurangi area pencarian untuk elemen dengan menavigasi ke induk terlebih dahulu dan kemudian mencari turunan dari induk tersebut untuk elemen yang Anda butuhkan. Sintaks lain seperti following-sibling::h2juga dapat digunakan dalam beberapa kasus. Ini berarti elemen saudara berikut h2. Ini akan bekerja untuk elemen pada level yang sama, memiliki induk yang sama.


0

Anda bisa melakukan ini dengan menggunakan / parent :: node () di xpath. Cukup tambahkan / parent :: node () ke elemen anak xpath.

Misalnya: Misalkan xpath dari elemen anak adalah childElementXpath .

Kemudian xpath dari leluhur terdekatnya akan menjadi childElementXpath / parent :: node () .

Xpath leluhur berikutnya akan menjadi childElementXpath / parent :: node () / parent :: node ()

dan seterusnya..

Selain itu, Anda bisa menavigasi ke leluhur elemen menggunakan 'childElementXpath/ancestor::*[@attr="attr_value"]'. Ini akan berguna ketika Anda memiliki elemen turunan yang diketahui unik tetapi memiliki elemen induk yang tidak dapat diidentifikasi secara unik.


0

Kita dapat memilih tag induk dengan bantuan Selenium sebagai berikut:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));

ini akan membantu Anda menemukan kakek nenek dari Elemen yang diketahui. Hapus saja satu (/ ..) untuk menemukan Elemen Induk langsung.

Suka:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));

Ada beberapa cara lain untuk menerapkan ini, tetapi ini berfungsi dengan baik untuk saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.