Как получить элемент, используя внутренний текст (Watir, Nokogir, Hpricot) - PullRequest
2 голосов
/ 14 февраля 2010

Я был в восторге от Ватира, Нокогира и Хприко. Все они используют подход сверху вниз, что является моей проблемой. то есть они используют тип элемента для поиска элемента. Я хочу узнать элемент, используя текст, не зная тип элемента. например,

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

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

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

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

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

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

browser.element_by_xpath("some_xpath_magic").click

Я бы также предложил опубликовать ваш вопрос на watir-general .

1 голос
/ 15 февраля 2010

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

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

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

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

...