Vikram
Vikram

Reputation: 63

Select a radio button by text using XPath

<div class="btm0">Question 1
</div><span class="small"></span>
<span id="form2">
<span id="form2:j_idt4598" style="display: none;"></span><ul id="form2:radioButton" class="controls full-width">
<li>
<input class=" firepath-matching-node" name="form2:radioButton" id="form2:radioButton:0" type="radio"><label for="form2:radioButton:0"> Yes</label></li>
<li>
<input class=" firepath-matching-node" name="form2:radioButton" id="form2:radioButton:1" type="radio"><label for="form2:radioButton:1"> No</label></li>
</ul>
<span id="form2:errMessage"></span>
</span>
<div class="btm0">Question 2
</div><span class="small"></span>
<span id="form1">
<span id="form1:j_idt4617" style="display: none;"></span><ul id="form1:radioButton" class="controls full-width">
<li>
<input class=" firepath-matching-node" name="form1:radioButton" id="form1:radioButton:0"  type="radio"><label for="form1:radioButton:0"> Yes</label></li>
<li>
<input class=" firepath-matching-node" name="form1:radioButton" id="form1:radioButton:1"  type="radio"><label for="form1:radioButton:1"> No</label>

I have this above simple page having a label and option button.

I want to select the 'Question 1 - Yes' using an XPath.

Is there an easy way to create a unique XPath, which will select the correct 'YES' option (which could be Question 1 or Question 2)? I don´t want to hardcode the XPath.

I tried out a partial solution but I only get the second 'YES' option selected:

//*[contains(text(),'Question 1')]/following::label[contains(text(),'Yes')]

Upvotes: 0

Views: 1478

Answers (2)

Markus
Markus

Reputation: 3397

Not sure if this is what you are asking, but if you want to limit the scope of your XPath expression to just the 2 label elements after the div, you can use the position() function:

//div[contains(text(),'Question 1')]/following::label[position() <= 2 and contains(text(),'Yes')]

If this is not what you are looking for, please try to clarify your question, perhaps by providing some sample results.

Upvotes: 2

Vikram
Vikram

Reputation: 63

I was able to get some solution after try, but really not happy with the answer as I have to to change my xpath based on YES or NO of option button

for YES :

//*[contains(text(),'Question 1')]/./following::li[1]/label[contains(text(),'Yes')]

for NO :

//*[contains(text(),'Question 1')]/./following::li[2]/label[contains(text(),'Yes')]

As you see in the above solution, I have to toggle the values of li[].

But with above solution, I am able to pinpoint the option.

Upvotes: 0

Related Questions