HtmlUnit无法定位带有role='treegrid'属性的HtmlTable问题求助
HtmlUnit无法定位带有role='treegrid'属性的HtmlTable问题求助
我注意到你的代码里有几个关键问题,导致找不到目标treegrid表格,下面逐一分析并给出解决方案:
1. 最核心的错误:XPath选择器写错了
你在查找treegrid的时候用的是//a[@role='treegrid'],但实际带有role="treegrid"属性的是table元素,不是a标签!这直接导致你的代码找不到任何匹配的元素,所以hts.size()返回0。
你需要把这行代码的XPath修改为:
List<HtmlElement> hts = page3.getByXPath("//table[@role='treegrid']");
2. 缺少动态JavaScript等待逻辑
点击进入page3后,treegrid表格是通过前端JS动态渲染出来的,你没有等待JS执行完成就立刻去查找元素,此时表格还没被渲染到页面上,自然找不到。
在获取page3之后,必须添加等待代码:
HtmlPage page3 = (HtmlPage) he2.click(); // 给10秒时间让后台JS完成表格渲染 webClient.waitForBackgroundJavaScriptStartingBefore(10_000); // 确保拿到最新的页面实例(避免页面跳转后引用旧的未更新实例) page3 = (HtmlPage) page3.getEnclosingWindow().getEnclosedPage(); // 再执行查找表格的操作 List<HtmlElement> hts = page3.getByXPath("//table[@role='treegrid']");
同样,建议你在page2加载完成后也添加相同的等待逻辑,确保page2的表格完全渲染,避免点击错误的元素:
HtmlPage page2 = hi.click(); webClient.waitForBackgroundJavaScriptStartingBefore(10_000); page2 = (HtmlPage) page2.getEnclosingWindow().getEnclosedPage();
3. 潜在问题:全局XPath可能导致点错链接
你在获取目标$514.20链接时,用的是:
List<HtmlElement> clickables = accountTable.getCellAt(5,5).getByXPath("//a[@class='gridlink']");
这里的//是从整个文档根节点开始搜索,可能会匹配到页面上其他的gridlink链接,导致你点击的不是目标单元格里的那个链接。建议改成.//来限定在当前单元格内搜索:
// .// 表示从当前单元格节点开始向下查找,避免全局匹配 List<HtmlElement> clickables = accountTable.getCellAt(5,5).getByXPath(".//a[@class='gridlink']");
4. 额外建议:更新BrowserVersion
HtmlUnit中旧的BrowserVersion可能存在JS兼容性问题,试试指定一个较新的Firefox版本(HtmlUnit 4.7.0支持Firefox 100+的版本):
try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_120)) {
修改后的完整关键代码片段
// ... 前面的初始化和page1逻辑不变 ... HtmlPage page2 = hi.click(); webClient.waitForBackgroundJavaScriptStartingBefore(10_000); page2 = (HtmlPage) page2.getEnclosingWindow().getEnclosedPage(); List<HtmlTable> accountTables = page2.getByXPath("//table[@role='grid']"); Iterator accountTablesIt = accountTables.iterator(); HtmlTable accountTable = (HtmlTable) accountTablesIt.next(); // 修正XPath为.//a[@class='gridlink'] List<HtmlElement> clickables = accountTable.getCellAt(5,5).getByXPath(".//a[@class='gridlink']"); Iterator clicks = clickables.iterator(); HtmlElement he2 = (HtmlElement) clicks.next(); HtmlPage page3 = (HtmlPage) he2.click(); // 添加JS等待 webClient.waitForBackgroundJavaScriptStartingBefore(10_000); page3 = (HtmlPage) page3.getEnclosingWindow().getEnclosedPage(); // 修正XPath为//table[@role='treegrid'] List<HtmlElement> hts = page3.getByXPath("//table[@role='treegrid']"); System.out.println("hts.size() = " + hts.size()); System.out.println("--------------------------------------------------------");
按照这些修改,你应该就能成功定位到带有treegrid角色的表格了。
备注:内容来源于stack exchange,提问作者God's Gift To Java
相关产品推荐
相关产品推荐

