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 ?

fl
sumber

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

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

Bhuvanesh Mani
sumber
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
14

Lihatlah sumbu XPath yang mungkin , yang mungkin Anda cari parent. Bergantung pada bagaimana Anda menemukan elemen pertama, Anda bisa menyesuaikan xpath untuk itu.

Atau Anda dapat mencoba sintaks titik ganda , ..yang memilih induk dari node saat ini.

prestomanifesto
sumber
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.

papigee
sumber
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.

Johnes Jose
sumber
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.

Utsav Jain
sumber