Soru Selenium Webdriver'da (Python) belirli bir metin içeren bir öğeyi nasıl bulabilirim?


Selenium ile karmaşık bir javascript arayüzünü test etmeye çalışıyorum (Python arayüzünü kullanarak ve birden fazla tarayıcıda). Formda birkaç butonum var:

<div>My Button</div>

"Düğmem" (veya "düğmem" veya "düğme" gibi büyük / küçük harf duyarlı olmayan kısmi eşlemeler) temelli düğmeler aramak istiyorum.

Bunu inanılmaz derecede zor buluyorum, çünkü belli bir şeyi kaçırdığımı hissettiğim kadarıyla. Şimdiye kadar sahip olduğum en iyi şey:

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')

Bununla birlikte, bu büyük-küçük harf duyarlıdır. Denediğim diğer şey, sayfadaki tüm divleri yinelemek ve element.text özelliğini kontrol etmek. Ancak, formun her durumunu aldığınızda:

<div class="outer"><div class="inner">My Button</div></div>

div.outer da metin olarak "Düğme" ye sahiptir. Bu sorunu gidermek için div.outer'ın div.inner'ın ebeveyni olup olmadığına bakmayı denedim, ancak bunun nasıl yapılacağını anlayamadım (element.get_element_by_xpath ('..') bir öğenin üst öğesini döndürür, ancak div.outer'a eşit olmayan testler). Ayrıca, sayfadaki tüm öğeler arasında yinelemek, en azından Chrome web tarayıcısını kullanarak gerçekten yavaş görünüyor.

Fikirler?

Düzenleme: Bu soru biraz belirsiz çıktı. Burada daha özel bir sürüm sordu (ve cevapladı): Selenium WebDriver'da bir elemanın metnini (Python api ile) alt öğe metni içermeden nasıl edinirim?


145
2017-09-07 18:20


Menşei


Mevcut cevaplar benim için çalışmadı. Bu yaptı: sqa.stackexchange.com/a/2486 - alejandro


Cevaplar:


Takip etmeyi dene:

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")

187
2017-09-09 14:54



Cevabınız için teşekkür ederim, ihtiyacım olanın% 50'siydi (başladım). Geldiğim form şu şekildedir: (// * [içerir (text (), '"+ text +"')] | // * [@ value = '"+ text +"']) " metin sadece eleman düğümleri içinde değil, aynı zamanda metin değeri "değer" ile ayarlanmış giriş elemanları içinde, yani <düğme değeri = "Düğmem" />. Dikkat etseler de, değer sadece metin içermeli, katı eşleşmelidir. - Ivan Koshelev
Ayrıca, diğer arama motoru ziyaretçileri için söz etmeye değer: bir bağlantı arıyorsanız, find_element(s)_by_link_text ve find_element(s)_by_partial_link_text yöntemleri - Dan Passaro
Metin dinamik ise ne olur? Yani, tırnak içerebilir. Bu çözümü bozmaz mı? - IcedDante
Belirli isimleri aramak bunu kırıyor gibi görünüyor. Bir örnek için aşağıdakileri yapın: "// * [içerir (metin (), '" + kullanıcı adı + "')]" kullanıcı adı = "O'Reilly"; o zaman xpath geçersiz olur. Bunun etrafında bir yolu var mı? - Sakamoto Kazuma
Hedef metin birden çok satıra sahip olduğunda işe yaramaz. - Shawn


gibi bir xpath deneyebilirsiniz:

'//div[contains(text(), "{0}") and @class="inner"]'.format(text)

20
2017-09-07 18:44



Teşekkürler ... böylece içten dışa ayırmaya yardımcı olur, ama aslında xpath ile iyi çalışır, sadece bu problemi tüm divlarla yinelemekteydim. Xpath ile olan problemim, büyük / küçük harf duyarlı hale getirmeyi nasıl anlayamıyorum? - josh
xpath 2.0, küçük harf fonksiyonuna sahiptir, bu yüzden çalışmalıdır: '// div [içerdiği (küçük harf (metin ()), "{0}")]'. format (metin) - andrean
Teşekkürler! Ancak, benim anlayışım xpath 2.0'ın büyük tarayıcılarda desteklenmediği ... - josh
selenium, xpath ifadelerini doğrudan tarayıcının kendi yöntemleriyle değerlendirir, bu yüzden hangi tarayıcıyı selenyum ile kullandığınıza bağlıdır. genellikle sadece 6,7 ve 8, xpath 2.0'ı desteklememelidir. - andrean
.format tutulmamda tanınmadı. o verir ve hata. herhangi bir fikir, neden? - anujin


Sayfa Nesne Kalıbı ile de kullanabilirsiniz, ör.

Bu kodu deneyin:

@FindBy(xpath = "//*[contains(text(), 'Best Choice')]")
WebElement buttonBestChoice;

5
2018-01-17 09:44





wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(), 'YourTextHere')]")));
    assertNotNull(driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")));
    String yourButtonName=driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")).getAttribute("innerText");
    assertTrue(yourButtonName.equalsIgnoreCase("YourTextHere"));

2
2017-08-11 16:27





Bunu dene. Bu çok kolay:

driver.getPageSource().contains("text to search");

Bu gerçekten selenyum web sürücüsünde benim için çalıştı.


-14
2018-02-07 14:54



Metin, JavaScript ile oluşturulmuşsa çalışmaz. - palacsint
Bu, onu kontrol etmenin bir yoludur, çünkü sayfanın tüm içeriğini kablo üzerinden aktarıyorsunuz. Çok küçük sayfalar için bu kabul edilebilirliktir, ancak çok büyük sayfalar için dosyanın tüm içeriğini aktarır ve sunucu tarafını kontrol edersiniz. Daha iyi bir yaklaşım, istemci tarafında xpath, javascript veya css ile yapılacaktır. - thomas.han
Tüm sayfa kaynağının, tarayıcının işlenmesi için tel üzerinden aktarılmasının gerekeceğini düşünürdüm? - René
Josh, metnin sayfanın kaynağında bulunup bulunmadığını test etmemek için, öğeyi metinle nasıl bulacağını soruyor. - Cedric
Her şeyin gerekli olduğu durumlarda, bir sayfada statik bir metin bulmak, bu çözüm yeterince iyidir. (Benim durumumda yardımcı oldu). - Karlth