XPath ile CSS sınıfına göre bir öğeyi nasıl bulabilirim?


Yanıtlar:


474

Bu seçici çalışmalıdır, ancak uygun işaretlemenizle değiştirirseniz daha verimli olur:

//*[contains(@class, 'Test')]

Veya aranan elementin bir olduğunu bildiğimiz için div:

//div[contains(@class, 'Test')]

Ancak bu, class="Testvalue"veya gibi vakalarla da eşleşeceğinden class="newTest", @ Tomalak'ın yorumlarda sağlanan sürümü daha iyidir :

//div[contains(concat(' ', @class, ' '), ' Test ')]

Doğru şekilde eşleşeceğinden emin olmak istiyorsanız, sınıf adının etrafındaki başıboş boşluk karakterlerini temizlemek için normalleştirme alanı işlevini de kullanabilirsiniz (@Terry tarafından belirtildiği gibi):

//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]

Belgedeki her bir öğeyi belirtilen koşul için aramak istemiyorsanız, tüm bu sürümlerde, * öğesinin en iyi şekilde eşleştirmek istediğiniz öğe adıyla değiştirilmesi gerektiğini unutmayın.


37
@meder: Daha çok //div[contains(concat(' ', @class, ' '), ' Test ')]- Sizinki de kısmi eşleşmeler yapacak.
Tomalak

5
Neden sadece // div [@ class = 'Test'] yapmıyorsun
Jessica

11
Sınıflar birden fazla değer içerebileceğinden
meder omuraliev

8
Xpath'in boşlukla ayrılmış bir jeton listesinde bir jeton bulmak için kısayol / daha etkili bir yolu olmadığına şaşırdım. Xpath'ın sonraki sürümlerinde bir şey var mı?
thomasrutter

1
@thomasrutter neden bu sürpriz - bu sadece XML için yapılmış bir dildir, daha spesifik bir HTML değildir ve kimin boşlukta ayrılmış listeleri XML'de herhangi bir düğüm değeri olarak kullanmanın rahat olduğunu söyleyebilir. Tomalak'ın çözümü çok uygun bir çözümdür.
bitoolean

152

En kolay yol ..

//div[@class="Test"]

<div class="Test">Açıklandığı gibi bulmak istediğinizi varsayarsak .


3
Yukarıdaki sözdiziminin kullanımı çok daha kolaydır ve daha az hataya açıktır. Arama yapmak için sınıfın etrafında ÇİFT TEKLİFLERİNİZ olması gerekir. Yukarıda listelenen kullanmanızı tavsiye ederim. // div [@ class = "Test"]
FlyingV

Bu div [class = 'Test'] 'in daha derin seviyede olduğu durumlar için işe yarıyor mu?
Jake0x32

1
@ Jake0x32, çünkü //sadece kullanmıyor /.
Solomon Ucko

7
`<Div class =" Test some-other-class "> ile eşleşiyor mu?
Jugal Thakkar

11
@JugalThakkar Hayır, değil. Çalışması için tam bir eşleşme gerekir, ancak bunun yerine // div [içerir (@class, "Test")] 'i deneyebilirsiniz.
Olli Puljula

29

SADECE doğru yolu XPath ile bunu yapmak için:

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

İşlev normalize-space, boşlukları takip eden ve takip eden boşlukları sıyırır ve ayrıca boşluk karakterleri dizilerini tek bir boşlukla değiştirir.


Not

Bu Xpath sorgularının çoğuna ihtiyaç duymazsanız, CSS seçicilerinin XPath sorgularına göre okunması ve yazılması genellikle çok daha kolay olduğu için CSS seçicilerini XPath'a dönüştüren bir kitaplık kullanmak isteyebilirsiniz. Örneğin, bu durumda, her ikisini div[class~="Test"]ve div.Testaynı sonucu elde etmek için kullanabilirsiniz .

Bulabildiğim bazı kütüphaneler:


24

Tomalak'ın uzun zaman önce meder'in cevabına bir yorum olarak sağladığı için bunu sadece cevap olarak veriyorum

//div[contains(concat(' ', @class, ' '), ' Test ')]

3
Bunu böyle bir zaman önce ortaya koyduğum için üzgünüm, ama concat(' ', normalize-space(@class), ' ')her türlü beyaz boşluk karakterini de hesaba katmaya ne dersiniz ?
Terry

Merak uğruna - Neden //div[contains(concat(' ', @class, ' '), ' Test ')]/chidçocukları seçmiyor?
Fusion

@ Fusion, bunu bir soru olarak gönderirseniz, bir yanıt alabilirsiniz.
bitoolean

@bitoolean Kaptan Cbvious olmak bugünlerde zor
Fusion

@ Fusion Sadece yardım etmeye çalışıyordum. XPath HTML uyumlu bir dil değildir. Daha genel, yalnızca XML. İçinde herhangi bir deneyimim yok, ancak etiketi yerine kimliği koyabileceğinizi sanıyorsunuz. "İd" özelliğinin değerini seçmeniz gerekir. Bu yüzden HTML belgesini XML olarak düşünmeniz gerekir. Konu dışı tartışmalar insanların çözüm bulmasına yardımcı olmaz.
bitoolean

1

Önceki cevaplardan faydalı bir işlev yapılabilir:

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

Ardından, işlev çağrısını sorgunuza tamamlayın.


Bu kod yalnızca PHP'de çalışır. Bundan bahsedebilirdin.
bitoolean

0

Boşluğu olan bir sınıfa karşı maç .

<div class="hello "></div>
//div[normalize-space(@class)="hello"]

-6

bu örnek gibi öğeler bulabilirsiniz (tüm css öğeleri)

private By 
allElementsCss = By.xpath(".//div[@class]");
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.