如何在HtmlUnit中使用Xpath来访问一堆嵌套div

时间:2017-01-18 21:01:35

标签: java html xpath htmlunit

我创建了一个程序,可以使用HtmlUnit访问Web应用程序。登录到应用程序后,我想逐个打开表中列出的作业,然后转到下一页。不幸的是,该表没有id属性,我可以在初始化HtmlTable变量时使用getElementById。

所以,我决定使用getByXPath函数并传递一个路径,系统可以通过该路径识别我所指的表并让我继续前进。我在这里遇到的问题是我想要访问的表嵌套在一堆div和一个表标签下。从层次上讲,我试图访问的表位于下面提到的方式

HTML - >身体 - > 12个div - >表 - > tbody - > tr - > td - > 10个div - >表

我无法从Xpath函数的中间开始。所以,我以下列方式传递了整个路径:

for(int i=0;i<2;i++) {
     final HtmlTable table = (HtmlTable) page2.getByXPath("//html/body/div/div/div/div/div/div/div/div/div/div/div/div/table/tbody/tr/td/div/div[@id='idName']/div/div/div[@class='className']/div/div/div/div/div/table[@class='TableClass']").get(i);
     System.out.println("Printing table: " + table.asText());
} 

我得到的错误如下:

线程中的异常&#34; main&#34; java.lang.IndexOutOfBoundsException:索引:0,大小:0

由于该表隐藏在大量其他标记之下,因此我不知道如何获得有效的访问方式。

现在,我尝试使用getChildNodes函数来获取页面中的所有节点,并单独列出Table节点。代码段在这里:

        List list = page2.getChildNodes();
        int k = 0;
        while(list.iterator() != null)
        {
            HtmlElement anElement = (HtmlElement) list.get(k);
            if(anElement instanceof HtmlTable)
            {
                System.out.println("Hello :" +anElement.asText());
            }
            k =  k + 1;
        }

这里我有一个HtmlElement强制转换操作的 ClassCastException

2 个答案:

答案 0 :(得分:0)

您可以尝试使用其属性识别您的表格。请尝试以下XPath

//table[@class="className"][@role="presentation"]

答案 1 :(得分:0)

我猜你的问题比较普遍。 作为第一项检查,您可以使用类似

的内容
System.out.println(page.asXml());

转储您的网页。这样做是为了了解您的页面是什么样的。一些更复杂的网页正在进行一些客户端渲染(这意味着dom的某些部分将在客户端构建一些javascript代码)。在这种情况下,您必须等待javascript完成,然后才能通过XPath或gettign子节点开始尝试控制。

如果你确定dom树看起来像你期望的那样,你可以将duped页面代码加载到firefox中并使用firebug。 Firebug提供了一个函数来为选定的dom元素生成XPath表达式。