You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium Java中JavascriptException问题排查求助

问题排查与解决方案

错误根源分析

你的代码中By.tagName("colspan")是核心错误:colspan是<td>的属性,而非HTML标签名,这个定位器无法找到任何元素,导致RelativeLocator执行内部JavaScript逻辑时抛出JavascriptException。

正确相对定位方案

结合你描述的动态表格(每日尺寸变化、多页面不同表格)及目标元素(表格右下角净额,位于<td>下的<b>标签内),提供以下几种可行方案:

方案1:基于表格结构定位(最后一行最后一列)

利用表格的结构特性,直接定位最后一行最后一列的<b>元素,结合RelativeLocator确保动态适配:

// 先定位表格的最后一行
WebElement lastTableRow = driver.findElement(By.xpath("//table/tbody/tr[last()]"));
// 在最后一行内,定位最右侧<td>中的<b>元素
WebElement netAmount = driver.findElement(
    RelativeLocator.with(By.tagName("b"))
                   .inside(lastTableRow)
                   .toRightOf(By.xpath(".//td[position() < last()]"))
);
String amountText = netAmount.getText();

方案2:利用固定文本基准元素

如果表格中存在固定文本的单元格(例如“净额”标签在目标数据左侧),以此为基准定位:

// 假设左侧有“净额”文本的<td>作为基准
WebElement netLabelTd = driver.findElement(By.xpath("//td[text()='净额']"));
WebElement netAmount = driver.findElement(
    RelativeLocator.with(By.tagName("b"))
                   .toRightOf(netLabelTd)
);
String amountText = netAmount.getText();

方案3:修复原思路(正确定位带colspan属性的元素)

如果你原本想以带colspan属性的<td>为基准,需用属性选择器而非标签名:

// 定位带colspan属性的<td>(确保该元素唯一)
WebElement colspanTd = driver.findElement(By.cssSelector("td[colspan]"));
WebElement netAmount = driver.findElement(
    RelativeLocator.with(By.tagName("b"))
                   .toRightOf(colspanTd)
);
String amountText = netAmount.getText();

额外注意事项

  • 确保使用Selenium 4及以上版本(RelativeLocator从Selenium 4开始支持)
  • 加入显式等待,避免元素未加载完成导致的定位失败:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement netAmount = wait.until(ExpectedConditions.visibilityOfElementLocated(
    RelativeLocator.with(By.tagName("b")).toRightOf(By.xpath("//td[text()='净额']"))
));

内容的提问来源于stack exchange,提问作者rusty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:55:32