【问题标题】:Improvement With Xpath Search?使用 Xpath 搜索进行改进?
【发布时间】:2017-10-30 22:20:39
【问题描述】:

我是一名学习 selenium 的学生,并试图设置一个与目标文档位于同一行的复选框(通过打勾)。以下是该行的外观:

            <span><input>Checkbox</input></span> - <span>_lblDocumentCategoryDescription</span> - <span>_lblDocumentdescription</span>

每一行都包含该行的复选框、类别和说明。我提供了描述,需要在行的开头设置相应的复选框。

虽然我有一个可行的解决方案,但我正在寻找一种更好的方法,因为我的方法非常慢,而且我可以多次调用它,从而加剧了缓慢。有问题的页面有 315 个固定的不同文档,可能会添加(到合并和打印功能)。我通常添加至少 3 行所以需要运行搜索

我目前正在使用 xpath 进行搜索,因为我对 CSS 的了解有限,而且似乎遍历 DOM(没有 :parent?)并不容易,除非使用一些我试图避免的 JavaScript。我读过执行 JS 不能正确模拟用户,所以我猜 xpath 是解决方案?

据我所知,必须有一个更快/更好/更有效的解决方案,我希望其他人可能会找到更好的解决方案?

这是我目前使用的:

方法调用 CPTools,setStupidCheckbox("转租附录", true);

方法:

            public CPTools setStupidCheckbox(String documentToPrint, Boolean onIfTrue) {
                    this.log.trace("Starting: setStupidCheckbox; parameter: documentToPrint " + documentToPrint);
                    String xpathForCheckboxes = "/ancestor::tr//input";
                    try {
                        String xpathForDocumentDescriptions = String.format("//span[contains(text(), '%s')]", documentToPrint);
                        tools.waitForElement(By.xpath(xpathForDocumentDescriptions), 2);
                        if (driver.findElement(By.xpath(xpathForDocumentDescriptions)).isDisplayed()) {
                            driver.findElementByXPath(xpathForDocumentDescriptions + xpathForCheckboxes).click();
                        }
                    } catch (org.openqa.selenium.NoSuchElementException | ElementNotVisibleException e) {
                    }
                    this.log.trace("Ending: setStupidCheckbox");
                    return this;
                }

这是表格行的完整 xpath(id 的动态部分是 _ctl316):

            <tr class="DataGridCellData">
                <td class="DataGridCellDataCenterAligned">
                    <span class="DataLabel"><input id="ctl01_PageBody_grdDocument_ctl316_chkSelect" name="ctl01$PageBody$grdDocument$ctl316$chkSelect" onclick="javascript:uiHelper.GridCellCheck(this, 'chkAllSelect');" type="checkbox"></span>
                </td><td>
                    <span id="ctl01_PageBody_grdDocument_ctl316_lblDocumentCategoryDescription">Approval Form</span>
                </td><td align="left">
                    <span id="ctl01_PageBody_grdDocument_ctl316_lblDocumentdescription">Sublease Addendum</span>
                </td><td align="center">
                </td>
            </tr>

提前感谢您提供任何可能的帮助。

【问题讨论】:

  • 你想得到哪个元素?
  • “//input[contains(@onclick, 'chkAllSelect')]”怎么样?
  • 抱歉我的问题含糊不清 - 我正在尝试检查复选框,但其中有 315 个 - 我知道的唯一参考是文档描述范围中将出现的文本(转租附录)。
  • @TarunLalwani - 感谢您的评论 - 但是 xpath 将选择第一个复选框,因为所有 315 都具有相同的 onclick。
  • 文本Approval FormSublease Addendum 是否与复选框相关?您的单元格的文本是否不同?

标签: selenium xpath selenium-webdriver internet-explorer-11


【解决方案1】:

如果跨度文本(转租附录)是唯一的,请尝试以下 XPath: //td[.= '转租附录']

【讨论】:

  • 感谢 Kuldeep,我确实尝试过,但这并没有比我的方法更快地搜索 - 我不只是在寻找字符串“Sublease Addendum”,而是在寻找其中的文本span - “转租附录只是我正在使用的一个示例。通过所有 315 个不同项目的 xpath 搜索速度很慢,这就是我正在寻求帮助的原因。感谢您的尝试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2015-11-08
相关资源
最近更新 更多