2010-02-13 14 views
2

J'ai été expéirment avec Watir, Nokogir et Hpricot. Tous ceux-ci utilisent l'approche top-down, ce qui est mon problème. c'est-à-dire qu'ils utilisent un type d'élément pour rechercher un élément. Je veux trouver l'élément en utilisant le texte sans connaître le type d'élément. par exemple.Comment obtenir un élément en utilisant le texte interne (Watir, Nokogir, Hpricot)

<element1> 
    <element2> Text2 </element2> 
    <element3> Text3 </element3> 
    text4 
</element1> 

Je veux obtenir les éléments element2 et element1 en recherchant Text2 et Text3.

Veuillez noter que je ne sais pas si les éléments sont divs ou tr/tds ou liens, etc. Je connais simplement le texte. Algorithme devrait être quelque chose comme: itérée à travers tous les éléments, correspondre à du texte interne, si correspondre me procurer l'élément et l'élément parent. Permettez-moi de savoir si cela est possible d'une manière ou d'une autre?

Répondre

1

Je n'ai pas de réponse complète, mais vous pouvez utiliser la fonctionnalité text(), décrite dans le wiki (voir Recherche HTML interne).

doc.search("*[text()='Text3']") 

retournera

#<Hpricot::Elements[{elem <element3> " Text3 " </element3>}, " Text3 "]> 

Vous pouvez ensuite parcourir ces derniers et vérifier qu'ils sont des éléments réels:

doc.search("*[text()='Text3']")[0].elem? 

reviendriez true. Alors que [1] retournerait false. Toutefois, lorsque cela tombe est si vous essayez de trouver text4 car cela retourne:

#<Hpricot::Elements["\n  text4\n"]> 

dire pas l'élément réel. Alors peut-être dans ces cas (comment vous déterminez ces cas, je ne sais pas), vous pouvez vérifier si elle est un élément, et si elle est fausse obtenir le parent

doc.search("*[text()='text4']")[0].parent 

Désolé je n'ai pas une réponse complète, mais la pensée la chose "text()" mériterait d'être mentionnée pour le moment.

1

Watir a le support XPath. Je ne suis pas vraiment familier avec XPath mais je suis à peu près sûr qu'il ferait ce dont vous avez besoin. Quelque chose comme:

browser.element_by_xpath("some_xpath_magic").click 

Je suggère également poster votre question à watir-general.