2010-02-13 54 views
2

我一直在与Watir,Nokogir和Hpricot一起进行实验。所有这些都使用top-> down方法,这是我的问题。即它们使用元素类型来搜索元素。我想在不知道元素类型的情况下使用文本找出元素。 例如如何获得使用内部文本元素(Watir,Nokogir,Hpricot)

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

我想通过搜索Text2和Text3来获取element2和element1等。

请注意,我不知道元素是div还是tr/tds或链接等。我只知道文本。 Algorithem应该是这样的: 遍历所有元素,匹配内部文本,如果匹配让我元素和父元素。

让我知道这是可能的任何方式吗?

回答

1

我没有一个完整的答案,但您可以使用wiki(请参阅搜索内部HTML)中概述的文本()功能。

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

将返回

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

然后,您可以通过这些迭代,并检查它们是实际的元素:

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

将返回true。而[1]将返回false。然而,在这倒下是,如果你试图找到text4,因为这将返回:

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

即没有实际的元素。因此,也许在这些情况下(你如何确定这些情况下,我不知道),你可以检查它是否是一个元素,而如果为假获取父

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

对不起,我没有一个完整的答案,但思想“文本()”的东西现在值得一提。

1

Watir有XPath的支持。我对XPath并不熟悉,但我确信它会做你需要的。就像:

browser.element_by_xpath("some_xpath_magic").click 

我也建议您发布您的问题在watir-general