& Nbsp; içeren metni aramak için XPATH kullanma


120

Bir HTML sayfasındaki XPATH ifadelerimi kontrol etmek için XPather Browser kullanıyorum .

Nihai hedefim, bu ifadeleri Selenium'da kullanıcı arayüzlerimin test edilmesinde kullanmaktır.

Şuna benzer içeriğe sahip bir HTML dosyası aldım:

<Tr>
  <Td> abc </ td>
  <Td> & nbsp; </ td>
</ Tr>

" &nbsp;" Dizesini içeren metne sahip bir düğüm seçmek istiyorum .

"Abc" gibi normal bir dizeyle sorun yoktur. Benzer bir XPATH kullanıyorum //td[text()="abc"].

Benzeri bir XPATH ile denediğimde //td[text()="&nbsp;"]hiçbir şey döndürmüyor . " &" İçeren metinlerle ilgili özel bir kural var mı ?


Gerçek XSL dönüşümünüz hiçbir şey döndürmüyor mu? Veya sadece Xpather?
Zack The Human

Yanıtlar:


89

Görünüşe göre Selenium'un arkasındaki adamlar OpenQA bu sorunu zaten çözmüş durumda. Beyaz boşlukları açıkça eşleştirmek için bazı değişkenler tanımladılar. Benim durumumda, benzer bir XPATH kullanmam gerekiyor //td[text()="${nbsp}"].

Bu konuyla ilgili OpenQA metnini burada yeniden oluşturdum ( burada bulabilirsiniz ):

HTML, öğelerdeki beyaz boşluğu otomatik olarak normalleştirir, baştaki / sondaki boşlukları yok sayar ve fazladan boşlukları, sekmeleri ve satırsonlarını tek bir alana dönüştürür. Selenium sayfadan metin okuduğunda, bu davranışı kopyalamaya çalışır, böylece HTML'nizdeki tüm sekmeleri ve yeni satırları yok sayabilir ve metnin işlendiğinde tarayıcıda nasıl göründüğüne bağlı olarak iddialarda bulunabilirsiniz. Bunu, görünmeyen tüm beyaz boşlukları (bölünemez boşluk dahil) değiştirerek yapıyoruz.&nbsp; " dahil) tek bir . Görünen tüm yeni satırlar ( <br>, <p>ve <pre>biçimlendirilmiş yeni satırlar) korunmalıdır.

HTML Selenese test durumu tablolarının metninde aynı normalleştirme mantığını kullanıyoruz. Bunun birçok avantajı vardır. İlk olarak, iddialarınızın ne olması gerektiğini anlamak için sayfanın HTML kaynağına bakmanıza gerek yoktur; " &nbsp;" sembolleri son kullanıcı tarafından görülemez ve bu nedenle Selenese testlerini yazarken bunlar için endişelenmenize gerek yok. (" &nbsp;" İçeren bir alanda assText'i test etmek için " " işaretçileri koymanıza gerek yoktur &nbsp;.) Ayrıca Selenese <td>etiketlerinize fazladan satırlar ve boşluklar da koyabilirsiniz ; Metinde yaptığımızla aynı normalleştirme mantığını test senaryosunda kullandığımız için, iddiaların ve çıkarılan metnin tam olarak eşleşmesini sağlayabiliriz.

Bu, test durumunuza fazladan boşluk eklemeyi gerçekten istediğiniz / eklemeniz gereken nadir durumlarda biraz sorun yaratır. Örneğin, şuna benzer bir alana metin yazmanız gerekebilir: " foo ". Ama basitçe yazarsan<td>foo </td> , Selenese test durumunuza yazarsanız, fazladan boşluklarınızı tek bir boşlukla değiştiririz.

Bu sorunun basit bir çözümü vardır. Selenese'de ${space}değeri tek boşluk olan bir değişken tanımladık . Sen kullanabilirsiniz ${space}otomatik olarak bu gibi kesilmiş olmayacaktır boşluk girmek için: <td>foo${space}${space}${space}</td>. Ayrıca bir değişken ekledik ${nbsp}Bölünemez boşluk eklemek için kullanabileceğiniz .

XPath'lerin beyaz boşluğu bizim yaptığımız gibi normalleştirmediğini unutmayın . Eğer böyle bir XPath yazmak gerekirse //div[text()="hello world"]ama bağlantının HTML "gerçekten hello&nbsp;world", gerçek eklemek gerekir " &nbsp;böyle, bu maç için almak için Selenese test durumu içine": //div[text()="hello${nbsp}world"].


1
OpenQA bağlantısı artık başarıyla
yüklenmiyor

1
Sadece $ {nbsp} seçeneğinin Selenium veya Chrome geliştirme araçlarında benim için çalışmadığını belirtmek isterim \u00a0. Benim için işe yarayan şey, Mac'te kesintisiz bir boşluk yazmaktı Alt+Shift+Space. Web araması Alt+0160pencerelerde diyor .
Cynic

25

Windows'ta iki tırnak arasına Alt + 0160 yazarak sabit kodlanmış bölünemez boşluk (U + 00A0) girdiğimde eşleştirme yapabileceğimi fark ettim ...

//table[@id='TableID']//td[text()=' ']

benim için özel karakter ile çalıştı.

Anladığım kadarıyla, XPath 1.0 standardı Unicode karakterlerinden kaçışla ilgilenmiyor. XPath 2.0'da bunun için işlevler var gibi görünüyor ancak Firefox bunu desteklemiyor gibi görünüyor (veya bir şeyi yanlış anladım). Yani yerel kod sayfasıyla yapmalısınız. Çirkin, biliyorum.

Aslında, standart, doğru Unicode kaçış sırasını sağlamak için XPath kullanan programlama diline güveniyor gibi görünüyor ... Yani, bir şekilde, doğru olanı yaptım.


Firefox 2'de Xpather 1.4.1 kullanıldığında, // td [text () = ''] sonuç vermez.
Zack The Human

Afedersiniz. Benim için çalışmıyor. Nihai hedefim, onu Web arayüzlerimin testleri için Selenium'da kullanmak. Selenium'un kendisi test ifadelerini bir XML yapısında tutar ve Alt Windows yazımı yolda kaybolmuş gibi görünür. Ayrıca, & # 160; XML olarak döner.
Bergeroy

Zack, yazdığım gibi, iki tırnak arasındaki boşluğu Alt + 0160 (sayısal tuş takımında) tarafından üretilen karakterle değiştirmelisin.
PhiLho

4
Bunu PHP ile de başarılı bir şekilde çalıştırmalıyız:$col = $xpath->query("//p[text()=\"\xC2\xA0\"]");
hakre

@Bergory Bu Selenium sürücüsü ile Açıölçer kullanarak çalışır
Damian Green


1

Akılda Ayı standartlara uyumlu XML işlemci XML'in beş standart olanlar dışındaki tüm varlık başvuruları (yerini edeceğini &amp;, &gt;, &lt;, &apos;, &quot;XPath ifadeleri değerlendirilir zaman hedef kodlamasında gelen karakteri ile). Bu davranış göz önüne alındığında, XML araçlarıyla çalışmak istiyorsanız, PhiLho'nun ve jsulak'ın önerileri doğru yoldur. &#160;XPath ifadesine girdiğinizde , XPath ifadesi uygulanmadan önce ilgili bayt dizisine dönüştürülmelidir.


1
XPath'i XPather'da (GUI) veya JavaScript'te kullanmayı denerseniz / kullanırsanız (XML'de olmadığımız için varlıkların otomatik olarak değiştirilmesi yoktur). Diğer XML ortamlarında (XSTL?) İyi tavsiyeler.
PhiLho

1

Sağladığınız HTML'ye göre:

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

Dize ile düğümü bulmak için &nbsp; için aşağıdakilerden birini kullanabilirsiniz tabanlı çözümler:

  • Kullanarak text():

    "//td[text()='\u00A0']"
  • Kullanarak contains():

    "//td[contains(., '\u00A0')]"

Bununla birlikte, ideal olarak KIRILMAYAN UZAY karakterinden kaçınmak ve aşağıdaki Yer Belirleme Stratejilerinden birini kullanmak isteyebilirsiniz :

  • Üst <tr>düğümü kullanarak ve following-sibling:

    "//tr//following-sibling::td[2]"
  • Kullanarak starts-with():

    "//tr//td[last()]"
  • Önceki <td>düğümü ve followingnode andsonraki-kardeşi kullanma:

    "//td[text()='abc']//following::td[1]"

Referans

Alakalı ayrıntılı bir tartışmayı şurada bulabilirsiniz:


tl; dr

Unicode Karakteri 'KIRILMAYAN BOŞLUK' (U + 00A0)


0

Xpather kullanarak bir eşleşme alamıyorum, ancak aşağıdakiler benim için Microsoft'un XML Not Defteri'ndeki düz XML ve XSL dosyalarıyla çalıştı:

<xsl:value-of select="count(//td[text()='&nbsp;'])" />

Döndürülen değer 1'dir, bu benim test durumumda doğru değerdir.

Ancak, ben beyan etmek zorunda mı nbsp aşağıdakileri kullanarak XML ve XSL içinde bir varlık olarak:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

Ben emin size yardımcı olur, ama ben başardı eğer değilim aslında bulmak nbsp bir XPath ifadesini kullanarak.

Düzenleme: Kod örneğim aslında '& nbsp;' karakterlerini içeriyor ancak JavaScript sözdizimi vurgusu, onu boşluk karakterine dönüştürür. Yanılmayın!


Sorumdaki örnek için yapıldığı gibi kod örneğinizi düzenleyebilirsiniz. Nbsp varlığınızı & amp; nbsp; ile değiştirin.
Bergeroy

0

Arayın &nbsp;veya sadece nbsp- bunu denediniz mi?


Bunun işe yaraması gerektiğini biliyorum ama ne bulduğumdan tam olarak emin değil. XPATH'de aradığımla eşleşecek belirli bir yolu kodlamanın bir yolu olmalı.
Bergeroy

Belki de normal bir ifadeye bakmalıyım.
Bergeroy

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.