Mike Warren
Mike Warren

Reputation: 3866

XPath index selector returning the entire array, instead of the element at the index

For some reason, putting index in XPath is returning the entire array of objects, and not the one at the index

The HTML

The HTML I'm working on looks like this:

<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>

Screenshot of the HTML

Here's a screenshot of the HTML, simplified. enter image description here

What I'm trying to do

I'm trying to write Selenium test against the checkboxes. Checking a leaf checkbox should only check that leaf checkbox, and checking a parent checkbox should also check the child checkboxes.

My XPath selector

In that code, I placed an ID on one of the fields, for ease of XPath selector writing, in the Developer Console. This one in particular:

<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>

My full XPath selector, on the container containing what I want, then becomes

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

Expectation

I expect this to be returned at the Developer Console:

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

Reality

Instead, I get the following Array:

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

Sorry this is long-winded, but can someone guide me to why it's doing this and what my options are?

Upvotes: 0

Views: 588

Answers (3)

yong
yong

Reputation: 13722

You need to get clear concept of context position and document order involved in XPath Axis as following:

enter image description here

You can find above note from W3C XPATH Specification

To solve your issue, you can try id("checkboxOfInterest")/ancestor::li[1]//ul

Upvotes: 1

Michael Kay
Michael Kay

Reputation: 163468

A predicate [1] applies to the last step in your expression, not to the expression as a whole. For example, x/y[1] will return the first y child of every x. If you only want the first item in the result of the expression x/y, use parentheses: (x/y)[1].

Upvotes: 0

eduPeeth
eduPeeth

Reputation: 1868

Could you please try -

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

Upvotes: 0

Related Questions