HtmlUnit 2.8 getFirstByXPath与HtmlUnit 1.14 getFirstByXPath有什么不同?

jam*_*esv 6 java xpath htmlunit

我有一个看起来像这样的网站结构:

<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
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Item 1
Item 2
...
Run Code Online (Sandbox Code Playgroud)

但是在HtmlUnit 2.8中,当我做同样的事情时,我得到了.

Item 1
Item 1
...
Run Code Online (Sandbox Code Playgroud)

在HtmlUnit 2.8中是否有解决方法?

Mad*_*sen 6

可能是HtmlUnit 1.4有一个你正在利用/依赖的bug.

在你展示的代码中,for循环内部的XPath 应该在每次执行时返回相同的元素(就像在v2.8中那样),因为它以它开头//,它从根节点开始查看entiredocument并返回它找到的第一个.

如果你想让它<div>与循环中的相对,你应该将你的XPath调整为:.//span[@class='item_name']