Отличается ли HtmlUnit 2.8 getFirstByXPath от HtmlUnit 1.14 getFirstByXPath? - PullRequest
6 голосов
/ 14 июля 2011

У меня есть структура сайта, которая выглядит примерно так:

<div class='main_container'>
     <div class='item_container'>
         <div class='body'>
             <span class='item_name'>Item 1</span>
             <span class='item_desc'>Desc 1</span>
         </div>
     </div>
     <div class='item_container'>
         <div class='body'>
             <span class='item_name'>Item 2</span>
             <span class='item_desc'>Desc 2</span>
         </div>
     </div>
     ...
</div><!--End of main_container--> 
//Note: Some divs might not have <span @class='item_name'>Item N</span> or other elements inside the item_container

В HtmlUnit 1.14, если я хочу получить все имя элемента:

List<HtmlDivision> divs = (List<HtmlDivision>)page.getByXPath("//div[@class='item_container']");
for(HtmlDivision div:divs){
    String name = ((HtmlElement)div.getFirstByXPath("//span[@class='item_name']")).asText();
    System.out.println(name);
}

Вывод:

Item 1
Item 2
...

Но в HtmlUnit 2.8, когда я делаю то же самое, я получаю.

Item 1
Item 1
...

Есть ли обходной путь для этого в HtmlUnit 2.8?

1 Ответ

6 голосов
/ 14 июля 2011

Возможно, в HtmlUnit 1.4 была ошибка, которую вы использовали / полагались.

В коде, который вы показали, XPath внутри цикла for должен возвращать один и тот же элемент при каждом выполнении (как это происходит в v2.8), потому что он начинается с //, который просматривает entiredocument начиная с корневого узла и возвращает первый , который он находит.

Если вы хотите, чтобы он был относительно <div> в цикле, вам следует настроить XPath на: .//span[@class='item_name']

...