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
相关产品推荐
相关产品推荐

