我创建了一个程序,可以使用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 。
答案 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表达式。