I've been testing in Selenium IDE. It's pretty easy to use, and I have created some test cases with it. I've been searching Google, trying to find a way to repeat my tests automatically. I've seen a solution with gotolabel, while loops, etc. But I couldn't make any of them works. Can someone give me a tip on how to loop my test n times, or loop forever. I appreciate any help.
No need to install/download anything, the built-in times command does this very easily:
Insert a new line at the beginning of your script, select times as its Command and 10 (for instance) as its Target.
Scroll down to the bottom of your script, and add a new line with end as its command
Press the "Run" button as usual.
Your commands are executed 10 times.
In this example I click on a button 2000 times:
To loop forever, just replace 10 with an extremely large number, that will take centuries to execute, which probably is as good as forever if you are running Selenium IDE.
Do this:
Download this js file: https://github.com/darrenderidder/sideflow/blob/master/sideflow.js
Launch Selenium IDE from Firefox and open the options menu.
Upload the .js file to the "Selenium Core extensions (user-extensions.js)" field.
The js file provides goto, gotoIf and while loop functionality in Selenium IDE. The example below shows a simple loop:
<tr>
<td>getEval</td>
<td>index = 0;</td>
<td></td>
</tr>
<tr>
<td>while</td>
<td>index < 10;</td>
<td></td>
</tr>
<tr>
<td>storeEval</td>
<td>index</td>
<td>value</td>
</tr>
<tr>
<td>echo</td>
<td>${value}</td>
<td></td>
</tr>
<tr>
<td>getEval</td>
<td>index++;</td>
<td></td>
</tr>
<tr>
<td>endWhile</td>
<td></td>
<td></td>
</tr>
as stated in the answer above, install the user extension, which will add loop functionality to Selenium IDE tests. The example below shows a simple loop:
<tr>
<td>getEval</td>
<td>index = 0;</td>
<td></td>
</tr>
<tr>
<td>while</td>
<td>index < 10;</td>
<td></td>
</tr>
<tr>
<td>storeEval</td>
<td>index</td>
<td>value</td>
</tr>
<tr>
<td>echo</td>
<td>${value}</td>
<td></td>
</tr>
<tr>
<td>getEval</td>
<td>index++;</td>
<td></td>
</tr>
<tr>
<td>endWhile</td>
<td></td>
<td></td>
</tr>
I'm new to Selenium (just started using it a few minutes ago). After a quick Google search for "selenium loop" this stackoverflow.com question came up. I immediately jumped into the extension and started using loops. The accepted answer is very helpful. However, I wanted to point out something else for others that are new to selenium (and stumble on this page).
I created a simple test for a simple web page. I added a loop so that the test would run indefinitely (until I paused/stopped it). However, I noticed that by doing this, the Runs/Failures counters within the Selenium GUI do not increment with each loop (I am guessing because a single test case was never running to completion, it was just looping indefinitely). So I dug a bit further. My goal was to leave the same test running for a long time (a few hours, or possibly overnight) to see if there were any failures (I'm chasing an intermittent bug at the moment).
The simplest way (for me, after a few minutes of searching/experimenting) was to do the following (likely no plugins needed, although the attached plugin is definitely helpful if you want to run a few small loops within a test case):
save the test case to a text file
save the test suite to a text file
open the test suite text file in a text editor
copy and paste the test case multiple times within the test suite (for example, a thousand times)
then open the test suite in Selenium, and run the test suite
Now I have the same simple test suite running many times, and the Runs/Failures counters are incrementing as expected (without the need for any loops).
Use the Flow Control plug-in for Firefox. After restarting Firefox, use the label command to mark a point in the script, and the gotolabel command to jump there.
For example:
Or if you'd rather see the source code, this is a label:
<tr>
<td>label</td>
<td>start</td>
<td></td>
</tr>
And this causes the execution point to jump back to the label:
<tr>
<td>gotolabel</td>
<td>start</td>
<td></td>
</tr>
There are other commands that you can see on the plug-in page, and documented in the
Selenium IDE: Flow Control GitHub project.
Selenium IDE now has flow control. These Control Flow commands work by specifying opening and closing commands to denote a set (or block) of commands.
Available Commands
Here are each of the available control flow commands accompanied by their companion and/or closing commands.
if, else if, else, end
times, end
do, repeat if
while, end
You can read more about it here:
https://www.seleniumhq.org/selenium-ide/docs/en/introduction/control-flow/
This is a sample for sampcop user in order to automate spam complaints using label and goto Label commands:
1st Login on spamcop.net
2nd use Report Spam option
3rd start this script
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://www.spamcop.net/sc" />
<title>testecase</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">testecase</td></tr>
</thead><tbody>
<tr>
<td>label</td>
<td>target1</td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>link=Report Now</td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>//input[#value='Send Spam Report(s) Now']</td>
<td></td>
</tr>
<tr>
<td>gotoLabel</td>
<td>target1</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
Your test suite file is just an HTML file, so just do the following:
<tr><td>testCase1</td></tr>
<tr><td>sameStep</td></tr>
<tr><td>testCase1</td></tr>
<tr><td>sameStep</td></tr>
Related
How to do with the Element ID changing repeatedly in selenium IDE ?
this comes when I click in the button and refresh the page and click it again !
<tr>
<td>open</td>
<td>/FEP/LoginHandlerServlet.htm</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=a2uPu0</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=tU9Pu0</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=qXCPu0</td>
<td></td>
</tr>
My web application develop with ZK ( Zkoss)!
any idea?
Try finding the element by xpath or by link text, not by ID.
by linktext:
driver.findElement(By.linkText("Link text")).click();
by xpath:
findElement(By.xpath("your xpath")).click();
I gouess in YOur situation linktext would be better.
This is a common problem that I find with certain web frames (e.g. Wicket) where the HTML id changes each time the web page is rendered. If the development team is on board with automating your tests, then there is typically a way to make these ID's static, solving your problem. Otherwise, as mentioned previously you have to use some other identifying tag.
Here is a good website to get you started on all of the available options that you have at your disposal.
I am first time using Selenium for automating some developer tests.
I have some intermediate steps, which needs to run based on certain condition like a while loop
<tr>
<td>clickAndWait</td>
<td>//a[contains(text(),'active listings')]</td>
<td></td>
</tr>
//while(delist elementPresent) -----------------------------
<tr>
<td>verifyElementPresent</td>
<td>name=delist</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=listing_check_all</td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>name=delist</td>
<td></td>
</tr>
<tr>
<td>verifyElementPresent</td> ------------repeated step
<td>name=delist</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=listing_check_all</td>
<td></td>
</tr>
<tr>
<td>clickAndWait</td>
<td>name=delist</td>
<td></td>
</tr>
//end while (i.e. delist element no longer present) ---------------
<tr>
<td>verifyText</td>
<td></td>
<td>No active listings found</td>
</tr>
One more question, can I automate this process from command line?
I can write a script (.bat/.sh) to automate the test case run.
Note: Please do understand that I am using selenium for the first time, just to automate few dev tests.
Selenium IDE doesn't give looping functionality, you will need to install an add on like this: https://github.com/darrenderidder/sideflow
There are plugins you can add to Selenium IDE that will help you accomplish loops. You can look at a list of plugins here.
I believe the plugin you're look to achieve the while loop with is called SelBlocks. I believe the Flow Control plugin does this as well. I've used this in the past with great success. A few things to note though:
(1) Don't expect documentation for these commands to show up in the Reference tab. You'll have to read the Selblocks Reference page listed with the plugin for examples on how to implement its commands.
(2) If you intend to export your 'Selenese' code over to Java, C#, Python, or any other language, these commands won't export over. You'll have to hard code anything you created that's directly associated with any plugin command('s) you used (i.e. while, for, if, etc...) in that programming language's native code.
Hope this helps someone out.
I am trying to run a test recorded using selenium IDE. The following html is generated by the IDE
<tr>
<td>clickAndWait</td>
<td>css=span.blt-txt</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=pt1:svMenu:np1:6:cni1::disclosureAnchor</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=pt1:r5:0:mr1:gts1:gts_pc1:itFilterFieldValue::content</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=pt1:r5:0:mr1:gts1:gts_pc1:cil1::icon</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=pt1:r5:0:mr1:gts1:gts_pc1:tt1:0::di</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=pt1:r5:0:mr1:gts1:gts_pc1:tt1:1:astTreeSNo</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id=pt1:r1:0:rAstDtl:0:cb4</td>
<td></td>
</tr>
<tr>
<td>click</td>
<td>id('pt1:ptGeneric:ot1::_afrTtxt')/x:div/x:h1</td>
<td></td>
</tr>
When I run the test/execute command I get an error saying [error] Element id=pt1:r5:0:mr1:gts1:gts_pc1:tt1:0::di not found
Any ideas how I can fix this?
the id seems to be generated try not to use this id or use contain
(try to use other xpath)
i would use only the last word of the id (you need to check it)
3.you can highlight to see where you are
example for contain
./li[contains(.,'Model')]]
Using generated ID in a testcase is usually a bad idea. When the server restarts / data change, these IDs tend to change, too.
Anyway, your problem seems to be the classical problem with timing. Are your elements AJAX-loaded when something is clicked / after a page change? If yes, Selenium tries to click them before they get fully loaded. You should use waitForElementPresent before you click on the element that causes trouble.
Generally, using Selenium IDE for AJAX-heavy pages uses to get hard very easily. Consider switching to manual Selenium RC writing or, even better, Selenium WebDriver. You can have the best of both worlds - first click through your test in IDE, then export your code to WebDriver in any language, make required changes, add waits (implicit are often enough), you're done.
I'd like to verify that all pages of a website, meet the following conditions:
assertElementPresent --> div.box
assertElementPresent --> #footer
assertElementNotPresent --> msg-error
In other words, It has a header, a footer, and does not have any error message.
Well, I can do this using Selenium ID, but adding these commands link by link, or command by command.
What I'm wondering, if there's any way to configure these 3 commands for the entire web site, instead of adding one by one per each link.
Hope it's clear.
The commands would most likely need to be put into your script after every navigation.
Best thing I could suggest would be that when you're recording your script put a 'wait for title' command in after every link navigation as you're recording it. That way you should be able to open the script itself in a text editor and just do a find and replace all on the wait for title. So for example
<tr>
<td>clickAndWait</td>
<td>css=link</td>
<td></td>
</tr>
<tr>
<td>waitForTitle</td>
<td>page title</td>
<td></td>
</tr>
Then find and replace:
<tr>
<td>waitForTitle</td>
with
<tr>
<td>assertElementPresent</td>
<td>div.box</td>
<td></td>
</tr>
<tr>
<td>assertElementPresent</td>
<td>#footer</td>
<td></td>
</tr>
<tr>
<td>assertElementPresent</td>
<td>msg-error</td>
<td></td>
</tr>
<tr>
<td>waitForTitle</td>
While recording through Selenium IDE, When a pop up window opens it is not getting recorded. "At the time of executing an error message is displayed.Please help me out.
If that pop up window has name, like opening from javascript window.open(URL, name).
Then it is possible to add the command to check the content of the popup. Like following command:
waitForPopUp | winId | 30000
selectWindow | winId
...
close
However, if the window has no name, like opened from <a target="_blank"> then you are out of luck.
Go to http://wiki.openqa.org/display/SEL/Selenium+Core+FAQ#SeleniumCoreFAQ-HowdoIworkwithapopupwindow%3F for further details.
Selenium IDE does not recognize any kind of popup, either you have to add it manually or Use Selenium RC, pop are handled there.
You must use the command WaitForPopUp and value 30000
Try this and record properly.
Unfortunately Selenium IDE record/replay doesn't always record everything. It tries it best to do that but if there is an AJAX call it may not record this.
Best practise is to use the record to get a the main body of the test and then adapt it to handle the parts that it missed
I suggest manually adding those extra lines to your tests.
Selenium IDE can record popup, below is my code I record Popup through selenium, check and let me know
<tr>
<td>click</td>
<td>id=edit-legal-accept</td> // click on this then pop up is open
<td></td>
</tr>
<tr>
<td>waitForPopUp</td>
<td>CtrlWindow</td>
<td>30000</td>
</tr>
<tr>
<td>selectWindow</td>
<td>name=CtrlWindow</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Terms And Conditions</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Terms & Conditions of Use</td>
<td></td>
</tr>
<tr>
<td>close</td>
<td></td>
<td></td>
</tr>
<tr>
<td>selectWindow</td> // This command used to select our main windows
<td>null</td>
<td></td>
</tr>