当前位置: 首页 > 知识库问答 >
问题:

XPath索引选择器返回整个数组,而不是索引处的元素

邵阳德
2023-03-14

出于某种原因,将索引放入XPath将返回整个对象数组,而不是索引处的对象数组

超文本标记语言

我正在研究的超文本标记语言如下所示:

<ul id="permission-list" style="padding-top:0px">

    <li id="10-list-item" data-model="{&quot;Id&quot;:10,&quot;Name&quot;:&quot;General&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot; &quot;,&quot;Type&quot;:0}" class="topLevel">
        <i onclick="ExpandableIcon(this)" href="#collapse-10" data-toggle="collapse" class="fa permission-collapse clickable fa-minus-square-o" aria-hidden="true" aria-expanded="true"></i> - 
        <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
            <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
            <span class="custom-control-indicator"></span>
        </label> General (
        <span class="selected-permission">0</span> of 6 )
        <blockquote class="blockquote permission-description">
            <p class="mb-0" style=" color: #5d9cc3;">

            </p>
        </blockquote>
        <ul class="permission-item-list collapse show" id="collapse-10" style="">

            <li id="10100-list-item" data-model="{&quot;Id&quot;:10100,&quot;Name&quot;:&quot;System&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;General System Permissions&quot;,&quot;Type&quot;:0}">

                <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                    <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                    <span class="custom-control-indicator"></span>
                </label> System 
                <blockquote class="blockquote permission-description">
                    <p class="mb-0" style=" color: #5d9cc3;">
                        General System Permissions
                    </p>
                </blockquote>
                <ul class="collapse permission-item-list" id="collapse-10100">

                </ul>
            </li>

            <li id="10500-list-item" data-model="{&quot;Id&quot;:10500,&quot;Name&quot;:&quot;Printer&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;Printer's permissions&quot;,&quot;Type&quot;:0}">

                <i onclick="ExpandableIcon(this)" href="#collapse-10500" data-toggle="collapse" class="fa permission-collapse clickable fa-minus-square-o" aria-hidden="true" aria-expanded="true"></i> - 
                <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0" id="checkboxOfInterest">
                    <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                    <span class="custom-control-indicator"></span>
                </label> Printer (
                <span class="selected-permission">0</span> of 4 )
                <blockquote class="blockquote permission-description">
                    <p class="mb-0" style=" color: #5d9cc3;">
                        Printer's permissions
                    </p>
                </blockquote>
                <ul class="permission-item-list collapse show" id="collapse-10500" style="">

                    <li id="1050001-list-item" data-model="{&quot;Id&quot;:1050001,&quot;Name&quot;:&quot;Add New Printer&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;Add Printer&quot;,&quot;Type&quot;:0}">
                        <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                            <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                            <span class="custom-control-indicator"></span>
                        </label> Add New Printer 
                        <blockquote class="blockquote permission-description">
                            <p class="mb-0" style=" color: #5d9cc3;">
                                Add Printer
                            </p>
                        </blockquote>
                    </li>

                    <li id="1050002-list-item" data-model="{&quot;Id&quot;:1050002,&quot;Name&quot;:&quot;Edit Printer&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;Edit Printer&quot;,&quot;Type&quot;:0}">
                        <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                            <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                            <span class="custom-control-indicator"></span>
                        </label> Edit Printer 
                        <blockquote class="blockquote permission-description">
                            <p class="mb-0" style=" color: #5d9cc3;">
                                Edit Printer
                            </p>
                        </blockquote>
                    </li>

                    <li id="1050003-list-item" data-model="{&quot;Id&quot;:1050003,&quot;Name&quot;:&quot;Delete Printer&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;Delete Printer&quot;,&quot;Type&quot;:0}">
                        <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                            <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                            <span class="custom-control-indicator"></span>
                        </label> Delete Printer 
                        <blockquote class="blockquote permission-description">
                            <p class="mb-0" style=" color: #5d9cc3;">
                                Delete Printer
                            </p>
                        </blockquote>
                    </li>

                    <li id="1050010-list-item" data-model="{&quot;Id&quot;:1050010,&quot;Name&quot;:&quot;Print&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;it's value contains the list of levels which can use to print&quot;,&quot;Type&quot;:0}">
                        <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                            <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                            <span class="custom-control-indicator"></span>
                        </label> Print 
                        <blockquote class="blockquote permission-description">
                            <p class="mb-0" style=" color: #5d9cc3;">
                                it's value contains the list of levels which can use to print
                            </p>
                        </blockquote>
                    </li>

                </ul>
            </li>

        </ul>
    </li>

    <li id="50-list-item" data-model="{&quot;Id&quot;:50,&quot;Name&quot;:&quot;POS&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;&quot;,&quot;Type&quot;:0}" class="topLevel">
        <i onclick="ExpandableIcon(this)" href="#collapse-50" data-toggle="collapse" class="fa permission-collapse clickable fa-minus-square-o" aria-hidden="true" aria-expanded="true"></i> - 
        <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
            <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
            <span class="custom-control-indicator"></span>
        </label> POS (
        <span class="selected-permission">0</span> of 2 )
        <blockquote class="blockquote permission-description">
            <p class="mb-0" style=" color: #5d9cc3;">

            </p>
        </blockquote>
        <ul class="permission-item-list collapse show" id="collapse-50" style="">

            <li id="50100-list-item" data-model="{&quot;Id&quot;:50100,&quot;Name&quot;:&quot;General&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;General POS Permissions&quot;,&quot;Type&quot;:0}">

                <i onclick="ExpandableIcon(this)" href="#collapse-50100" data-toggle="collapse" class="fa fa-plus-square-o permission-collapse clickable" aria-hidden="true"></i> - 
                <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                    <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                    <span class="custom-control-indicator"></span>
                </label> General (
                <span class="selected-permission">0</span> of 1 )
                <blockquote class="blockquote permission-description">
                    <p class="mb-0" style=" color: #5d9cc3;">
                        General POS Permissions
                    </p>
                </blockquote>
                <ul class="collapse permission-item-list" id="collapse-50100">

                    <li id="5010010-list-item" data-model="{&quot;Id&quot;:5010010,&quot;Name&quot;:&quot;POS Login&quot;,&quot;GroupName&quot;:&quot;&quot;,&quot;DescStr&quot;:&quot;Login into pos&quot;,&quot;Type&quot;:0}">
                        <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
                            <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
                            <span class="custom-control-indicator"></span>
                        </label> POS Login 
                        <blockquote class="blockquote permission-description">
                            <p class="mb-0" style=" color: #5d9cc3;">
                                Login into pos
                            </p>
                        </blockquote>
                    </li>

                </ul>
            </li>

        </ul>
    </li>

</ul>

HTML的屏幕截图

我想做什么

我正试图根据复选框编写硒测试。选中叶复选框只应选中该叶复选框,选中父复选框还应选中子复选框。

我的XPath选择器

在该代码中,为了便于XPath选择器的编写,我在开发人员控制台中的一个字段上放置了一个ID。尤其是这个:

<label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0" id="checkboxOfInterest">
    <input onchange="PermissionCheckOnChange(this,15)" type="checkbox" class="custom-control-input" value="">
    <span class="custom-control-indicator"></span>
</label>

在包含所需内容的容器上,我的完整XPath选择器变成

id("checkboxOfInterest")/ancestor::li//ul[contains(concat(" ", @class, " "), " permission-item-list ")][1]

期望

我希望这将在开发者控制台返回:

ul#collapse-10500.permission-item-list.collapse.show

现实

相反,我得到以下数组:

[ul#collapse-10500.permission-item-list.collapse.show, ul#collapse-10.permission-item-list.collapse.show, ul#collapse-10100.collapse.permission-item-list]

抱歉,这太冗长了,但有人能告诉我为什么要这样做,我的选择是什么吗?

共有3个答案

邰德业
2023-03-14

谓词[1]适用于表达式的最后一步,而不是整个表达式。例如,x/y[1]将返回每个x的第一个y子级。如果您只想要表达式x/y结果中的第一项,请使用括号:(x/y)[1]

江飞章
2023-03-14

你能不能试试-

id("checkboxOfInterest")/ancestor::li/ul[contains(@class, "permission-item-list ")][1]
广乐邦
2023-03-14

您需要明确XPath轴中涉及的上下文位置和文档顺序的概念,如下所示:

您可以从W3C XPATH规范中找到上述注释

要解决您的问题,您可以尝试id(“checkboxOfInterest”)/祖先::li[1]//ul

 类似资料:
  • 我一直得到错误: TypeError:列表索引必须是整数或片,而不是元组 尽管如此,就我有限的理解而言,列表索引是一个整数。 此代码: 给我上面的TypeError。 虽然当我这样做的时候: 这是怎么回事?

  • 我正在尝试从多索引数据帧中仅使用一个索引来创建新的数据帧。 理想情况下,我想要这样的东西: 和: 基本上,我想删除除level之外的多索引的所有其他索引。有没有一个简单的方法可以做到这一点?

  • 问题内容: 我正在努力使机器人围绕8 x 8的2d网格室移动,其中一部分正在初始化传感器,该传感器由围绕机器人的最近5个瓦片组成。 在这里,我创建了一个由5个元素组成的数组。 但是当我尝试像这样设置传感器的值时: 我得到“列表索引必须是整数,而不是元组”的错误。 问题答案: 您说的是一个“二维网格”-我假设它是一个列表列表。在这种情况下,您应该以以下方式访问其元素 而不是用该对索引外部列表。

  • 问题内容: 我正在尝试仅使用来自多索引DataFrame的一个索引来创建新的DataFrame。 理想情况下,我想要这样的事情: 和: 本质上,我想删除除level之外的多索引的所有其他索引。是否有捷径可寻? 问题答案: 一种方法是简单地重新绑定到所需的MultiIndex级别。您可以通过指定要保留的标签名称来做到这一点: 或使用级别的整数值: MultiIndex的所有其他级别将在此处消失。

  • 我正在为二和leetcode问题实现一个哈希映射。 映射的第一个数组创建一个散列数组作为“索引”,它是nums数组中每个元素的目标差异。然后,我对映射数组应用一个过滤器,以查看映射数组的2个元素是否包含在nums数组中,并返回这些元素的索引。 当索引被过滤到returnedArr中时,它似乎返回nums的第一个元素,而不是两个索引。[2] 返回之前的日志记录显示它正确地分别注册了索引0和1,而不是

  • 我想用Javascript实现合并排序作为一种学习经验。我有mergeSort(unsortedArray)函数,它接受一个未经排序的数组,并使用合并排序策略对其进行排序。mergeSort()调用merge(leftArray,rightArray),后者将两个数组合并在一起,得到一个数组。 我认为问题出在merge()函数上。在数组[8,8,7,5,4,6,3,2,1,5,9,8,7,6,5,