Как получить элемент с помощью внутреннего текста (Watir, Nokogir, Hpricot)

Я экспериментировал с Watir, Nokogir и Hpricot. Все они используют подход сверху-> вниз, что является моей проблемой. то есть они используют тип элемента для поиска элемента. Я хочу узнать элемент, используя текст, не зная типа элемента. например

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

Я хочу получить element2 и element1 и т. д., выполнив поиск Text2 и Text3.

Обратите внимание, что я не знаю, являются ли элементы элементами div, tr/tds или ссылками и т. д. Я просто знаю текст. Алгоритм должен быть примерно таким: итерация по всем элементам, соответствие внутреннему тексту, если совпадение, получение элемента и родительского элемента.

Позвольте мне узнать, возможно ли это каким-либо образом?


person Hpriguy    schedule 13.02.2010    source источник


Ответы (2)


У меня нет полного ответа, но вы можете использовать функцию text(), описанную в вики (см. Поиск во внутреннем 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"]>

то есть не фактический элемент. Так что, возможно, в этих экземплярах (как вы определяете эти экземпляры, я не знаю) вы могли бы проверить, является ли это элементом, и если false получить родителя

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

Извините, у меня нет полного ответа, но я подумал, что сейчас стоит упомянуть о «тексте ()».

person atomicules    schedule 15.02.2010

Watir поддерживает XPath. Я не совсем знаком с XPath, но я уверен, что он сделает то, что вам нужно. Что-то типа:

browser.element_by_xpath("some_xpath_magic").click

Я также предлагаю опубликовать свой вопрос на странице watir-general.

person Željko Filipin    schedule 16.02.2010