Reputation: 3866
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="{"Id":10,"Name":"General","GroupName":"","DescStr":" ","Type":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="{"Id":10100,"Name":"System","GroupName":"","DescStr":"General System Permissions","Type":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="{"Id":10500,"Name":"Printer","GroupName":"","DescStr":"Printer's permissions","Type":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="{"Id":1050001,"Name":"Add New Printer","GroupName":"","DescStr":"Add Printer","Type":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="{"Id":1050002,"Name":"Edit Printer","GroupName":"","DescStr":"Edit Printer","Type":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="{"Id":1050003,"Name":"Delete Printer","GroupName":"","DescStr":"Delete Printer","Type":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="{"Id":1050010,"Name":"Print","GroupName":"","DescStr":"it's value contains the list of levels which can use to print","Type":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="{"Id":50,"Name":"POS","GroupName":"","DescStr":"","Type":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="{"Id":50100,"Name":"General","GroupName":"","DescStr":"General POS Permissions","Type":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="{"Id":5010010,"Name":"POS Login","GroupName":"","DescStr":"Login into pos","Type":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.
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
Reputation: 13722
You need to get clear concept of context position
and document order
involved in XPath Axis as following:
You can find above note from W3C XPATH Specification
To solve your issue, you can try id("checkboxOfInterest")/ancestor::li[1]//ul
Upvotes: 1
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
Reputation: 1868
Could you please try -
id("checkboxOfInterest")/ancestor::li/ul[contains(@class, "permission-item-list ")][1]
Upvotes: 0