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

Selenium定位table标签内元素时遭遇NoSuchElementException问题求助

解决Selenium定位table内元素的NoSuchElementException错误

问题概述

使用Selenium定位table标签内的元素时,抛出org.openqa.selenium.NoSuchElementException,提示无法通过指定XPath定位目标元素。

报错信息

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@id='divTable']/child::div/child::div/child::table/child::tbody/child::tr/child::td[2]/input"}
(Session info: chrome=103.0.5060.114)

测试代码

@Test (priority=8)
public void autogenerate() throws InterruptedException
{
    driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@id='axpiframe']")));
    WebElement autogenerate= driver.findElement(By.xpath("//body/div[@id='dvlayout']/div[@id='pagebdy']/div[@id='heightframe']/div[@id='wBdr']/div[@id='myModal']/div[1]/div[1]/div[2]/div[1]/ul[1]/li[9]/a[1]"));
    click(driver, autogenerate, 20);
    WebElement fieldname= driver.findElement(By.xpath("//input[@id='name000F1']"));
    sendkeys(driver, fieldname, 20, "autotime");
    WebElement fieldcaption= driver.findElement(By.xpath("//input[@id='caption000F1']"));
    click(driver, fieldcaption, 20);
    WebElement defsequence= driver.findElement(By.xpath("//input[@id='Def_Sequence000F2']"));
    click(driver, defsequence, 20);
    WebElement icon= driver.findElement(By.xpath("//body/div[@id='dvlayout']/div[@id='pagebdy']/div[@id='heightframe']/div[@id='wBdr']/div[@id='wbdrHtml']/div[@id='DivFrame2']/div[@id='divDc2']/div[@id='randomID_212']/div[@id='dvDef_Sequence']/div[2]/div[1]/i[1]"));
    click(driver, icon, 20);
    Thread.sleep(5000);
    
    WebElement prefix= driver.findElement(By.xpath("//div[@id='divTable']/child::div/child::div/child::table/child::tbody/child::tr/child::td[2]/input"));
    sendkeys(driver, prefix, 20, "AM");

}

页面HTML结构

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta charset="utf-8" /><meta name="description" content="Table" /><meta name="keywords" content="Agile Cloud, Axpert,HMS,BIZAPP,ERP" /><meta name="author" content="Agile Labs" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>
    Table
</title><link href="../Css/thirdparty/bootstrap/3.3.6/bootstrap.min.css" rel="stylesheet" type="text/css" /><link href="../ThirdParty/gridstack.js-0.3.0/dist/gridstack.css" rel="stylesheet" type="text/css" /><link href="../Css/thirdparty/jquery-ui/1.12.1/jquery-ui.min.css" rel="stylesheet" type="text/css" /><link href="../Css/thirdparty/jquery-ui/1.12.1/jquery-ui.structure.min.css" rel="stylesheet" type="text/css" /><link href="../Css/thirdparty/jquery-ui/1.12.1/jquery-ui.theme.min.css" rel="stylesheet" type="text/css" /><link href="../ThirdParty/jquery-confirm-master/jquery-confirm.min.css" rel="stylesheet" type="text/css" /><link href="../ThirdParty/DataTables-1.10.13/media/css/jquery.dataTables.min.css" rel="stylesheet" type="text/css" /><link href="../Css/Icons/icon.css" rel="stylesheet" type="text/css" /><link href="../Css/thirdparty/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css" /><link href="../ThirdParty/codemirror/codemirror.css" rel="stylesheet" type="text/css" /><link href="../Css/jquery-ui-timepicker-addon.min.css" rel="stylesheet" type="text/css" /><link href="../Js/jquery.timeentry.package/jquery.timeentry.css" rel="stylesheet" type="text/css" /><link href="../Css/globalStyles.min.css?v=35" rel="stylesheet" type="text/css" /><link href="../Css/wizardComp.min.css?v=17" rel="stylesheet" type="text/css" /><link href="../css/ExportNew.min.css?v=32" rel="stylesheet" type="text/css" /><link href="../Css/import.min.css?v=30" rel="stylesheet" type="text/css" /><link href="../Css/responsibilties.min.css?v=10" rel="stylesheet" type="text/css" /><link href="../Css/propSheet.min.css?v=3" rel="stylesheet" type="text/css" /><link href="../Css/msgBoxLight.css" rel="stylesheet" type="text/css" /><link href="../Css/tstructNewUi.min.css?v=59" rel="stylesheet" type="text/css" /><link href="../Css/animate.min.css" rel="stylesheet" type="text/css" /><link href="../ThirdParty/bootstrap-tokenfield/dist/css/bootstrap-tokenfield.min.css" rel="stylesheet" type="text/css" /><link href="../newPopups/Remodal/remodal-default-theme.min.css" rel="stylesheet" type="text/css" /><link href="../newPopups/Remodal/remodal.min.css" rel="stylesheet" type="text/css" /><link href="../Css/axpertPopup.min.css?v=22" rel="stylesheet" type="text/css" />
    <script>
        if (!('from' in Array)) {
            // IE 11: Load Browser Polyfill
            document.write('<script src="../Js/polyfill.min.js"><\/script>');
        }
    </script>
    <script type="text/javascript">
        var FetchPickListRows = 1000;
    </script>
    <script src="../Js/thirdparty/jquery/3.1.1/jquery.min.js"></script>
    <script src="../ThirdParty/DataTables-1.10.13/media/js/jquery.dataTables.min.js"></script>
    <script src="../ThirdParty/DataTables-1.10.13/media/js/dataTables.bootstrap.min.js"></script>
    <script src="../Js/jquery.browser.min.js"></script>
    <script src="../Js/printjs.min.js"></script>
    <script src="../ThirdParty/jquery-confirm-master/jquery-confirm.min.js"></script>
    <script src="../Js/noConflict.min.js"></script>
    <script type="text/javascript" src="../Js/iFrameHandler.min.js"></script>
    <script src="../Js/propSheet.min.js"></script>
    <script src="../Js/jquery.timeentry.package/jquery.timeentry.min.js"></script>
    <script src="../Js/alerts.min.js?v=28"></script>
    <script src="../Js/jQueryUi/jquery.tablesorter.min.js"></script>
    <script src="../ThirdParty/bootstrap-tokenfield/dist/bootstrap-tokenfield.min.js"></script>
    <script src="../Js/common.min.js?v=85"></script>
    <script src="../Js/ckeditor/ckeditor.js?v=1"></script>
    <script src="../Js/ckRtf.js"></script>
    <script src="../Js/JDate.min.js"></script>
    <script src="../Js/thirdparty/bootstrap/3.3.6/bootstrap.min.js"></script>
    <script src="../Js/thirdparty/jquery-ui/jquery-ui-autoCom/jquery-ui-autoCom.min.js"></script>
    <script src="../Js/jquery-ui-timepicker-addon.min.js"></script>
    <script src="../ThirdParty/lodash.min.js"></script>
    <script src="../ThirdParty/gridstack.js-0.3.0/dist/gridstack.js"></script>
    <script src="../ThirdParty/gridstack.js-0.3.0/dist/gridstack.jQueryUI.js"></script>
    <script src="../Js/jquery.msgBox.min.js"></script>
    <script src="../Js/jQueryUi/jquery.scrollabletab.min.js"></script>
    <script src="../Js/tstructvars.min.js?v=52"></script>
    <script src="../Js/md5.min.js"></script>
    <script src="../Js/adjustwindow.js"></script>
    <script src="../Js/wizardComp.js"></script>
    <script src="../Js/tstruct.min.js?v=383"></script>
    <script src="../Js/util.min.js"></script>
    <script src="../Js/tstruct-pdf.min.js"></script>
    <script src="../newPopups/Remodal/remodal.min.js"></script>
    <script src="../newPopups/axpertPopup.min.js?v=45"></script>
    <script src="../Js/handlebars.min.js?v=1"></script>
    <script src="../Js/tstTable.min.js?v=9"></script>
</head>
<body>
    <form name="form1" method="post" action="./tsttable.aspx?fldId=Def_Sequence000F2" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="3/epi2NOzZ4VmPo7Vmb+TxMGr70gGKys52QAMmeXvG5Lm3qOhrp7iFXHzQfiwsoUdicOkkwYT2rQ2QwYZWzysVJHmx3z88zoVTV22f99lx4=" />
</div>

<div>

    <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="7F438B0E" />
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="pZzJrDUxojFaoW1Xwo0BH7CLYZ2J12wPy/QjMK/JiLqwgeSvxBXWAXBmmIiK8LOyUv9Im74lsN5ecTx48/KdfR2puWHi3mg5Z9FaulZsR1nEfrwhpsISz3BpohI5R2+u" />
</div>
        <div id="divTable">
        </div>
        <input type="hidden" name="hdnfieldId" id="hdnfieldId" value="Def_Sequence000F2" />
    </form>
</body>
</html>

问题分析与解决方案

  1. 动态元素加载问题:从提供的HTML结构可见,初始状态下divTable是空的,说明table及内部元素是点击图标后通过JavaScript动态生成的。Thread.sleep(5000)无法保证元素一定加载完成,建议改用显式等待,等待元素可见后再进行定位。

  2. XPath过于冗长:原XPath依赖过多层级,一旦页面结构微调就会失效。可简化XPath,使用相对路径定位:

    //div[@id='divTable']//table//td[2]/input
    

    若目标input有唯一属性(如name、class),可进一步精准定位,例如:

    //div[@id='divTable']//input[@name='prefix']
    
  3. 嵌套iframe检查:点击图标后弹出的窗口可能位于新的iframe中,需切换到对应iframe再定位元素。可使用浏览器开发者工具查看弹窗所在iframe的id或属性,执行driver.switchTo().frame("iframeId")切换。

修改后的代码示例

@Test (priority=8)
public void autogenerate() throws InterruptedException
{
    driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@id='axpiframe']")));
    WebElement autogenerate= driver.findElement(By.xpath("//body/div[@id='dvlayout']/div[@id='pagebdy']/div[@id='heightframe']/div[@id='wBdr']/div[@id='myModal']/div[1]/div[1]/div[2]/div[1]/ul[1]/li[9]/a[1]"));
    click(driver, autogenerate, 20);
    WebElement fieldname= driver.findElement(By.xpath("//input[@id='name000F1']"));
    sendkeys(driver, fieldname, 20, "autotime");
    WebElement fieldcaption= driver.findElement(By.xpath("//input[@id='caption000F1']"));
    click(driver, fieldcaption, 20);
    WebElement defsequence= driver.findElement(By.xpath("//input[@id='Def_Sequence000F2']"));
    click(driver, defsequence, 20);
    WebElement icon= driver.findElement(By.xpath("//body/div[@id='dvlayout']/div[@id='pagebdy']/div[@id='heightframe']/div[@id='wBdr']/div[@id='wbdrHtml']/div[@id='DivFrame2']/div[@id='divDc2']/div[@id='randomID_212']/div[@id='dvDef_Sequence']/div[2]/div[1]/i[1]"));
    click(driver, icon, 20);
    
    // 替换Thread.sleep为显式等待,等待目标元素可见
    WebDriverWait wait = new WebDriverWait(driver, 30);
    WebElement prefix = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='divTable']//table//td[2]/input")));
    sendkeys(driver, prefix, 20, "AM");

}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:36:20