2017-11-02 3 views
0

Ich habe HTML-Code mit div mit gleichem passendem Text in Klassennamen als menu1 und Text wieXpath ein Element mit Teilklassennamen und die genauen Text mit Capybara in Ruby

Berlin

zu finden und

Berlin Deutschland

wofür ich unten Code verwende mehrdeutige Elemente

finde (: xpath, "// div [enthält (text(), \" Berlin \ ") und enthält (@class, \" menu1 \ ")] „)

Hinweis: ich möchte sowohl Klasse und Text in meinem XPath sein

Vorschläge zu erkennen ist, dank im Voraus.

Antwort

0

Wenn durch partielle Klassennamen Sie so etwas wie <div class="blah menu1 other">Berlin</div> bedeuten dann könnten Sie tun es nur in einer lesbaren Weise mit so etwas wie

find('div.menu1', exact_text: 'Berlin') 

oder

find('div.menu1', text: 'Berlin', exact: true) 

Wenn es mehr wie <div class="blah menu1_part other">Berlin</div> ist können Sie immer noch tun Sie es mit einem besser lesbaren CSS-Selektor wie

find('div[class*=menu1]', exact_text: 'Berlin') 

Wenn Sie aus Performancegründen eigentlich alles in einem XPath machen müssen (eine Menge div.menu1 Elemente auf der Seite, wo Sie aus einem verrückten Grund nicht auf einen begrenzten Bereich der Seite zugreifen können), könnten Sie etwas wie

machen

Beachten Sie die führende . im XPath-Ausdruck. 99,9% der Zeit bei der Verwendung von Capybara und manuell Ihre eigenen XPath-Ausdrücke zu schreiben, möchten Sie Ihre XPath-Ausdrücke mit .// starten, sonst sind Besiegen Sie jede Scoping Sie getan haben - siehe https://github.com/teamcapybara/capybara#beware-the-xpath--trap

Eine weitere Option ist die xpath zu verwenden gem Capybara intern verwendet für XPaths zu erzeugen, das wäre so etwas wie

find(:xpath, XPath.css('div.menu1')[XPath.string.n.is('Berlin')], exact: true) 

oder

find(:xpath, XPath.css('div[class *= "menu1"]')[XPath.string.n.is('Berlin')], exact: true) 

je nach genau das, was meinen Sie mit 01.235.. Der Vorteil, etwas wie das zu tun, ist die Bedeutung der is Methode, die von contains auf equals geändert werden kann, abhängig vom Wert der exact Option, und es behandelt auch alle normalizing und escaping von Zeichenfolgen wie notwendig, wenn Ihre Zeichenfolgen nicht als waren einfach wie 'Berlin'

Verwandte Themen