Finding the text of a label using Capybara
Background: I have a KBA page and a set of question and answers, the answers are in the form of 5 possible answers using radio buttons. So I need to cycle through each label for each radio button to match up with valid answers in a yaml file.
HTML:
<div class="questions"></div>
<div class="answers"></div>
<p>
<label>
<input id="answers_question_0_1" type="radio" checked="checked" value="1" name="answers[question_0]"></input>
RADIO BUTTON TEXT 1
</label>
</p>
<p></p> #another radio button and label text 2
<p></p> #another radio button and label text 3
<p></p> #another radio button and label text 4
<p></p> #another radio button and label text 5
My test code:
def answer_questions
.
.
.
i=0
def answers
page.all('.answers')
end
#This is accessing the answer value from the selected correct question from the kba.yml file
valid_answers = this variable contains the valid answer to the question
#********THIS IS THE PROBLEM BLOCK*****************************
#Set the radio buttons if they match one of the answers
#correct_answer = answers[i].all(:radio_button).find do |radio|
valid_answers.include?(radio.parent.text)
end
#********THIS IS THE PROBLEM BLOCK*****************************
i +=1
unless #correct_answer
p "Unable to answer question: #{question_text}" and next
end
#correct_answer.select
end
The problem lies in the "problem block" noted in the above code snippet. I can't figure out how to get the text that is tied to one label/p tag per radio button, instead ALL radio button's text are returned and checked against the variable "valid_answers" and that always fails.
I basically want radio.button.text to equal "RADIO BUTTON TEXT 1" for it's respective radio button. But instead radio.button.text returns:
RADIO BUTTON TEXT 1 RADION BUTTON TEXT 2 RADIO BUTTON TEXT 3 etc.
I'm guessing it shouldn't be radio.parent.text but something else, which I'm not sure.
It looks like you're making this more complicated than it needs to be - you should just be able to do
answers[i].choose("the text of the radio button you want to select")
You can catch an exception if the value isn't found and output your warning there.
Note: parent in a Capybara element is not the HTML parent of that element - it's the element that a finder was called on when locating the given element - so in your case it's the .answers element. If you do want access to the nodes actual HTML parent element you can call element.find(:xpath, '..')
Related
I am working on an application for disabled people in which NVDA screen reader is supposed to read out the current date if the user hit on element(date picker/calendar/cleave) with tab. When Navigating from top to bottom of page NVDA is ignoring aria=current="date" ( doesn't reads out as current date), but reads out the same date when navigating from b0ttom-top of the page.
reference of code snippet:
<tag
attribute1
attribute2
aria-current="date"
>
<input /calendar (could be calendar in place of input)
attribute1
type="date"
aria-current="date"
attribute2
more attributes
>
</tag>
aria-current is supposed to tell you which element within a set of elements is the current one. It has various values with the most common one being "true".
I just tried the various values with NVDA on both Firefox and Chrome and they all seemed to work.
<button>foo</button>
<button aria-current="true">foo</button>
<button aria-current="page">foo</button>
<button aria-current="step">foo</button>
<button aria-current="location">foo</button>
<button aria-current="date">foo</button>
<button aria-current="time">foo</button>
The results from NVDA were:
"foo button"
"foo button, current"
"foo button, current page"
"foo button, current step"
"foo button, current location"
"foo button, current date"
"foo button, current time"
I'm using uib-datepicker-popup fairly heavily in my application. It has worked perfectly until this specific instance.
I am using it exactly the same as I have in every other instance of my application, but it only half works.
The "Today", "Clear" and "Done" buttons in the bottom bar work as expected (hitting "today" puts the date in the input and hides the calendar, "clear" clears the input and hides the calendar, "done" hides the calendar).
However, when I select any date/day on the calendar it highlights it, but the date does not populate in the input and the calendar remains open.
Here's my html:
<input type="text" class="form-control" name="convert_date" uib-datepicker-popup="M/d/yyyy" ng-model="vm.case.convert_date" ng-disabled="!vm.isActive" placeholder="m/d/yyyy" is-open="open" ng-click="open = true" ng-focus="open = true" show-weeks="false">
Any ideas why the date buttons won't populate the input?
ngModelOptions was the culprit here. I had it set for the entire view in this area of my application as follows:
ng-model-options="{ updateOn: 'blur click', debounce: {'blur': 0, 'click': 0} }"
This prevented the day/date buttons from being able to fire their events and populate the input and hide the calendar.
I resolved my problem by adding another instance of ngModelOptions directly as an attribute to my uib-datepicker-popup element like so:
<input ng-model-options="{ updateOn: 'default' }" name="convert_date" uib-datepicker-popup="M/d/yyyy" type="text" class="form-control" ng-model="vm.case.convert_date" ng-disabled="!vm.isActive" placeholder="m/d/yyyy" is-open="open" ng-click="open = true" ng-focus="open = true" show-weeks="false">
This reset the model behavior to the default settings, so that the datepicker could function properly again.
The following code works for radio buttons.
<xf:select1 id="User-Status-control" appearance="full" bind="User-Status-bind">
<xf:itemset ref="instance('User-status')/item">
<xf:label ref="#value"/>
<xf:value ref="#name"/>
</xf:itemset>
<xf:action ev:event="xforms-value-changed">
<xxf:script>
var op1 = ORBEON.xforms.Document.getValue(this);
alert("op1 : " + op1); // print the selected radio button ID.
</xxf:script>
</xf:action>
but it does not works for dropdown
<xf:select1 id="User-Status-control" bind="User-Status-bind" appearance="dropdown">
How can I get the value of an Orbeon dropdown control?
Because <fr:dropdown> AKA <xf:select1 appearance="dropdown"> is a compound control, you have to go search for the nested .xforms-select1 control. Something like:
ORBEON.xforms.Document.getValue(ORBEON.jQuery(this).find('.xforms-select1')[0])
I have updated the doc to reflect this.
I have a span:
<span class="ToolbarLinkButton" id="ComparisonReports" onclick="function_which_shows_dropdown_menu">
When I click on it I get drop down menu:
<div id="divPopupTemplateComparisonReports">
<div class="ToolbarButtonMenu">
<div class="ToolbarLinkButton" id="ComparisonReportsView" onclick="some_functions">
But when I try to click on element (id="ComparisonReportsView"), it says that: "Selenium::WebDriver::Error::ElementNotVisibleError: Cannot click on element"
on(Main) do |page|
page.spnComprReptVer_element.fire_event ("onclick")
page.divComprReptView_element.click
sleep 2
end
And when via fire_event it says that step passed but nothing was executed (no menu item clicked).
on(Main) do |page|
page.spnComprReptVer_element.fire_event ("onclick")
page.divComprReptView_element.fire_event ("onclick")
sleep 2
end
How I can click on it somehow other way, or what I can use?
I do not know your definition for divComprReptView_element but I assume it has #when_present just use it and give it a block to execute click(e.g. page.divComprReptView_element.when_present.click).
I have Radio button with value as "CREDIT_CARD" and the text of the radio button as "New". Now i need to select a radio button which has text "New".
<div>
<input type="radio" onchange="javascript:toggleAdvancedDisplay('pay_detail','CREDIT_CARD');" value="CREDIT_CARD" name="payment_type" style="margin:0; vertical-align: middle;"/>
<span class="value">New</span>
I tried the below xpath, but it doesn't locate the expected element.
/fieldset[1]/div/div/div[2]/input[#value='CREDIT_CARD']/fieldset[1]/div/div/div[2]/span[contains(text(), 'New')]
What is it i am doing wrong here?
You can try :
xpath = //input[#value='CREDIT_CARD' and following-sibling::span[contains(., 'New')]]
This will get input tag with CREDIT_CARD as value and whose sibling contains New as text.
The <span> element is not a child of the <input> element, but it is the next sibling. XPath should be:
/fieldset[1]/div/div/div[2]/input[#value='CREDIT_CARD' and following-sibling::span[1] = 'New']
Try this. Does this locate the element you're looking for?
xpath = //*[#value="CREDIT_CARD"]/span[contains(.,"New")]