<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-32259128</id><updated>2013-03-05T03:49:36.881-08:00</updated><category term="Sahi" /><category term="DCB2" /><category term="technical" /><category term="tyto" /><category term="2011" /><category term="releases" /><category term="Twist 2.0" /><category term="forums" /><category term="ThoughtWorks Studios" /><category term="XML" /><category term="IDE" /><category term="demo" /><category term="Function testing" /><category term="troubleshooting" /><category term="2012" /><category term="ZKOSS" /><category term="tutorials" /><category term="Agile" /><category term="Twist" /><category term="Cucumber" /><category term="Ruby" /><category term="BDD" /><category term="web automation" /><category term="xpath" /><category term="ui relations" /><category term="features" /><category term="video" /><category term="marketing" /><category term="eclipse" /><category term="stable tests" /><category term="XP Goa day" /><category term="update" /><category term="talks" /><category term="ZK" /><category term="web testing" /><title type="text">Sahi - Web Automation and Testing Tool</title><subtitle type="html">This blog is about Sahi, it's development, learnings, business and the progress of Sahi Software</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default?start-index=26&amp;max-results=25" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/SahiSoftware" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="sahisoftware" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><id>tag:blogger.com,1999:blog-32259128.post-2483901098768018525</id><published>2011-12-28T19:56:00.000-08:00</published><updated>2011-12-28T20:15:05.302-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2011" /><category scheme="http://www.blogger.com/atom/ns#" term="tyto" /><category scheme="http://www.blogger.com/atom/ns#" term="2012" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Been a long year!</title><content type="html">2011 has been awesome for us. Tyto Software has grown and become a self sustaining unit with a team that has really come together. Sahi Pro is well received and we released V4.0 recently. We also added a lot of new customers; customers, who have expressed happiness at how our product works and how we support them. We added Flex capability, load testing, better reporting etc. to Sahi Pro, and the results have been very positive. A surprising hit feature was our Excel Framework, which saves a lot of time for users not very comfortable with programming. &lt;br /&gt;&lt;br /&gt;While our support is generally well appreciated, we have been trying our best to keep improving on it. One sore point has been our lack of online payment processing methods, which we are trying to alleviate in January 2012.&lt;br /&gt;&lt;br /&gt;Over all, we are geared well for 2012, having brought on a couple more to the team and put in processes which make the end user benefit a lot from using our product.&lt;br /&gt;&lt;br /&gt;So where is Sahi Open Source? We have been very busy with the Pro version and we should be able to get a breather in January to port back fixes into Sahi OS.&lt;br /&gt;&lt;br /&gt;Thank you all for your patronage, and wish you a very happy and prosperous New Year!</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/2483901098768018525/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=2483901098768018525" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/2483901098768018525" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/2483901098768018525" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2011/12/been-long-year.html" title="Been a long year!" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-1579455942505088260</id><published>2011-03-14T05:47:00.000-07:00</published><updated>2011-03-14T06:09:07.126-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi V3.5 2011-03-14 released</title><content type="html">Sahi V3.5 2011-03-14 is now available on SourceForge. &lt;br /&gt;&lt;br /&gt;1) We have added support for HTML5 elements, so, for example, &lt;br /&gt;&amp;lt;input type="number" id="myId"&amp;gt; is identified by Sahi as _numberbox("myId")&lt;br /&gt;&lt;br /&gt;2) Proxy switching on IE has become a little better&lt;br /&gt;&lt;br /&gt;3) _collect and _count have been added.&lt;br /&gt;&lt;br /&gt;Eg.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;_assertEqual(5, _count("_link", "View Details"));&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;and &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;var $els = _collect("_link", "/View/");&lt;br /&gt;var $len = $els.length;&lt;br /&gt;_assertEqual(5, $len);&lt;br /&gt;_assertEqual("View Details", _getText($els[0]));&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;4) Ignorable ids made a user modifiable property in sahi.properties/userdata.properties. So if  you have a new framework which generates ids in a definite pattern, you can ask Sahi to not use them as identifiers for accessors.&lt;br /&gt;Look at recorder.ignorable_ids.pattern in sahi.properties&lt;br /&gt;&lt;br /&gt;5) Checkbox simulation has fluctuated a bit in the last few builds of Chrome. Sahi now assumes Chrome 10+ as default. This is modifiable in sahi.properties&lt;br /&gt;&lt;blockquote&gt;simulation.chrome.explicit_checkbox_radio_toggle=true&lt;/blockquote&gt;&lt;br /&gt;Change to false if the checkboxes seem to toggle back to original state.&lt;br /&gt;&lt;br /&gt;Download the latest version from here: &lt;a href="https://sourceforge.net/projects/sahi/files/"&gt;https://sourceforge.net/projects/sahi/files/&lt;/a&gt;&lt;br /&gt;and do spread the good word. You can &lt;a href="http://twitter.com/share?_=1300107755211&amp;count=horizontal&amp;text=Sahi%20v3.5%20new%20release!&amp;url=http%3A%2F%2Fblog.sahi.co.in%2Fw%2F&amp;via=_sahi"&gt;tweet&lt;/a&gt; about it, or &lt;a href="http://www.facebook.com/pages/Sahi/132288696813329"&gt;like us on Facebook&lt;/a&gt; or write a blog post about it. &lt;br /&gt;&lt;br /&gt;Wish you happy productive testing!</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/1579455942505088260/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=1579455942505088260" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/1579455942505088260" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/1579455942505088260" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2011/03/sahi-v35-2011-03-14-released.html" title="Sahi V3.5 2011-03-14 released" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-2313763369827148028</id><published>2011-02-27T19:15:00.001-08:00</published><updated>2011-02-27T20:16:56.638-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ui relations" /><category scheme="http://www.blogger.com/atom/ns#" term="stable tests" /><category scheme="http://www.blogger.com/atom/ns#" term="web automation" /><category scheme="http://www.blogger.com/atom/ns#" term="xpath" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><category scheme="http://www.blogger.com/atom/ns#" term="web testing" /><title type="text">Stable accessors/locators using UI Relations</title><content type="html">Identification of elements in a web interface is one of the toughest challenges of software UI automation. First came accessing by location (x,y coordinates), which quickly faded away due to window resolutions, rendering differences etc. Then came the concept of identification using code structure. XPath became hugely popular; &lt;br /&gt;&lt;br /&gt;Reasons being &lt;br /&gt;1) Automation was only attempted by established developers and they understood XPaths &lt;br /&gt;2) 5 years back web applications were simple enough to easily look at the DOM and identify XPaths.&lt;br /&gt;3) Some (silly!) tools adopted and hugely promoted XPaths for want of innovation on that front. &lt;br /&gt;&lt;br /&gt;But XPaths quickly became notorious for being unmaintainable and difficult to understand. If test automation was to spread to non-programmer testers, this would be a huge barrier. Tools then tried to move on to css-selectors, which is still complex for the target test automation teams.&lt;br /&gt;&lt;br /&gt;So what could be a possible solution? The answer is in the User Interface.&lt;br /&gt;&lt;br /&gt;What is often forgotten in the software industry, is that applications are built to satisfy business needs. So whatever the id, XPath or css-selector is, a textbox meant for "loan amount" will always be near some label saying "Loan Amount". An expand or collapse icon in a tree gets its meaning from the attached "User name" label for that node. These business requirements do not change as often as code or underlying HTML structure. An HTML table may get converted to an ext-js grid with scrollbars, but the cost will still be associated (and aligned) with a product and listed under the heading "Cost". Items related to each other would be shown inside a box with an appropriate heading.&lt;br /&gt;&lt;br /&gt;How can we use this information to identify elements? Use UI relations for identification. Sahi, which has been a pioneer in web-automation innovation, handles it as below:&lt;br /&gt;&lt;br /&gt;A textbox meant for "loan amount" becomes &lt;br /&gt;&lt;br /&gt;_textbox(0, _near(_label("Loan Amount")))&lt;br /&gt;or&lt;br /&gt;browser.textbox(0).near(browser.label("Loan Amount"))&lt;br /&gt;&lt;br /&gt;The cost becomes&lt;br /&gt;&lt;br /&gt;_cell(0, _near(_div("My product one")), _under(_div("Cost")))&lt;br /&gt;&lt;br /&gt;The expand collapse icon becomes&lt;br /&gt;&lt;br /&gt;_image("/tree-node-icon/", _near(_span("Expand me")))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1) These accessors clearly communicate what the intention of the accessor is, in a straight forward way (within the constraints of programming language constructs).&lt;br /&gt;2) These also take away the complexity in identifying and stabilizing XPaths, or understanding complex css-selectors, or writing custom javascript loops to accomplish the same thing.&lt;br /&gt;3) They are quite stable. _near allows for more elements to come between two related elements, _under is spatially aligned. So you can move different elements around on the UI and still have your scripts working properly.&lt;br /&gt;&lt;br /&gt;UI Relations are guaranteed to exist in any business application, irrespective of whether you have ids or not.&lt;br /&gt;&lt;br /&gt;One argument that comes up is, what if there are two similar elements which satisfy the same condition. While it is still possible to index the similar accessors and uniquely identify them, it seldom happens in a real world application. If you have two textboxes near "Loan amount", it is going to confuse your end user. User-interfaces do not generally have such anomalies. That said, an added index to the accessor handles that scenario too, if it arises.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There is one other simplification that Sahi does in its accessor APIs. It does not explicitly state what the identifying property is. For example what could have been&lt;br /&gt;&lt;br /&gt;_textbox(&amp;lt;where name="username"&amp;gt;)&lt;br /&gt;&lt;br /&gt;is simply given as&lt;br /&gt;&lt;br /&gt;_textbox("username") in Sahi.&lt;br /&gt;&lt;br /&gt;Why? Because there are very few cases where one textbox has name="username" and another has id="username". Such naming would obviously confuse the web developer forcing him to not do something like this. &lt;br /&gt;&lt;br /&gt;Combined with UI relations, Sahi also takes care of automatically waiting for AJAX requests and page loads. This makes for robust scripts which hardly have unexpected failures. Other features like parallel playback of suites, automatic report generation, ant integration etc. make Sahi one of the most advanced web testing tools in the industry. If you have not tried it yet, download from &lt;a href="http://sourceforge.net/projects/sahi/files/"&gt;http://sourceforge.net/projects/sahi/files/&lt;/a&gt; now. You can also use Sahi from inside &lt;a href="http://www.thoughtworks-studios.com/agile-test-automation/"&gt;ThoughtWorks Studios Twist&lt;/a&gt; or &lt;a href="http://www.pushtotest.com/"&gt;PushToTest's TestMaker 6&lt;/a&gt;.</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/2313763369827148028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=2313763369827148028" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/2313763369827148028" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/2313763369827148028" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2011/02/stable-accessorslocators-using-ui.html" title="Stable accessors/locators using UI Relations" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-6286474798024916528</id><published>2010-11-08T05:10:00.000-08:00</published><updated>2010-11-08T08:51:46.293-08:00</updated><title type="text">October 2010 Update</title><content type="html">Hope you had a happy Deepavali. &lt;br /&gt;&lt;br /&gt;October continued to be busy. We worked towards the next open source release, with lots of fixes and enhancements. Release was made on 3rd Nov. 2010, just before Deepavali. Part of the focus was on better integration with test management tools. A detailed post on integration shall follow. The new build can be downloaded here: &lt;a href="http://sourceforge.net/projects/sahi/files/sahi-v3/2010-11-03/sahi_20101103.zip/download"&gt;http://sourceforge.net/projects/sahi/files/sahi-v3/2010-11-03/sahi_20101103.zip/download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We did a 2 day online training of Sahi for Advance Internet Inc. We also delivered proof of concept of flex automation to a prospective customer in the banking domain. The flex solution does not need re-compilation of flex code, so may be suitable for environments where modifying code may not be possible.&lt;br /&gt;&lt;br /&gt;We could not conduct a webinar last month, but we shall be conducting one on 16th Nov. 2010. Click here to join our webinar: &lt;a href="https://www3.gotomeeting.com/register/301637230"&gt;https://www3.gotomeeting.com/register/301637230&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We are streamlining the process of support and sales for Sahi Pro online, which should be done by the end of November. Meanwhile, if you have queries on Sahi Pro, please email us at support@sahi.co.in&lt;br /&gt;&lt;br /&gt;I did get invited to GTAC on the second day, and managed to talk a little about Sahi's object recognition mechanism. But it would have been much better if I had had time for a full presentation on Sahi. We also had discussions with the WebDriver developers to see if we could adopt WebDriver underneath Sahi. Preliminary investigations reveal that we need to wait some time for WebDriver to mature before we can adopt it. Currently WebDriver supports only one instance of IE on a machine, which may work if you had a Google farm at your disposal, but will not work for Sahi's users who are used to running multiple IE instances simultaneously on a single machine.</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/6286474798024916528/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=6286474798024916528" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/6286474798024916528" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/6286474798024916528" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/11/october-2010-update.html" title="October 2010 Update" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-7954858457465816401</id><published>2010-10-05T20:55:00.000-07:00</published><updated>2010-10-06T19:25:46.411-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tyto" /><category scheme="http://www.blogger.com/atom/ns#" term="update" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">September Update</title><content type="html">The past month has been very special for us. We delivered &lt;a href="http://sahi.co.in/w/sahi_pro"&gt;Sahi Pro&lt;/a&gt; to our customers, and without even publishing about it, we got many inquiries about Sahi Pro. This was something we had not expected, but would like more of.&lt;br /&gt;&lt;br /&gt;Given the number of support queries coming in, we had to scale to better serve our customers. So Boopathi M joins our team as a support engineer. With a background in programming and teaching mathematics online, we look forward to utilizing his tutoring capabilities to solve technical issues in Sahi for our customers. &lt;br /&gt;&lt;br /&gt;We also managed to have a presence in Java One, thanks to &lt;a href="http://www.pushtotest.com/"&gt;PushToTest&lt;/a&gt;'s generous offer to all its partners to show case themselves. Given that Sahi has started playing a good role in TestMaker's web automation part, this turned out to be a good point of synergy.&lt;br /&gt;&lt;br /&gt;I (Narayan) also participated as one of the panelists in the Birds Of a Feather session on open source testing tools, thanks again to Frank, CEO of PushToTest. (It is amazing what PushToTest is doing to promote open source products. If ThoughtWorks is the breeding ground for open source projects, I would say PushToTest is one of the few companies that helps them bootstrap and become commercially viable.) We realized Sahi is almost unheard of in the Java developer community! So we are coming up with ways to rectify that. If you have suggestions, do let us know.&lt;br /&gt;&lt;br /&gt;This month was also great because we got lots and lots of praise for Sahi (&lt;a href="http://sahi.co.in/forums/viewtopic.php?id=1855"&gt;read some testimonials&lt;/a&gt;). We had 4 instances of Sahi users reporting that they shifted from QTP to Sahi because QTP had problems identifying some web elements, which Sahi could easily identify. Some of them also had problems on QTP's Windows 7 support. &lt;br /&gt;&lt;br /&gt;Selenium continues to annoy us with its presence. We again had 3 different discussions with users who said "We find Sahi to be much easier to use but developers/management (in the US) have heard only of Selenium." A &lt;a href="http://stackoverflow.com/questions/606550/watir-vs-selenium-vs-sahi"&gt;stackoverflow question&lt;/a&gt; has considerably undermined Sahi's capabilities and slandered DP, one of Sahi's old and staunch supporters. It was frustrating to know we can't do much about it. Equally unhelpful is the fact that we will not be able to participate in GTAC 2010 because "the committee reviewed each application with special attention towards contributions to the professional community, among other aspects. We regret to inform you that you have not been short-listed to attend this year's conference." We would have loved some discussion with the WebDriver guys.&lt;br /&gt;&lt;br /&gt;Our website was hacked twice last month and if you find google search results showing weird titles for Sahi searches, please let us know on the forums or email us.&lt;br /&gt;&lt;br /&gt;We have started a &lt;a href="http://www.facebook.com/pages/Sahi/132288696813329"&gt;facebook page for Sahi&lt;/a&gt;, so please do spread the word.  &lt;br /&gt;&lt;br /&gt;We now have integrations with Test Management tools like &lt;a href="http://www.xqual.com"&gt;XQual&lt;/a&gt;, &lt;a href="http://www.testuff.com"&gt;Testuff&lt;/a&gt; and &lt;a href="http://www.neuvosoft.com/"&gt;Neuvosoft Test Manager&lt;/a&gt;, and we will continue to support more. Coming up is integration with &lt;a href="http://www.qmetry.com"&gt;QMetry&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Things on the roadmap (Oct-Nov):&lt;br /&gt;1) Flex/Flash support(Pro)&lt;br /&gt;2) Simple loadtesting through HTMLUnit (Pro)&lt;br /&gt;3) Integration APIs for Test Management tools (Open and Pro) &lt;br /&gt;&lt;br /&gt;We continue with our integrations with &lt;a href="http://www.pushtotest.com/"&gt;PushToTest&lt;/a&gt;'s TestMaker and Test Object Designer, and with &lt;a href="http://www.thoughtworks-studios.com/agile-test-automation"&gt;ThoughtWorks Studios' Twist&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We will be starting webinars every two weeks as an introduction to Sahi. The first session is (tentatively) scheduled for 22 October 2010. If interested please email us at support@sahi.co.in&lt;br /&gt;&lt;br /&gt;Thanks for reading through. If you have suggestions, queries or advice, please email us at feedback(at)sahi.co.in. Hope to see you next month!</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/7954858457465816401/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=7954858457465816401" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/7954858457465816401" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/7954858457465816401" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/10/september-update.html" title="September Update" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-309965447959269310</id><published>2010-06-10T22:35:00.000-07:00</published><updated>2010-06-10T22:43:54.996-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi V3 2010-06-10 released</title><content type="html">Sahi V3 (2010-06-10) is now available for download. &lt;a href="https://sourceforge.net/projects/sahi/"&gt;https://sourceforge.net/projects/sahi/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;There have been significant improvements and bugfixes in this release.&lt;ul&gt;&lt;br /&gt;&lt;li&gt;API _under ( http://sahi.co.in/w/browser-accessor-apis ) has been added to locate elements physically under another. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;API _byXPath has been added to help users from Selenium and other tools move to Sahi. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;API _row and _option have been modified to be in sync with other APIs. Existing scripts may need to be modified if you use these APIs. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Below is the changelog: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;10 Jun 2010 &lt;br /&gt;----------- &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* Bugfixes &lt;br /&gt;Fixed data truncation bug introduced in 30 Apr build &lt;br /&gt;Fixed getText bug which returned ab on FF and a b on IE for a&amp;lt;br&amp;gt;b &lt;br /&gt;Fixed for &amp;amp;nbsp; in select option text &lt;br /&gt;Fixed window.opener behaviour for link clicks &lt;br /&gt;Fixed parsing error for $a == $b &lt;br /&gt;&lt;br /&gt;* Features added &lt;br /&gt;Added Shiretoko as variant of Firefox &lt;br /&gt;_byXPath added. &lt;br /&gt;   For browsers without XPath support, &lt;br /&gt;   download the javascript file from http://coderepos.org/share/wiki/JavaScript-XPath &lt;br /&gt;   and save the contents in sahi/htdocs/spr /javascript-xpath.js &lt;br /&gt;_under added as a positional relation &lt;br /&gt;   Lets identify elements under another element eg. _cell(0, _under(_tableHeader("Status"))) &lt;br /&gt;5xx errors are displayed on screen too. &lt;br /&gt;Time taken by each test is displayed in logs. &lt;br /&gt;XHR redirects are excluded from injection &lt;br /&gt;Added Driver.setControllerMode. Takes sahi, java, ruby &lt;br /&gt;_option brought in sync with other APIs. &lt;br /&gt;   NOTE: older _option(selElement, value) will not work any more &lt;br /&gt;   Replace with _option(value, _in(selElement)) &lt;br /&gt;_row brought in sync with other APIs. &lt;br /&gt;   NOTE: older _row(tablElement, rowNumber) will not work any more &lt;br /&gt;   Replace with _row(rowNumber, _in(tablElement))&lt;br /&gt;&lt;/pre&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/309965447959269310/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=309965447959269310" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/309965447959269310" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/309965447959269310" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/06/sahi-v3-2010-06-10-released.html" title="Sahi V3 2010-06-10 released" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-8672576048064904274</id><published>2010-05-10T04:57:00.000-07:00</published><updated>2010-05-10T05:34:19.367-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cucumber" /><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Ruby Sahi with Cucumber</title><content type="html">What is Cucumber? &lt;blockquote&gt;Cucumber lets software development teams describe how software should behave in plain text. The text is written in a business-readable domain-specific language and serves as documentation, automated tests and development-aid - all rolled into one format. &lt;br /&gt;- From &lt;a href="http://cukes.info/"&gt;http://cukes.info/&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Follow the steps below to get started with Ruby Sahi and &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;. &lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Install Java&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install Ruby&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install cucumber: &lt;br /&gt;&lt;pre&gt;gem install cucumber&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install Sahi proxy: &lt;a href="http://sourceforge.net/projects/sahi/files/"&gt;Download Sahi from sourceforge&lt;/a&gt; and unzip to some location. (say D:\sahi)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Start Sahi: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd D:\sahi\userdata\bin&lt;br /&gt;start_sahi.bat&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install Sahi Ruby client: &lt;pre&gt;gem install sahi&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a file D:\test\login.feature, add the content below and save it.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Feature: Login&lt;br /&gt;  In order to access the system&lt;br /&gt;  As a user&lt;br /&gt;  I want to be able to login&lt;br /&gt;  &lt;br /&gt;  Scenario: Login with valid credentials&lt;br /&gt;    Given I am not logged in&lt;br /&gt;    When I try to login with "test" and "secret"&lt;br /&gt;    Then I should be logged in&lt;br /&gt;    &lt;br /&gt;  Scenario: Login with invalid credentials&lt;br /&gt;    Given I am not logged in&lt;br /&gt;    When I try to login with "test" and "wrongpassword"&lt;br /&gt;    Then I should not be logged in&lt;br /&gt;    And I should be shown error message "Invalid username or password"&lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Run this feature:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd D:\test\&lt;br /&gt;cucumber login.feature&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There will be a lot of messages with hints on implementing the right steps.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Implement the steps:&lt;br/&gt;&lt;br /&gt;Create a file D:\test\login.rb, add the content below and save it&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;require  'sahi'&lt;br /&gt;&lt;br /&gt;def init_browser()&lt;br /&gt;  #Use the correct paths from your system&lt;br /&gt;  userdata_dir = "D:/sahi/userdata"&lt;br /&gt;  browser_path = "C:\\Program Files\\Mozilla Firefox\\firefox.exe"&lt;br /&gt;  browser_options = "-profile #{userdata_dir}/browser/ff/profiles/sahi0 -no-remote"&lt;br /&gt;  return Sahi::Browser.new(browser_path, browser_options)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#open the browser at the start&lt;br /&gt;browser = init_browser()&lt;br /&gt;browser.open&lt;br /&gt;&lt;br /&gt;#close the browser on exit&lt;br /&gt;at_exit do&lt;br /&gt;  browser.close&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Given /^I am not logged in$/ do&lt;br /&gt;  browser.navigate_to("http://sahi.co.in/demo/training/index.htm")&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;When /^I try to login with "([^\"]*)" and "([^\"]*)"$/ do |username, password|&lt;br /&gt;  browser.textbox("user").value = username&lt;br /&gt;  browser.password("password").value = password&lt;br /&gt;  browser.submit("Login").click&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Then /^I should be logged in$/ do&lt;br /&gt;  if !browser.button("Logout").exists?()&lt;br /&gt;    raise "Not logged in"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Then /^I should not be logged in$/ do&lt;br /&gt;  if !browser.submit("Login").exists?()&lt;br /&gt;    raise "Logged in"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Then /^I should be shown error message "([^\"]*)"$/ do |msg|&lt;br /&gt;  value = browser.div("errorMessage").text() &lt;br /&gt;  if value != msg&lt;br /&gt;    raise "Incorrect message: #{value}" &lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Run and watch the tests complete successfully&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cd D:\test\&lt;br /&gt;cucumber login.feature&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Done!&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/8672576048064904274/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=8672576048064904274" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8672576048064904274" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8672576048064904274" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/05/ruby-sahi-with-cucumber.html" title="Ruby Sahi with Cucumber" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-5011959530026208831</id><published>2010-05-08T20:51:00.000-07:00</published><updated>2010-05-08T22:12:29.755-07:00</updated><title type="text">Sahi API _under added</title><content type="html">Continuing with our tradition of innovation for simplicity, Tyto adds another wonderful API to Sahi.&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;NOTE: _under will be available in Sahi's next release&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The problem&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;Let us take the example of a dynamically generated grid. The example we use here is available at http://www.zkoss.org/zkdemo/userguide/#g7&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_94EzacITAcY/S-Y_iCulanI/AAAAAAAAA0M/LInk-af25fQ/s1600/data_grid.png"&gt;&lt;img src="http://2.bp.blogspot.com/_94EzacITAcY/S-Y_iCulanI/AAAAAAAAA0M/LInk-af25fQ/s320/data_grid.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5469128651568409202" style="cursor: pointer; width: 320px; height: 132px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;We wish to assert the value of "Received" column for "Style Guide for ZK 3.5 released". If we bring up the controller and CTRL-hover over that element, what we see is &lt;div&gt;_div("2008/11/14 13:23:07") &lt;/div&gt;&lt;div&gt;which is not useful as a finder.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_94EzacITAcY/S-Y_6jpEq8I/AAAAAAAAA0U/E-31SOKa-7w/s1600/accessor.png"&gt;&lt;img src="http://3.bp.blogspot.com/_94EzacITAcY/S-Y_6jpEq8I/AAAAAAAAA0U/E-31SOKa-7w/s320/accessor.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5469129072720522178" style="cursor: pointer; width: 320px; height: 125px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Looking at the alternatives listed, we notice that none of them can really help.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_94EzacITAcY/S-Y_7JUe9-I/AAAAAAAAA0c/YtE3wQAvwrE/s1600/alternatives.png"&gt;&lt;img src="http://3.bp.blogspot.com/_94EzacITAcY/S-Y_7JUe9-I/AAAAAAAAA0c/YtE3wQAvwrE/s320/alternatives.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5469129082834712546" style="cursor: pointer; width: 276px; height: 64px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;To fix this, we shall try using _near.&lt;br /&gt;&lt;br /&gt;1) We put &lt;/div&gt;&lt;div&gt;_div(0, _near(_div("Style Guide for ZK 3.5 released"))) &lt;/div&gt;&lt;div&gt;into the Evaluate Expression box, and click Highlight. This highlights the "Style Guide" element itself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;2) We experiment with the index passed as the first parameter, and using Highlight, pinpoint on the correct accessor as&lt;br /&gt;&lt;b&gt;_div(4, _near(_div("Style Guide for ZK 3.5 released")))&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_94EzacITAcY/S-Y_7Xyx4VI/AAAAAAAAA0k/vVCmfmo_OIo/s1600/eval_1.png"&gt;&lt;img src="http://3.bp.blogspot.com/_94EzacITAcY/S-Y_7Xyx4VI/AAAAAAAAA0k/vVCmfmo_OIo/s320/eval_1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5469129086719877458" style="cursor: pointer; width: 320px; height: 86px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;But this will not make a good accessor&lt;/b&gt;.&lt;br /&gt;Why?&lt;br /&gt;Because, this uses an index which seems like it would change when another column is added before the Received column.&lt;br /&gt;&lt;br /&gt;What we really want, is that element, which is UNDER _div("Received").&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Introducing the _under API  &lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;_under(element):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;_under is a POSITIONAL marker. What it means is that it checks for coordinate based alignment under a particular element within a specific threshold.&lt;br /&gt;So, in our case, it will look for a div which is roughly positioned underneath _div("Received")&lt;br /&gt;&lt;br /&gt;Here is the final accessor:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;_div(0, _near(_div("Style Guide for ZK 3.5 released")), _under(_div("Received")))&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_94EzacITAcY/S-Y_8Z0S8JI/AAAAAAAAA00/Q18nAr19Hnc/s1600/under_accessor.png"&gt;&lt;img src="http://4.bp.blogspot.com/_94EzacITAcY/S-Y_8Z0S8JI/AAAAAAAAA00/Q18nAr19Hnc/s320/under_accessor.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5469129104442978450" style="cursor: pointer; width: 320px; height: 70px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_94EzacITAcY/S-Y_7wRIlnI/AAAAAAAAA0s/lvvoGZYgMGo/s1600/highlight_1.png"&gt;&lt;img src="http://4.bp.blogspot.com/_94EzacITAcY/S-Y_7wRIlnI/AAAAAAAAA0s/lvvoGZYgMGo/s320/highlight_1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5469129093289645682" style="cursor: pointer; width: 320px; height: 135px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_94EzacITAcY/S-Y_7wRIlnI/AAAAAAAAA0s/lvvoGZYgMGo/s1600/highlight_1.png"&gt;&lt;/a&gt;Note how this accessor is independent of the order of the rows and the columns.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;And then the testers lived happily ever after ...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notes: &lt;/div&gt;&lt;div&gt;This grid is not a simple table but actually composed of 2 tables, one for the header and one for the contents. So we could have approaced this problem using _cell(_table(2), "Style Guide for ZK 3.5 released", 4), but again the 4 would trip us later if the order/number of columns changes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;_under(el) can be passed as a last parameter to any Sahi API.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;NOTE: _under will be available in Sahi's next release&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/5011959530026208831/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=5011959530026208831" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5011959530026208831" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5011959530026208831" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/05/sahi-api-under-added.html" title="Sahi API _under added" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_94EzacITAcY/S-Y_iCulanI/AAAAAAAAA0M/LInk-af25fQ/s72-c/data_grid.png" height="72" width="72" /><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-191773726055093364</id><published>2010-05-03T21:29:00.000-07:00</published><updated>2010-05-04T01:00:30.298-07:00</updated><title type="text">Choosing the right web automation tool or web testing tool</title><content type="html">Web automation is a little trickier than most other automation because there are many combinations of browsers and operating systems and they are fast evolving too.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What do you look for before you choose a tool for web automation?&lt;/h3&gt;&lt;br /&gt;The answer may actually depend on what your organization specializes in. If you are a product company which ships applications meant only for Internet Explorer, you need not consider multi-browser support or Linux support. But if you develop outward facing web applications, you may need to test the application on multiple browsers.&lt;br /&gt;&lt;br /&gt;Here are some factors you should consider before choosing a testing tool.&lt;br /&gt;&lt;br /&gt;The tool:&lt;ol&gt;&lt;br /&gt; &lt;li&gt;Should be techincally sound&lt;br /&gt; &lt;ol&gt;&lt;br /&gt; &lt;li&gt;Should be able to identify elements/record on all browsers.&lt;/li&gt; &lt;li&gt;Should handle complexities like HTTPS, Frames, IFrames, AJAX, dynamic ids. &lt;/li&gt; &lt;li&gt;Should not need tinkering with source code of tool&lt;/li&gt; &lt;li&gt;Should not require hard coded waits&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt; &lt;/li&gt; &lt;br /&gt; &lt;li&gt;Should save time and effort for teams&lt;br /&gt; &lt;ol&gt;&lt;br /&gt; &lt;li&gt;Ramp up time should be minimal. Users should get productive within an hour.&lt;/li&gt; &lt;li&gt;Complexities like AJAX, dynamic ids, object identification etc. should be handled by the tool instead of passing it on to testers.  *&lt;/li&gt; &lt;li&gt;Should run reliably across browsers and operating systems to reduce re-runs and debugging effort.&lt;/li&gt; &lt;li&gt;Should not be dependent on knowledge of various other tools/technologies. &lt;/li&gt; &lt;li&gt;Should need minimal maintenance of scripts/code&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt; &lt;/li&gt; &lt;br /&gt; &lt;li&gt;Should work with existing teams instead of requiring a drastic overhaul&lt;br /&gt; &lt;ol&gt;&lt;br /&gt; &lt;li&gt;Should not require your teams to change from testers to developer testers, but let them easily pick up some scripting knowledge and get functional. &lt;/li&gt; &lt;li&gt;Should not require expertise in various peripheral technologies like Java, Junit, TestNG, XPath, Firebug, Browser DOM etc. to just  get started. &lt;/li&gt; &lt;/ol&gt;&lt;br /&gt; &lt;/li&gt; &lt;br /&gt; &lt;li&gt;Should require minimal stakeholders&lt;br /&gt; &lt;ol&gt;&lt;br /&gt; &lt;li&gt;Should not need developer involvement for modification to application in the name of “testability”.  Dynamic ids, elements without ids, etc. should be handled well by the tool. *&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt; &lt;/li&gt; &lt;br /&gt; &lt;li&gt;Should be easy to scale testing teams &lt;br /&gt; &lt;ol&gt;&lt;br /&gt; &lt;li&gt;Should be easy to hire and add more members to your testing team. This requires the tool to be simple to use.&lt;/li&gt; &lt;li&gt;Should be able to move the teams across projects and products. This means that the tool needs to be sound enough to work with various technologies and frameworks.&lt;/li&gt; &lt;/ol&gt;&lt;br /&gt; &lt;/li&gt; &lt;br /&gt; &lt;li&gt;Should have authoritative support available&lt;/li&gt; &lt;br /&gt; &lt;li&gt;Should be cost effective. The following need to be considered:&lt;br /&gt; &lt;ol&gt;&lt;br /&gt; &lt;li&gt;Cost of acquiring the tool&lt;/li&gt; &lt;li&gt;Cost of employing capable testers who can use the tool&lt;/li&gt; &lt;li&gt;Cost of maintaining test infrastructure&lt;/li&gt; &lt;li&gt;Cost of authoritative support&lt;br /&gt; &lt;/ol&gt;&lt;br /&gt; &lt;br /&gt; Too often, especially with open source tools, the amount of money wasted in man hours due to limitations of the tool, incompatibility with existing expertise of team, lack of support etc. far outweighs the cost of acquiring alternative commercial tools. (Developers and testers with not much business experience invariably think that their time is not a cost to their company, and do not mind spending a week on an effort which should have lasted a day, thus wasting 25% of a month’s salary for a tool which may cost 10%)&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;* It is possible to just use the Sahi Controller and identify various elements reliably. Because tools like Selenium cannot record across frames, iframes, the tester is forced to learn to use Firebug to figure out what ID or XPath to use, add a line of selectFrame  etc. These are very tool specific. While learning to use Firebug is an awesome skill to have, it should not be required at each step of the automation process. Adding conditional waits with knowledge of DOM is an unnecessary effort put on the tester, which can be handled by intelligent tools. Same goes for making developers add custom id generators for handling dynamic ids.</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/191773726055093364/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=191773726055093364" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/191773726055093364" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/191773726055093364" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/05/choosing-right-web-automation-tool-or.html" title="Choosing the right web automation tool or web testing tool" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3722945078208892603</id><published>2010-04-24T20:58:00.000-07:00</published><updated>2010-05-03T21:25:32.581-07:00</updated><title type="text">Sahi vs. Selenium</title><content type="html">&lt;div &gt;&lt;h2&gt;&lt;span  style="font-weight: normal; font-size:medium;"&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span&gt;&lt;span&gt;&lt;span &gt;&lt;span  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span&gt;Though Sahi is aimed at non-programmer testers and Selenium at programmers, we get a lot of queries on their differences. Here is a brief document which compares Selenium and Sahi.&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;To those who read this:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;ol&gt;&lt;li&gt;If you are a Selenium fan, be open minded and verify the claims for yourself or contact us for clarification. And again, please be open minded. You may save a lot of time for yourself and your team.&lt;/li&gt;&lt;li&gt;This document is biased towards Sahi because we built Sahi. We believe what we state is true, but if you have evidence to prove otherwise, please do contact us at support@sahi.co.in.&lt;/li&gt;&lt;li&gt;When we say "Not sure" or "?" it means we do not have enough information because of lack of research on our part. Please verify for yourself. &lt;/li&gt;&lt;li&gt;If you want a comparison between other tools and Sahi, we would be happy to discuss it. &lt;/li&gt;&lt;li&gt;If you are another tool developer/supporter, please let us know how it compares and let the world benefit from alternatives.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div &gt;&lt;h2&gt;&lt;span &gt;&lt;span style="font-weight: normal;  "&gt;&lt;/span&gt;Sahi vs. Selenium: Comparison document&lt;/span&gt;&lt;/h2&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Recorder&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;/td&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Works only on Firefox&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Works on all browsers (IE, FF, Chrome, Safari, Opera)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Has trouble recording IFrames, Frames and popup windows&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Can record on IFrames, Frames and popup windows&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;For Frames and IFrames, need to explicitly selectFrame&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Implicit smart identification of elements even across Frames and IFrames&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Uses XPath for identification of elements if id or name not present&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Uses various algorithms to uniquely identify elements in a simple human recognizable way&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Programming Language support&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;/td&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Java, Ruby, Perl, Python, C# (and may be more).&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Sahi Script, Java, Ruby Sahi Script has the syntax of javascript but can interoperate with any Java code directly from script. The Java/Ruby drivers are available since Sahi V3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Needs language bridges for each new feature. For example, needs java bridge to invoke Flash via ExternalAPI.&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Sahi Script can directly invoke anything exposed by javascript.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Ease of use&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;/td&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Easy to start with because of Selenium IDE which is a firefox plugin. Estimated start time less than 5 minutes&lt;/td&gt;&lt;td width="50%" valign="top"&gt;More difficult than Selenium to start because it needs installation of Sahi. Estimated start time 10-30 minutes, depending on Java installation etc.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Deep learning curve when the need is felt to move from Selenium IDE to Selenium RC.&lt;/td&gt;&lt;td width="50%" valign="top"&gt;There is only one mode of operation for Sahi. Extremely simple to learn and use for testers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Knowledge of programming language required&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Can achieve most automation with just functions and variables. Sahi has inbuilt APIs for most other complex tasks like data driven testing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Needs JUnit style of programming&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Can choose your own style&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Uses XPath based identification for elements in complex html structures or those with dynamic ids. css selectors and javascript may also be used.&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Has nearness APIs like _in and _near which can help show nearness of elements. Eg. _image(“delete.gif”, _near(“username 4”))&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Needs waits for making AJAX work&lt;/td&gt;&lt;td width="50%" valign="top"&gt;No waits needed in 90% cases&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Supports parallel execution&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Inbuilt parallel execution. Needs only one parameter change&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;div&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;&lt;span style="color: rgb(0, 0, 0); "&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Stability of scripts and ease of maintenance&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;&lt;/td&gt;&lt;td width="35%" valign="top"&gt;&lt;b&gt;&lt;span  &gt;&lt;span &gt;Selenium&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;&lt;b&gt;&lt;span  &gt;&lt;span &gt;Sahi&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;Smart DOM Relations resilient to UI changes&lt;/td&gt;&lt;td width="35%" valign="top"&gt;No&lt;br /&gt;Dependent on XPath&lt;br /&gt;Difficult for testers to understand and debug&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;br /&gt;Does not use XPaths.&lt;br /&gt;Uses _near and _in&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Implicit waits for page load and AJAX:&lt;br /&gt;1) Saves time&lt;br /&gt;2) Keeps scripts simple&lt;br /&gt;3) Reduces random failures&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="35%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;No&lt;br /&gt;Explicit waits needed.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Ease of adoption by a team of testers&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="35%" valign="top"&gt;Needs testers to know TestNG/Junit, XPaths, HTML structures, Frames IFrame knowledge, Javascript for AJAX conditional waits &lt;/td&gt;&lt;td width="33%" valign="top"&gt;Sahi abstracts out all these for the tester.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Dependency on other tools&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Selenium – Java (Others need something similar)&lt;/b&gt;&lt;/td&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Needs JUnit (and optionally eclipse) to run tests&lt;/td&gt;&lt;td width="50%" valign="top"&gt;No additional tools required. Tests run from the Sahi Controller/command line/ant&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Non persistent reporting. Needs TestNG or something similar for that&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Persistent HTML reporting which can be shared via URL or file&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Stability of product and number of releases&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;/td&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Started 2004(?) in ThoughtWorks&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Started 2005 in ThoughtWorks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Version 1 took 5 years, Version 2 planned mid-2010. Moving away from original architecture to WebDriver based architecture&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Current release: Version 3 Number of stable releases in 2009: 7&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Footprint&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;/td&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;RC: 10.5 MB, Grid 15 MB&lt;/td&gt;&lt;td width="50%" valign="top"&gt;less than 2 .5 MB with source&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Not sure&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Runtime ~ 50MB for 3 parallel threads&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Reporting&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;/td&gt;&lt;td width="50%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%" valign="top"&gt;Needs external tools to create readable reports&lt;/td&gt;&lt;td width="50%" valign="top"&gt;Inbuilt HTML reports with click through to relevant portion of script&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Others&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;&lt;b&gt;Sahi&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;Build tool integration (ant, batch files)&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;Multiple OS support&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;Version Controllable Scripts/Code&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;HTTPS support/redirects&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Not sure&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;401 Authentication, Windows/NTLM Authentication dialogs&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Not sure&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;External proxy tunneling&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;In built APIs for data driven testing&lt;/td&gt;&lt;td width="33%" valign="top"&gt;No&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;Works only with browsers&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;Needs privileged modes on browsers for operation. (Privileged is bad)&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes&lt;/td&gt;&lt;td width="33%" valign="top"&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;Extensible on future browsers&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Depends on finding a way to use privileged mode on that browser&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Yes. Very little dependency on type of browser.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%" valign="top"&gt;Editor support&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Has good editors in various languages&lt;/td&gt;&lt;td width="33%" valign="top"&gt;Editor support for javascript is not as good as for Java.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span  style="color:#FF6600;"&gt;&lt;span &gt;Support available&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;&lt;/td&gt;&lt;td width="35%" valign="top"&gt;&lt;b&gt;&lt;span  &gt;&lt;span &gt;Selenium&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;&lt;b&gt;&lt;span  &gt;&lt;span &gt;Sahi&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Free support via Forums&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="35%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Yes&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Yes&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Paid support available&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="35%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Yes&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Yes&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="31%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Authoritative training available&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="35%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;?&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td width="33%" valign="top"&gt;&lt;span  &gt;&lt;span &gt;Yes&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3722945078208892603/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=3722945078208892603" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3722945078208892603" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3722945078208892603" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/04/sahi-vs-selenium.html" title="Sahi vs. Selenium" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-4245805802775463986</id><published>2010-04-20T07:40:00.000-07:00</published><updated>2010-04-20T08:25:31.816-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="XP Goa day" /><category scheme="http://www.blogger.com/atom/ns#" term="Function testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Presentation at XP Goa day</title><content type="html">Narayan Raman presented on Functional Testing of Web Applications using Sahi at the XP Goa Day in Goa University.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_3789830"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/narayanraman/goa-xp-day" title="Goa XP day "&gt;Goa XP day &lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=xpgoa-100420094650-phpapp01&amp;stripped_title=goa-xp-day" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=xpgoa-100420094650-phpapp01&amp;stripped_title=goa-xp-day" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/narayanraman"&gt;narayanraman&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As part of a presentation , we did a small demo on record and playback of a script using Sahi, then refactored the code to be maintainable.&lt;br /&gt;&lt;br /&gt;The site under test is available here: &lt;a href="http://sahi.co.in/demo/training"&gt;http://sahi.co.in/demo/training&lt;/a&gt;&lt;br /&gt;The first cut from the recorder came out to be this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;_setValue(_textbox("user"), "test");&lt;br /&gt;_setValue(_password("password"), "secret");&lt;br /&gt;_click(_submit("Login"));&lt;br /&gt;_setValue(_textbox("q"), "2");&lt;br /&gt;_setValue(_textbox("q[1]"), "1");&lt;br /&gt;_setValue(_textbox("q[2]"), "1");&lt;br /&gt;_click(_button("Add"));&lt;br /&gt;_assertExists(_textbox("total"));&lt;br /&gt;_assert(_isVisible(_textbox("total")));&lt;br /&gt;_assertEqual("1150", _textbox("total").value);&lt;br /&gt;_click(_button("Logout"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This was then refactored into 2 scripts, one containing functions and the other  invoking it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// goa3_included.sah&lt;br /&gt;function login($username, $password){&lt;br /&gt; _setValue(_textbox("user"), $username);&lt;br /&gt; _setValue(_password("password"), $password);&lt;br /&gt; _click(_submit("Login"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function addBooks($numJava, $numRuby, $numPython){&lt;br /&gt; _setValue(_textbox("q"), $numJava);&lt;br /&gt; _setValue(_textbox("q[1]"), $numRuby);&lt;br /&gt; _setValue(_textbox("q[2]"), $numPython);&lt;br /&gt; _click(_button("Add"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function verifyTotal($total){&lt;br /&gt; _assertEqual($total, _textbox("total").value); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function logout(){&lt;br /&gt; _click(_button("Logout"));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// goa3.sah&lt;br /&gt;_include("goa3_included.sah");&lt;br /&gt;&lt;br /&gt;login("test", "secret");&lt;br /&gt;addBooks(2, 1, 1);&lt;br /&gt;verifyTotal(1150);&lt;br /&gt;logout();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The next step was to modify &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function addBooks($numJava, $numRuby, $numPython){&lt;br /&gt; _setValue(_textbox("q"), $numJava);&lt;br /&gt; _setValue(_textbox("q[1]"), $numRuby);&lt;br /&gt; _setValue(_textbox("q[2]"), $numPython);&lt;br /&gt; _click(_button("Add"));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;such that identifiers "q", "q[1]" and "q[2]" become more meaningful and are independent of their order. Using the _near API, the function becomes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function addBooks($numJava, $numRuby, $numPython){&lt;br /&gt; _setValue(_textbox("q", _near(_cell("Core Java"))), $numJava);&lt;br /&gt; _setValue(_textbox("q", _near(_cell("Ruby for Rails"))), $numRuby);&lt;br /&gt; _setValue(_textbox("q", _near(_cell("Python Cookbook"))), $numPython);&lt;br /&gt; _click(_button("Add"));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We then data drive the whole test by wrapping the various steps into a single function "addAndVerify", build a 2 dimensional array of values and then invoke "addAndVerify" for each row of values using _dataDrive&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// club the functionality into a single function&lt;br /&gt;function addAndVerify($numJava, $numRuby, $numPython, $total){&lt;br /&gt; login("test", "secret");&lt;br /&gt; addBooks($numJava, $numRuby, $numPython);&lt;br /&gt; verifyTotal($total);&lt;br /&gt; logout();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// build a 2D array&lt;br /&gt;var $data = [&lt;br /&gt;[2, 1, 1, 1150],&lt;br /&gt;[3, 2, 1, 1650],&lt;br /&gt;[1, 1, 1, 850]&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;// automatically invoke addAndVerify for each row in $data. &lt;br /&gt;_dataDrive(addAndVerify, $data);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We concluded the talk with an enthusiastic Q &amp; A session.&lt;br /&gt;Thank you Goa University for being a great host!</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/4245805802775463986/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=4245805802775463986" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/4245805802775463986" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/4245805802775463986" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/04/presentation-at-xp-goa-day.html" title="Presentation at XP Goa day" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-8929592781137859010</id><published>2010-03-02T19:06:00.000-08:00</published><updated>2010-03-02T19:07:38.134-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Twist 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Twist" /><category scheme="http://www.blogger.com/atom/ns#" term="ThoughtWorks Studios" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">ThoughtWorks Studios' Twist 2.0 with Sahi</title><content type="html">ThoughtWorks announces Twist 2.0 availability from 31st March 2010: &lt;br /&gt;&lt;a href="http://www.prnewswire.com/news-releases/thoughtworks-studios-new-twist-20-provides-collaborative-agile-test-management-85809582.html"&gt;http://www.prnewswire.com/news-releases/thoughtworks-studios-new-twist-20-provides-collaborative-agile-test-management-85809582.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tyto Software has been collaborating with ThoughtWorks Studios to integrate Sahi with Twist and results will be visible in Twist 2.0.&lt;br /&gt;&lt;br /&gt;"Twist 2.0 has added Sahi as an additional option for web testing. The main benefit of Sahi is that it abstracts out most difficulties that testers face while automating web applications. Its features include an excellent recorder, platform and browser independence, no XPaths, no waits and multi-threaded playback. In addition, it allows you to identify UI components within the application as you record test scenarios." &lt;a href="http://community.thoughtworks.com/posts/a0f1346f57"&gt;Announcing Twist 2.0: Available for download on March 31&lt;/a&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/8929592781137859010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=8929592781137859010" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8929592781137859010" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8929592781137859010" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/03/thoughtworks-studios-twist-20-with-sahi.html" title="ThoughtWorks Studios' Twist 2.0 with Sahi" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-7585449897812135446</id><published>2010-02-24T05:26:00.000-08:00</published><updated>2010-02-24T05:30:31.131-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="ZKOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="ZK" /><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Sahi automating ZK 3.6 Sample Application - Demo video</title><content type="html">Here is a brief video which shows how Sahi can be used to automate ZK based applications. Notice how Sahi uses neither XPaths nor explicit waits, and works with the same script on both Firefox and IE.&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EYJjXO4ax94&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/EYJjXO4ax94&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/7585449897812135446/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=7585449897812135446" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/7585449897812135446" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/7585449897812135446" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/02/sahi-automating-zk-36-sample.html" title="Sahi automating ZK 3.6 Sample Application - Demo video" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-5289175020200422090</id><published>2010-02-14T09:21:00.000-08:00</published><updated>2010-02-14T09:37:31.900-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ZKOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="ZK" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">ZK testing with Sahi</title><content type="html">Joseph Neuhaus has written a detailed article on testing ZK applications with Sahi. The article explains how to run Sahi tests headless on a linux machine. &lt;br /&gt;&lt;br /&gt;Excerpts from the well written, thorough article:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If you have attempted to create browser-based functional tests with Selenium, or load tests using Grinder, then you will marvel at the simplicity of Sahi.&lt;br /&gt;&lt;br /&gt;The Problem&lt;br /&gt;Testing ZK Web Applications can be a challenge with Selenium and Grinder because ZK dynamically generates element IDs, and these testing frameworks identify elements within the rendered Web Page using these IDs. Therefore, once a session has been recorded, it cannot be replayed because the element IDs will change the next time the Web Application is launched. To address this, ZK provides a hook so you can generate your own IDs. This is a great feature to be sure; however, now you're not testing the application that will be promoted into production. Also, keeping track of "special" test builds of your application increases work and complexity. To make matters worse, some testing frameworks, such as Selenium, require you to install browser plugins to create the recorded browser sessions used for playback. When browser updates occur, you can't upgrade until the plugins are updated too. More moving parts means more issues maintaining the Test Environment. There must be a better way, and there is. It's called Sahi.&lt;br /&gt;&lt;br /&gt;The Solution&lt;br /&gt;Sahi can record and playback sessions directly on your production ZK Web Application without having to use a custom ID generator. It requires no browser plugins to create recorded sessions to be used for playback. Sahi is pure Java, so it integrates nicely with ANT. The Sahi scripting language is simple and elegant, so there's no need to break out the XPATH documentation to get your tests running. You can even run your Sahi tests headless using Firefox in an X-Window virtual frame buffer on Linux. In headless mode you can run real browser-based tests on your continuous integration machines without having to be logged in. If you're testing on windows, you can run your tests on IE, Firefox, Chrome, Safari, and Opera. Despite some idiosyncrasies Sahi seems magical at times, but more importantly it makes testing productive - so productive it's almost fun!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The full article is available here: &lt;a href="http://docs.zkoss.org/wiki/Making_ZK_Functional_Tests_With_Sahi"&gt;http://docs.zkoss.org/wiki/Making_ZK_Functional_Tests_With_Sahi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Joe Neuhaus has over twenty years of experience in software development, systems design, and technical management roles.</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/5289175020200422090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=5289175020200422090" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5289175020200422090" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5289175020200422090" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/02/zk-testing-with-sahi.html" title="ZK testing with Sahi" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3018029197394085848</id><published>2010-02-10T20:26:00.000-08:00</published><updated>2010-02-10T22:26:11.626-08:00</updated><title type="text">Narayan Raman wins Safari Books Online's Coder Challenge for Sahi</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_94EzacITAcY/S3OLiIRdWUI/AAAAAAAAAyE/o7jjCe_mX54/s1600-h/AwardBadge.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 245px; height: 122px;" src="http://3.bp.blogspot.com/_94EzacITAcY/S3OLiIRdWUI/AAAAAAAAAyE/o7jjCe_mX54/s400/AwardBadge.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5436842593618843970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Narayan Raman from &lt;a href="http://sahi.co.in/"&gt;Tyto Software&lt;/a&gt; won Safari Books Online's Coder Challenge for his contribution to &lt;a href="http://sahi.co.in/"&gt;Sahi&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What followed was a day of good fun, interactions with the other winners, wine tasting at Kendell Jackson and Korbel wineries, a pleasant dinner and lots of discussions with Tim O'Reilly, O'Reilly Media, Paige Mazzoni, VP marketing, Safari Books Online, and CJ Rayhill, senior VP, product management and technology, Safari Books Online.&lt;br /&gt;&lt;br /&gt;Narayan Raman and the other winners also won a three month subscription to Safari Books Online.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_94EzacITAcY/S3ONqbuXeCI/AAAAAAAAAys/Yk4Z6iqvCmU/s1600-h/USTrip+030.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_94EzacITAcY/S3ONqbuXeCI/AAAAAAAAAys/Yk4Z6iqvCmU/s320/USTrip+030.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5436844935302576162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Narayan Raman, Ashley Aberneithy, Tim O'Reilly, Aral Balkan and Arturo Fernandez-Sanchez&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_94EzacITAcY/S3ONZoMR7ZI/AAAAAAAAAyk/Iv4pwTHxguA/s1600-h/USTrip+028.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_94EzacITAcY/S3ONZoMR7ZI/AAAAAAAAAyk/Iv4pwTHxguA/s320/USTrip+028.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5436844646591491474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CJ Rayhill, Narayan Raman, Ashley Aberneithy, Tim O'Reilly, Aral Balkan, Arturo Fernandez-Sanchez and Paige Mazzoni&lt;br /&gt;&lt;br /&gt;Press release: &lt;a href="http://www.businesswire.com/portal/site/home/permalink/?ndmViewId=news_view&amp;newsId=20100202005735&amp;newsLang=en"&gt;http://www.businesswire.com/portal/site/home/permalink/?ndmViewId=news_view&amp;newsId=20100202005735&amp;newsLang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thank you Safari Books Online for the award and the excellent hospitality.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/groups/safaribooksonlinechallenge/" target="_blank"&gt;More pictures on Flickr&lt;/a&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3018029197394085848/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=3018029197394085848" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3018029197394085848" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3018029197394085848" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/02/narayan-raman-wins-safari-books-onlines.html" title="Narayan Raman wins Safari Books Online's Coder Challenge for Sahi" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_94EzacITAcY/S3OLiIRdWUI/AAAAAAAAAyE/o7jjCe_mX54/s72-c/AwardBadge.jpg" height="72" width="72" /><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-5425314315400675679</id><published>2010-01-07T00:00:00.000-08:00</published><updated>2010-01-07T00:18:28.136-08:00</updated><title type="text">Sahi in "Nagios - The Practice Book: Open Source Monitoring in the Enterprise"</title><content type="html">There is a fairly detailed section on monitoring web applications using Nagios and Sahi in Gerhard Lausser's new book (in German): "Nagios - The Practice Book: Open Source Monitoring in the Enterprise"&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; line-height: 15px; "&gt;, ISBN: 978-3-8273-2800-7&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.de/Nagios-Praxisbuch-Open-Source-Monitoring-Unternehmen/dp/3827328004"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51t4ifl1X2L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU03_.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.amazon.de/Nagios-Praxisbuch-Open-Source-Monitoring-Unternehmen/dp/3827328004"&gt;http://www.amazon.de/Nagios-Praxisbuch-Open-Source-Monitoring-Unternehmen/dp/3827328004&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/5425314315400675679/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=5425314315400675679" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5425314315400675679" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5425314315400675679" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/01/sahi-in-nagios-practice-book-open.html" title="Sahi in &quot;Nagios - The Practice Book: Open Source Monitoring in the Enterprise&quot;" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3870030724495929032</id><published>2010-01-05T09:17:00.000-08:00</published><updated>2010-01-06T05:01:07.836-08:00</updated><title type="text">Web automation does not need XPaths</title><content type="html">Really.&lt;br /&gt;&lt;br /&gt;Learn this web automation nursery rhyme today!&lt;br /&gt;&lt;br /&gt;XPaths are evil,&lt;br /&gt;XPaths are fickle,&lt;br /&gt;Developers touch code,&lt;br /&gt;And the testers are in a pickle!&lt;br /&gt;&lt;br /&gt;Have you ever used XPaths and found that it needs non-trivial amount of effort in maintenance?&lt;br /&gt;&lt;br /&gt;Especially testers, who do not have the time or energy to get XPaths right, stay away from XPaths. Use ids or names or any other attribute the web element provides.&lt;br /&gt;&lt;br /&gt;Sahi, since it is aimed at testers rather than developers, does not encourage use of XPath, which means that you can use it if you want, but the controller will never show you XPaths.&lt;br /&gt;&lt;br /&gt;So how does Sahi handle something like this?&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;My name&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=32259128&amp;amp;postID=3870030724495929032#" onclick="return false"&gt;Edit&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Your name&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=32259128&amp;amp;postID=3870030724495929032#" onclick="return false"&gt;Edit&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;His name&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=32259128&amp;amp;postID=3870030724495929032#" onclick="return false"&gt;Edit&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Simple, Sahi uses the _in and _near APIs.&lt;br /&gt;&lt;br /&gt;So to access the edit link of Your name, use&lt;br /&gt;&lt;br /&gt;_link("Edit", _near(_cell("Your name")))&lt;br /&gt;&lt;br /&gt;Like wise&lt;br /&gt;&lt;br /&gt;_link("Edit", _near(_cell("My name")))&lt;br /&gt;_link("Edit", _near(_cell("His name")))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Visit us again or subscribe to this blog for more tips on web automation ...</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3870030724495929032/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=3870030724495929032" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3870030724495929032" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3870030724495929032" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2010/01/web-automation-does-not-need-xpaths.html" title="Web automation does not need XPaths" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3158682480246397466</id><published>2009-07-17T03:43:00.000-07:00</published><updated>2009-07-17T04:10:36.679-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi Nightly Release 2009-07-15</title><content type="html">A new nightly build is available at &lt;a href="https://sourceforge.net/projects/sahi/files/"&gt;https://sourceforge.net/projects/sahi/files/&lt;/a&gt; &lt;br /&gt;This fixes a file upload issue and adds support for 401 Authentication and HTTPS Client Certificates.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Features added&lt;br /&gt; Support for 401 authentication. A dialog box is shown on the browser for authentication.&lt;br /&gt; Support for HTTPS client certificates. Look at ssl.client.* settings in sahi.properties&lt;br /&gt; _hidden(identifier) added &lt;br /&gt; _byClassName(className, tagName [, domRelation]) added &lt;br /&gt;&lt;br /&gt;* Bugfixes&lt;br /&gt; checkbox onchange triggered for IE.&lt;br /&gt; Content-Length removed from parts of MultiPartRequest</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3158682480246397466/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=3158682480246397466" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3158682480246397466" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3158682480246397466" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/07/sahi-nightly-release-2009-07-15.html" title="Sahi Nightly Release 2009-07-15" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-4897664065725607557</id><published>2009-06-26T02:22:00.000-07:00</published><updated>2009-06-26T02:52:46.405-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="features" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="XML" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Parsing XML in Sahi scripts</title><content type="html">&lt;div&gt;Sahi uses Rhino as its javascript engine and Rhino has excellent support for handling XML. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below is a script which reads and asserts XML nodes and attributes. The example has been picked from &lt;a href="http://www.ibm.com/developerworks/webservices/library/ws-ajax1/"&gt;http://www.ibm.com/developerworks/webservices/library/ws-ajax1/&lt;/a&gt; so that it is easy to experiment with the ibm examples in this script.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush:sahi"&gt;&lt;br /&gt;var xmlStr = '' +&lt;br /&gt;'&amp;lt;people&amp;gt;' +&lt;br /&gt;'   &amp;lt;person gender="male"&amp;gt;' +&lt;br /&gt;'      &amp;lt;name&amp;gt;Ant&amp;lt;/name&amp;gt;' +&lt;br /&gt;'      &amp;lt;hair&amp;gt;Shaggy&amp;lt;/hair&amp;gt;' +&lt;br /&gt;'      &amp;lt;eyes&amp;gt;Blue&amp;lt;/eyes&amp;gt;' +&lt;br /&gt;'      &amp;lt;height measure="metric"&amp;gt;176&amp;lt;/height&amp;gt;' +&lt;br /&gt;'   &amp;lt;/person&amp;gt;' +&lt;br /&gt;'   &amp;lt;person gender="male"&amp;gt;' +&lt;br /&gt;'      &amp;lt;name&amp;gt;Paul&amp;lt;/name&amp;gt;' +&lt;br /&gt;'      &amp;lt;hair&amp;gt;Spiky&amp;lt;/hair&amp;gt;' +&lt;br /&gt;'      &amp;lt;eyes&amp;gt;Grey&amp;lt;/eyes&amp;gt;' +&lt;br /&gt;'      &amp;lt;height measure="metric"&amp;gt;178&amp;lt;/height&amp;gt;' +&lt;br /&gt;'   &amp;lt;/person&amp;gt;' +&lt;br /&gt;'&amp;lt;/people&amp;gt;';&lt;br /&gt;&lt;br /&gt;var $x = new XML(xmlStr);&lt;br /&gt;_assertEqual("Ant", $x.person[0].name.toString());&lt;br /&gt;_assertEqual("Grey", $x.person[1].eyes.toString());&lt;br /&gt;&lt;br /&gt;for each (var $p in $x.person){&lt;br /&gt;    var $measure = $p.height.@measure.toString();&lt;br /&gt;    _assert($measure == "metric");&lt;br /&gt;    _assert($p.height &amp;gt; 170);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;Two points to note:&lt;/div&gt;&lt;div&gt;1) All nodes that you access are of type xml. You will need to use toString() on them before you assert them.&lt;/div&gt;&lt;div&gt;2) Using @ from inside a Browser Action Function (like _click, _assert etc.) causes the script to fail because of a parsing error in Sahi's code. So first assign it to a variable and then use it, like it has been used for $measure. This bug will be fixed in the coming release.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a lot more that can be done with the XML object. Have a look at these links:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.ibm.com/developerworks/webservices/library/ws-ajax1/"&gt;http://www.ibm.com/developerworks/webservices/library/ws-ajax1/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.xml.com/pub/a/2007/11/28/introducing-e4x.html"&gt;http://www.xml.com/pub/a/2007/11/28/introducing-e4x.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/4897664065725607557/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=4897664065725607557" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/4897664065725607557" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/4897664065725607557" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/06/parsing-xml-in-sahi-scripts.html" title="Parsing XML in Sahi scripts" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3179266273632690425</id><published>2009-06-23T13:14:00.000-07:00</published><updated>2009-06-24T10:59:19.598-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Configuring Eclipse for Sahi</title><content type="html">&lt;div&gt;Eclipse's JSDT plugin provides syntax highlighting and verification for Javascript. It can be configured to work well with Sahi scripts too. This video goes through the different steps to configure Eclipse to work with Sahi scripts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/VO4dTyQ3-2U&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/VO4dTyQ3-2U&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JSDT looks at all functions in the given source folder and can list them in content-assist. Taking advantage of this, we use a dummy definitions file called apis.sah which has all the Sahi APIs. &lt;b&gt;This file, apis.sah, can be downloaded from &lt;/b&gt;&lt;a href="http://sahi.co.in/static/apis.sah"&gt;&lt;b&gt;here&lt;/b&gt;&lt;/a&gt;&lt;b&gt;  and needs to copied into the "scripts" folder. &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JSDT is a part of the Web Platforms Toolkit.&lt;/div&gt;&lt;div&gt;It can be installed as a plugin or can be downloaded as a single bundle in the "Eclipse IDE for Java EE Developers (163 MB)" (For windows: eclipse-jee-ganymede-SR2-win32.zip). This is downloadable from http://www.eclipse.org/downloads/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3179266273632690425/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=3179266273632690425" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3179266273632690425" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3179266273632690425" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/06/configuring-eclipse-for-sahi.html" title="Configuring Eclipse for Sahi" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3139379062578247260</id><published>2009-06-04T21:59:00.000-07:00</published><updated>2009-06-04T22:53:14.985-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="marketing" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Increasing interaction with Sahi users</title><content type="html">&lt;a href="http://sahi.co.in/"&gt;Sahi&lt;/a&gt; has been around for about 4 years now. It started in 2005 and was released before or just around the time Selenium RC's first cut was released. But there has been a huge gap in the visibility of Sahi and Selenium. While Selenium seems to be everywhere, Sahi is hardly heard of. After a lot of conversations with different people, this is what we learnt.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Sahi is aimed at testers and not developers. Its focus on strong record and playback and on simple scripting, is primarily meant for testers in the Indian industry. These are people who are good at manual testing and automation with tools like QTP, but are not from a programming background. Selenium and Watir on the other hand are aimed at testers and developers who are fine with programming. Unfortunately for Sahi, testers in India who use Sahi, do not blog or voice their opinions on the internet, or contribute back in forums. (Most of those who do, are good technical testers.)  That meant that there was no viral aspect to the spread of Sahi.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) Very little emphasis was made on Sahi's website or in the program to collect user data. No testimonials, no newsletters, which meant that people were not informed of developments and good user stories to boost their confidence. While the program continued to evolve with releases every two months, few people really saw the progress. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) Being aimed at testers and using javascript for scripting, and because of our own lack of savvy in marketing to the internet, Sahi could never become sexy to the blogging bunch. Who would notice when there was Selenium and Ruby to talk about, which could get you more hits and popularity?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While the first and third problem cannot be solved easily, the second is quite addressable. A new section for &lt;a href="http://sahi.co.in/forums/"&gt;testimonials and user stories&lt;/a&gt; has been added to Sahi Forums. This blog you are reading is being updated with new developments. Updates and news of Sahi can be followed via twitter at &lt;a href="http://twitter.com/_sahi/"&gt;_sahi&lt;/a&gt;. Presentations on Sahi will be available &lt;a href="http://www.slideshare.net/sahi.co.in"&gt;here&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are a Sahi user, tweet with #sahi so others may know. If you have a user story do post on the forums.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3139379062578247260/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=3139379062578247260" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3139379062578247260" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3139379062578247260" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/06/increasing-interaction-with-sahi-users.html" title="Increasing interaction with Sahi users" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-7379346828937333718</id><published>2009-06-03T04:46:00.000-07:00</published><updated>2009-06-03T05:00:31.564-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="troubleshooting" /><category scheme="http://www.blogger.com/atom/ns#" term="technical" /><title type="text">HTTPS Problem Resolution: Unable to tunnel through proxy</title><content type="html">&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Sahi had been using its own custom implementation of proxy tunnelling till a few months back. Owing to a lot of demand for some features, we moved to Java's httpsurlconnection which supported tunnelling through a corporate proxy with authentication. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But unfortunately a bug in Java's httpsurlconnection was tripping up a few users on some https sites. One case was the failure of websites using login via SiteMinder. &lt;/div&gt;&lt;div&gt;The exception thrown was  &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After some research we figured that it was due to this &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6687282"&gt;bug 6687282&lt;/a&gt; &lt;/div&gt;&lt;div&gt;Switching to the latest java 1.6.0_14 fixed this issue for us.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/7379346828937333718/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=7379346828937333718" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/7379346828937333718" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/7379346828937333718" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/06/https-problem-resolution-unable-to.html" title="HTTPS Problem Resolution: Unable to tunnel through proxy" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-5171122865449281146</id><published>2009-05-21T08:41:00.000-07:00</published><updated>2009-05-21T08:44:38.193-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi V2 Release 2009-05-21 is now available!</title><content type="html">&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 13px; line-height: 18px; "&gt;Sahi V2 2009-05-21 is a stable build. &lt;br /&gt;Please use and give feedback to make next release more stable. &lt;a href="https://sourceforge.net/project/platformdownload.php?group_id=151639" style="border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); color: rgb(0, 87, 156); "&gt;Download here&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 13px; line-height: 18px;"&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;* Features added&lt;br /&gt;    Optimizations to increase speed.&lt;br /&gt;    Optimized listing of log files.&lt;br /&gt;    Added better error messages for el = null errors.&lt;br /&gt;    Added tests for failing features.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    Added _parentNode(el, tagName, occurrence),&lt;br /&gt;    Added _parentCell(el, occurrence)&lt;br /&gt;    Added _parentRow(el, occurrence)&lt;br /&gt;    Added _parentTable(el, occurrence)&lt;br /&gt;    Added _cell("cellText")&lt;br /&gt;    Added _in() and modified other accessors to take inElement as parameter&lt;br /&gt;    &lt;br /&gt;    saveAs looks at Content-Disposition: attachment to download files&lt;br /&gt;    Added tests around accessor identification&lt;br /&gt;    Test and highlight on the Recorder tab work on selected text&lt;br /&gt;    Temp files saved via "Save As" have session id prefixed to prevent overwrite.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    _near&lt;br /&gt;    _rte for richtext editors based on iframe&lt;br /&gt;    Reset button added to Playback. Does not refresh page.&lt;br /&gt;    _scriptPath added&lt;br /&gt;    _type added to type partial content without blur or onchange.&lt;br /&gt;    moved to chunked encoding&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    Added element.visibility_check.strict = false to sahi.properties. This is the default now.  &lt;br /&gt;    Added download.download_if_contentdisposition_is_attachment = false to sahi.properties. &lt;br /&gt;    Set this to true to automatically download files with header Content-Disposition:attachment. &lt;br /&gt;    Causes problems with blogger.com profile images.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    Stubs for Sahi's APIs and basic objects like window and document added.&lt;br /&gt;      This allows variable declarations like &lt;br /&gt;      var $ln = _link("Form Test"); &lt;br /&gt;      _click($ln);&lt;br /&gt;    Added xhr.wait_when_ready_state_3 to sahi.properties.&lt;br /&gt;      Set to false for cases if some XHRs never reach readyState 4. Needed for gmail.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;* Bugfixes&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    Playback to recorder tab switch when moving between multiple domains during playback fixed.&lt;br /&gt;    Messages displayed multiple times during retry of step removed. Shows only once.&lt;br /&gt;    Fixed NaN error in _logException and _logExceptionAsFailure.&lt;br /&gt;    Fixed Content-Type related errors for state.js.&lt;br /&gt;    Fixed order of response headers (SignIn Cookie problem).&lt;br /&gt;    Log viewer shows file not found message and does not throw exception on console.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    Autosuggest on Controller Accessor field does not disappear to the right.&lt;br /&gt;    APIs dropdown only lists public APIs of Sahi&lt;br /&gt;    _imageSubmitButton indexes fixed. (Treats alt and title equivalently)&lt;br /&gt;    saveAs NPE fixed&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    Fixed traffic logging. It had stopped working after moving to streams.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; padding-top: 0.5em; padding-right: 0px; padding-bottom: 0.5em; padding-left: 0px; border-top-color: rgb(221, 228, 235); border-right-color: rgb(221, 228, 235); border-bottom-color: rgb(221, 228, 235); border-left-color: rgb(221, 228, 235); "&gt;    Divs are identified as _div instead of _spandiv&lt;br /&gt;    Spans are identified as _span instead of _spandiv&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/5171122865449281146/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=5171122865449281146" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5171122865449281146" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5171122865449281146" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/05/sahi-v2-release-2009-05-21-is-now.html" title="Sahi V2 Release 2009-05-21 is now available!" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-8958485964116705396</id><published>2009-05-20T01:17:00.000-07:00</published><updated>2009-05-20T01:25:34.973-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="forums" /><title type="text">Sahi Forums updated</title><content type="html">We have upgraded the PunBB version of Sahi Forums. Kudos to the &lt;a href="http://punbb.informer.com/"&gt;PunBB folks&lt;/a&gt; for creating such a nice light weight forum software.&lt;div&gt;&lt;br /&gt;The new Sahi forums have a few nice features, namely:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tagging topics.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sending private messages.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ability to mark a topic "Closed".&lt;/li&gt;&lt;li&gt;Private forums for paid customers.&lt;/li&gt;&lt;li&gt;Adding attachments (for paid customers).&lt;/li&gt;&lt;/ul&gt;Have a look at the new forums at &lt;a href="http://sahi.co.in/forums"&gt;http://sahi.co.in/forums&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comments and suggestions are welcome.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/8958485964116705396/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=8958485964116705396" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8958485964116705396" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8958485964116705396" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/05/sahi-forums-updated.html" title="Sahi Forums updated" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-8859574396136765476</id><published>2009-04-22T23:03:00.000-07:00</published><updated>2009-04-22T23:07:25.773-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi V2 Nightly Unstable Build 2009-04-23 Released</title><content type="html">Sahi V2 Nightly Unstable Build 2009-04-23 has been released. (&lt;a href="https://sourceforge.net/project/showfiles.php?group_id=151639&amp;package_id=309861"&gt;Download&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;This build has a few significant improvements. It now uses Rhino 1.6R2 as its Javascript engine.&lt;br /&gt;&lt;br /&gt;NOTE that this and further builds need Java 1.5 or greater.&lt;br /&gt;&lt;br /&gt;* API _near, similar to _in has been added. Any element can be found relative to another by using _near. &lt;br /&gt;Eg. &lt;br /&gt;&lt;pre class="brush:sahi"&gt;&lt;br /&gt;_checkbox(0, _near(_span("user name 1")))&lt;br /&gt;_link("delete", _near(_span("user name 1")));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;* All Sahi accessor API calls can be set to variables now. &lt;br /&gt;Eg. &lt;br /&gt;&lt;pre class="brush:sahi"&gt;&lt;br /&gt;_click(_link("click me"));&lt;/pre&gt; can be written now as&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:sahi"&gt;&lt;br /&gt;$ln = _link("click me");&lt;br /&gt;_click($ln);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;* Check for visibility of elements is now controlled via element.visibility_check.strict property in sahi.properties. It is set to false by default.</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/8859574396136765476/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=32259128&amp;postID=8859574396136765476" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8859574396136765476" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8859574396136765476" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/04/sahi-v2-nightly-unstable-build-2009-04.html" title="Sahi V2 Nightly Unstable Build 2009-04-23 Released" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="32" src="http://4.bp.blogspot.com/_94EzacITAcY/TSMtgcoJGoI/AAAAAAAAA20/d3W4xCjELqA/S220/_MG_3210%2B%2528193x200%2529.jpg" /></author><thr:total>0</thr:total></entry></feed>
