使用Xpath Contains函数查找包含文本的元素

时间:2017-08-01 19:56:02

标签: html selenium xpath

我一直在为我的selenium Xpath定位器使用Contains函数。到目前为止,此功能始终有效。它目前不适用于表中的TD元素。我正在向函数发送正确的文本,所以我不明白为什么。

在Chrome上,请转到此处: https://rcpsc.releasecandidate-community360qa.net/login.aspx?action=enablelogin

登录:mj4 / test

向下滚动到“计划学习计划”标签

对象检查表示"转换为纪律(4)"的行。您将看到此元素是一个TD元素,其innerText为" Transition to Discipline"。

现在按开发者工具的“元素”选项卡中的Ctrl + F,按字符串,选择器或Xpath查找。键入以下内容以尝试通过Xpath查找: // TD [含有(文本(),'学科&#39)] 它找不到元素。这是为什么?

现在输入 // * [含有(文本(),'学科&#39)] 它找到了带有此文本的DIV元素,但这不是我想要/需要的元素。

如何找到td元素。请注意,我需要使用文本找到此元素。

以下是我找到元素的代码:

string xpath = string.Format("//td[contains(text(),'{0}')]", "Discipline");
IWebElement elemToExpandOrCollapse = PrgLrnPlanTbl.FindElement(By.XPath(xpath));

这是HTML:

<tbody ng-repeat="stage in vm.Stages.PortfolioEPAStages" class="ng-scope">
    <tr>
        <td class="text-left ng-binding" colspan="2">
            <!-- ngIf: stage.EPACount --><span ng-if="stage.EPACount" class="ng-scope"><span role="button" ng-hide="vm.isStageExpand==true &amp;&amp; stage.StageId==vm.selectedStageId" ng-click="vm.toggleStages(stage.StageId)" tabindex="0" cbd-enter="" first-tab="" class="ng-hide"><img class="" src="/cbd/Content/images/icons/icon.expand.png" alt="Expand"></span> <span role="button" ng-show="vm.isStageExpand==true &amp;&amp; stage.StageId==vm.selectedStageId" ng-click="vm.toggleStages()" tabindex="0" cbd-enter="" first-tab="" class=""><img class="" src="/cbd/Content/images/icons/icon.collapse.png" alt="Collapse"> </span> </span><!-- end ngIf: stage.EPACount --><!-- ngIf: stage.EPACount <=0 -->Transition to Discipline (4)
        </td>
    </tr>
    <!-- ngIf: stage.StageId==vm.selectedStageId --><tr ng-if="stage.StageId==vm.selectedStageId" class="ng-scope">
        <!-- ngIf: stage.EPACount>0 --><td colspan="2" ng-if="stage.EPACount>0" style="padding:0px;" class="ng-scope">
            <!--<div class=" row">
            <div class="col-md-12">
                -->

2 个答案:

答案 0 :(得分:1)

您的XPath不起作用,因为字符串“Discipline”不会出现在td元素的第一个文本节点子节点中,而是出现在后续文本节点中。你正在使用一个XPath 1.0处理器(天堂只知道为什么Selenium不会转向更现代的东西),而在XPath 1.0中,规则是包含(X,Y),当X是一组节点时,只考虑第一个该集合中的节点,并忽略其他节点。

我认为最接近你声明的要求的是//td[contains(., 'Discipline')]

答案 1 :(得分:0)

请试试这个:

//td[@class='text-left ng-binding' and ./span[contains(.,'Discipline')]]

OR

//td[@class='text-left ng-binding' and ./span/text()='Transition to Discipline (4)']