Testing for javascript alerts with Capybara webkit - ruby-on-rails-3

i am using capybara , selenium ,webkit,and cucumber.
How I can dismiss the popup in headless browser? It always by default accept "ok". My test case works great selenium(I use this code page.driver.browser.switch_to.alert.dismiss) but fails for headless browser.
This is my test case
Feature: Deleting keywords
In order to use the app
I need to be able to delete keywords
Background:
Given the database contains no test data
Given there are accounts and users
And I am on the homepage
And I am signed in as "user"
Scenario: Successfully deliting keyword
When I create the following keywords:
| keyword | descrip | title |
| kitty | hello | Fluffy |
Then I should see "Keyword created."
When I follow "Keywords"
Then I should see "kitty"
When I attempt to delete the keyword "kitty"
And I dismiss popup
Then there should be 1 keyword
Then I should see "kitty"
Thanks for help

Finally I solved it. I have to move dismiss popup step before delete so something like When I attempt to delete the keyword "kw1" from the index-keywords page and dismiss the popup and my step definition is now
When(/^I attempt to delete the keyword "(.*?)" from the index\-keywords page and dismiss the popup$/) do |keyword|
page.driver.dismiss_js_confirms!
delete_keyword_from_keywords_index_page(keyword)
end

Related

Selenium IDE - Open dropdown

Is it possible to make selenium IDE open a dropdown menu to show all options? I have a test case where I need to open a dropdown and take a screenshot as evidence of all options there ... but can't figure out a way to do this. P.s: the click option does not do anything, already tried it.
Check this out:
storeXpathCount | //select[#id='LANGUAGE']/option | count
storeEval | window.document.getElementById('LANGUAGE').setAttribute('size', ${count}) | lol
But I don't know why do you need a screenshot to prove something while you can just check it by standart selenium IDE command:
assertText | id=LANGUAGE | - Select from list - (en_US) Canada Canadian French United States English
Check this code:
Actions action = new Actions(driver);
action.clickAndHold(driver.findElement(By.id("dropdownid"))).build().perform();
//you need to release the control from the test
//actions.MoveToElement(driver.findElement(By.id("dropdownid"))).Release();

Recording and storing selenium IDE random values

I need to extract with selenium IDE a random value that generates always after login again into the app. How can I extract the new value when the page is loaded again?
ex:
Logout button:
id=ext-gen123 Logout
That ID is always different when I logout and login again.. So as you all can see, it's kind of weird when I ran the test cases again and again.
Is there part of the string that's always the same?
xpath=//a[matches(#id,'ext-gen.*')]
See if you can consistently select it with that.
then use the storeAttribute command
storeAttribute | xpath=//a[matches(#id,'ext-gen.*')]#id | genIdVarName
You could add a class to the login element to make it easier to select.
Then you can use javascript if you want just part of the id string
some thing like
storeEval | storedVars['genIdVarName'].replace("ext-gen", "") | genNumberVarName
If this isn't what you want please add more detail to your question.

Selenium StoreText invalid xpath[2] error

I am new to selenium.
I tried to save a text from the xpath using storeText and the target is //*[#id='mathq2'].
the base URL is http://timesofindia.indiatimes.com/.
I am getting this error
[info] Executing: |storeText | //*[#id='mathq2'] | wwww |
[error] Invalid xpath [2]: //*[#id='mathq2']
Hi Danny got the same error in timesof india website. This is what i did.
I recorded the element (by entering something in the text box next to it) then clicked on the value like 8+0 = and then selected the radio button above it.
So my selenium showed
click id=mathq2
from there i chose the xpath in the Target dropdown and the xPath seemed to show
//span[#id='mathq2']
so finally I replaced my step for storeText as
storeText //span[#id='mathq2'] addition
and then it stored that value 8+0 = in the variable 'addition'.
You are getting this error, because there is no element with such xPath at the main page of http://timesofindia.indiatimes.com/.
Why do you think it is there?
You can use xPath Checker (Firefox plugin) to check if the xPath is proper and the element exists.
yes, ID is there, but text is changing dynamically.
You need to add the xpath= prefix in your target, and it seems that the xpath is also prepended with a period:
|storeText | xpath=.//*[#id='mathq2'] | wwww |
You would also need to ensure that your script waits for the initial advertisement page to unload.

Clicking on several links part dynamically generated

I'm new in Selenium and testing matters.
I'm trying to capture the id of an hyperlink element that is dynamically part generated.
The click action is recorded like as below when i make click on in selenium, the part in bold are dynamically generated, there are many of them on my page and can differ from one site to another(I'm testing cms). I'd like to capture and click on any one.
This is what I've tried to do since:
storeAttribute | //button#class onclick="setLocation(javascript{baseUrlSelection()}['/checkout/cart/add/uenc/(a-zA-Z0-9)/product/(0-9)]'')" | myid
echo | ${myid} |
clickAndWait | ${myid[0]}
It doesn't work
My links looks like this when click action is recorded in selenium:
buton[#onclick="setLocation('http://localhost/mydomaine/index.php/checkout/cart/add/uenc/aHR0cDovL2xvY2FsaG9zdC9NYWdlbnRvSGls
YWlyZURlbW9WMi9tYWdlbnRvZGVtb0hpbGFpcmVWMi9pbmRleC5waHAvY2F0ZWdvcmllMS5odG1sP19fX1NJRD1V/product/1/')">
Please Help.
Are you using the Selenium IDE? It would probably be much easier to do something using the other development environments, however if you really want to do looping:
Get the looping user-extension from this page
and run a script like this.
store | 0 | myCurrent
storeEval | var pattern=new RegExp("\\w*http://localhost/mydomaine/index.php/checkout/cart/add\\w*");var i=0;var total=0;while(i<window.document.getElementsByTagName('input').length){if (window.document.getElementsByTagName('input')[i].id.match(pattern)){window.document.getElementsByTagName('input')[i].id = 'testID_' + total;total=total+1;}i=i+1;}total; | myTotal
while | storedVars.myCurrent < storedVars.myTotal
storeAttribute | //input[contains(#id,'testID_${myCurrent}')]#class | myid
echo | ${myid}
clickAndWait | //input[contains(#id,'testID_${myCurrent}')]
store | javascript{storedVars.myCurrent++}
endWhile
What does the click on these buttons do? Does it postback the page or anything like that? If so, you'll need to move the storeEval | var pattern.... inside the while loop. What the javascript does is rename all of the inputs on the page that match the RegEx pattern (which you'll probably need to change to match your button ID's) to a sequential ID so you can loop through them easily. If there is a different pattern you can exploit, feel free to do that.
Javascript adapted from here
You can use the xpath contains() function to locate the items:
storeAttribute | //input[contains(#onclick,"setLocation('http://localhost/mydomaine/index.php/checkout/cart/add/uenc/")]#class | myid
echo | ${myid}
clickAndWait | //input[contains(#onclick,"setLocation('http://localhost/mydomaine/index.php/checkout/cart/add/uenc/")]#class
It is also a good idea to reference the elements by something other than their onclick attribute. Id or name would be good choices.

Selenium: How do I use javascript to clear a value from a form field?

I'm using the selenium IDE and the Selenium-Fitnesse Bridge fixture and I'm trying to test that when I clear a default value out of a form field, my form displays an error message.
So when I record with the Selenium IDE, what it does is the equivalent of telling Selenium to type nothing.
| type | text_field | |
The problem with this is that the Fitnesse fixture I'm using expects that second argument to not be null.
Is there a way in Selenium to "clear a value" rather than "typing nothing"?
You can do it via javascript as such:
| verifyEval | javascript{this.browserbot.getCurrentWindow().document.getElementById('CONTROL_ID').value = ''} ||
Effectively the verifyEval statement allows you to execute any piece of javascript that you'd like. Makes some difficult problems to accomplish with Selenium much simpler.
I used this tutorial (today believe it or not) to figure things out.
I used this to get it to work. reg_start_date is the id of my input field.
| storeEval | window.document.getElementById('reg_start_date').value = '' |
From the selenium reference:
Note that, by default, the snippet will run in the context of the "selenium" object itself, so this will refer to the Selenium object. Use window to refer to the window of your application, e.g. window.document.getElementById('foo')
Also, avoid wrapping the javascript code with javascript{}, it will not work.
We had this issue at the beginning as well. Try: | type | text_field | blank |
Look for more info on the Fitnesse documentation for the use of blank and null.
:)