<?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:georss="http://www.georss.org/georss"><id>tag:blogger.com,1999:blog-32259128</id><updated>2009-11-08T03:19:08.729-08:00</updated><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="hub" href="http://pubsubhubbub.appspot.com/" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/SahiSoftware" type="application/atom+xml" /><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-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&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-3158682480246397466?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</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="https://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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-4897664065725607557?l=blog.sahi.co.in'/&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="https://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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-3179266273632690425?l=blog.sahi.co.in'/&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="https://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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-3139379062578247260?l=blog.sahi.co.in'/&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="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=3139379062578247260" title="1 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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-7379346828937333718?l=blog.sahi.co.in'/&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="https://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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-5171122865449281146?l=blog.sahi.co.in'/&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="https://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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-8958485964116705396?l=blog.sahi.co.in'/&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="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=8958485964116705396" title="0 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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-8859574396136765476?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</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="https://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:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-8987871731195643142</id><published>2009-04-11T00:37:00.000-07:00</published><updated>2009-04-13T00:06:15.600-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="talks" /><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><category scheme="http://www.blogger.com/atom/ns#" term="DCB2" /><title type="text">Sahi in DevCamp</title><content type="html">Presented on Sahi in DevCamp Bangalore held in the ThoughtWorks office. I spoke in the 10.30 slot and was pleasantly surprised by the turnout. Show cased how Sahi can be used to test https and AJAX sites using the example of gmail. The response was encouraging.&lt;br /&gt;&lt;br /&gt;Below is the code that was need to automate gmail.&lt;br /&gt;&lt;pre class="brush: sahi"&gt;&lt;br /&gt;function login($username, $password){&lt;br /&gt;    _setValue(_textbox("Email"), $username);&lt;br /&gt;    _setValue(_password("Passwd"), $password);&lt;br /&gt;    _click(_submit("Sign in"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;login("sahi.abcde", "tough123");&lt;br /&gt;_click(_spandiv("Compose Mail"));&lt;br /&gt;_setValue(_textarea("to"), "&amp;lt;dummy.email@example.com&amp;gt;, ");&lt;br /&gt;_setValue(_textbox("subject"), "important subject");&lt;br /&gt;_rteWrite(_rte(0, _near(_textbox("subject"))), "lots of content");&lt;br /&gt;_click(_spandiv("Send[9]"));&lt;br /&gt;_assertExists(_cell("Your message has been sent. View message"));&lt;br /&gt;_click(_link("Sent Mail"));&lt;br /&gt;_assertExists(_spandiv("To: dummy.email"));&lt;br /&gt;_click(_checkbox(0, _near(_spandiv("To: dummy.email"))));&lt;br /&gt;_expectConfirm("You are about to move the entire conversation to the Trash. Are you sure you want to trash the entire conversation containing your sent message?", true)&lt;br /&gt;_click(_spandiv("Delete[14]"));&lt;br /&gt;_assertExists(_cell("The conversation has been moved to the Trash. Learn more Undo"));&lt;br /&gt;_assertExists(_cell("No sent messages! Send one now!"));&lt;br /&gt;_click(_link("Sign out"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This was the first cut, of which all lines except those using _near were recorded via the Sahi controller.&lt;br /&gt;&lt;br /&gt;I will follow up with a more detailed post on other discussions I had in DevCamp.&lt;br /&gt;Note that _near is available only in the most recent nightly build (&lt;a href="https://sourceforge.net/project/downloading.php?group_id=151639&amp;filename=sahi_20090411.zip&amp;a=46126987"&gt;2009-04-11&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;This nightly release was made for folks at DevCamp who wish to replicate what I demoed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-8987871731195643142?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/8987871731195643142/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=8987871731195643142" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8987871731195643142" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8987871731195643142" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/04/sahi-in-dev-camp_11.html" title="Sahi in DevCamp" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-8469445164908434910</id><published>2009-04-10T05:08:00.000-07:00</published><updated>2009-04-10T05:15:44.290-07:00</updated><title type="text">Sahi in Dev Camp</title><content type="html">I am going to show case automation of GMail through &lt;a href="http://sahi.co.in/"&gt;Sahi&lt;/a&gt; in tomorrrow's Dev Camp. Intending to highlight AJAX and HTTPS/SSL capabilities of Sahi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-8469445164908434910?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/8469445164908434910/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=8469445164908434910" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8469445164908434910" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8469445164908434910" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/04/sahi-in-dev-camp.html" title="Sahi in Dev Camp" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-5693197538896825891</id><published>2009-04-01T23:20:00.001-07:00</published><updated>2009-04-02T02:54:16.190-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="features" /><category scheme="http://www.blogger.com/atom/ns#" term="technical" /><title type="text">Improving Sahi's performance</title><content type="html">Over the last year, Sahi has steadily undergone enhancements to speed up its proxy. &lt;br /&gt;&lt;br /&gt;For outgoing connections, we moved away from raw sockets and started using java's HttpURLConnection primarily for its proxy tunnelling capabilities, but it helped in boosting performance over using raw sockets due to better socket reuse and buffering.&lt;br /&gt;&lt;br /&gt;Caching was allowed for static files so that browsers could just use files from their own cache, instead of fetching from the server.&lt;br /&gt;&lt;br /&gt;But there was still one big problem with Sahi's proxy. Let me explain:&lt;br /&gt;&lt;br /&gt;Opening a connection to a server or a proxy is expensive for the browser. In a simple case a browser will open one connection per request and then close it down when it has read the response. But since it is an expensive process, the HTTP protocol allows something called keep-alive or persistent connections. What this means is that a browser can open a connection, send its request, read the response, then again send the next request using the same connection. This helps in reusing connections and can vastly improve browser performance. &lt;br /&gt;&lt;br /&gt;So, how does the browser know that a response is complete before it sends the next request? It knows because, the server first sends the length of the content that the browser is supposed to read, via the Content-Length header. Once the browser has read that many bytes, the browser will assume the response is complete. It can then use the connection for the next request.&lt;br /&gt;&lt;br /&gt;Browsers do one more thing to improve performance. Even before the full content is read, the browser starts to render partial data. This means that if there is a script or css file included in the html page, these included files will start to get fetched (through different connections) while the page is still rendering. &lt;br /&gt;&lt;br /&gt;But this is not the case when using Sahi as its proxy. Sahi modifies the content slightly so the content length changes. And since it is not known what the eventual content length would be, Sahi first reads the full response from the server, modifies the response, recalculates the content-length, and then sends the new content-length to the browser followed by the modified content. This means that while the response is coming in slowly from the server, the proxy is still buffering it, so the browser cannot start rendering partial content or fetch embedded content. (Note that the communication time from the proxy to the browser is negligible compared to proxy-web server communication, since the proxy is either on the same machine as the browser or on the LAN.)&lt;br /&gt;&lt;br /&gt;Have a look at how Firefox behaves with and without proxy. Both are keep-alive connections and both have the content-length header set correctly.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_94EzacITAcY/SdSJJhtnM6I/AAAAAAAAAds/_QoLzzVcGHQ/s1600-h/hh_no.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 32px;" src="http://4.bp.blogspot.com/_94EzacITAcY/SdSJJhtnM6I/AAAAAAAAAds/_QoLzzVcGHQ/s400/hh_no.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5320027856592909218" /&gt;&lt;/a&gt;&lt;br /&gt;Without Proxy: Notice how the css and js files are being fetched before the first response has been fully read.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_94EzacITAcY/SdSJJ__MX8I/AAAAAAAAAd0/ObZ6StE-1XU/s1600-h/hh_keepalive.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 31px;" src="http://2.bp.blogspot.com/_94EzacITAcY/SdSJJ__MX8I/AAAAAAAAAd0/ObZ6StE-1XU/s400/hh_keepalive.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5320027864719712194" /&gt;&lt;/a&gt;&lt;br /&gt;With Proxy: Notice how the css and js files are being fetched only AFTER the first response has been fully read.&lt;br /&gt;&lt;br /&gt;So how can we solve this? HTTP allows one other mechanism. This is called chunked transfer, which can be activated via the header Transfer-Encoding:chunked. What this means is, you no longer need to send the content length of the whole response. You can break down the response into chunks and you send the content-length of a single chunk, then its data, then the content-length of the next chunk followed by its data etc. You signal the end of the response by an empty chunk of content-length 0. &lt;br /&gt;&lt;br /&gt;This is how Firefox behaves when using Transfer-Encoding: chunked. This is with the proxy on.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_94EzacITAcY/SdSJJwcvlQI/AAAAAAAAAd8/UetipCRNXOI/s1600-h/hh_chunked.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 29px;" src="http://1.bp.blogspot.com/_94EzacITAcY/SdSJJwcvlQI/AAAAAAAAAd8/UetipCRNXOI/s400/hh_chunked.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5320027860548687106" /&gt;&lt;/a&gt;&lt;br /&gt;With Proxy: Notice how the css and js files are being fetched along with the first response.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Does this mean that, all Sahi had to do was change the headers? No.&lt;br /&gt;&lt;br /&gt;Working on a whole string is much easier than working on a stream of data. For example if we wanted to change all instances of "blue" to "red", it would be easy to work on "It is a blue blue sky". It would not be the same to work on three substrings of the same string like "It is a bl", "ue blu", "e sky". You can see that none of them individually have "blue" in them. A solution in this particular case, would be to keep the last word somewhere, concatenate it with the next string, and then try substitutions.&lt;br /&gt;&lt;br /&gt;Second, and more significantly, you cannot just chain data coming in from an inputstream from the web-server into an outputstream pointing to the browser. Why? Because, both network reads and writes via java.io are blocking calls in Java and such a read and write in a single thread can cause a dead-lock. What that essentially means is we need to have a common buffer where data is written to and read from, but via two different threads. This is solved well using PipedInputStreams and PipedOutputStreams (which will be a separate blog post).&lt;br /&gt;&lt;br /&gt;After a few days of work, Sahi now has a fully functional, much faster streaming proxy, with filters on the streams doing all the data and header modifications. The changes should be available in the next build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-5693197538896825891?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/5693197538896825891/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=5693197538896825891" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5693197538896825891" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/5693197538896825891" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/04/speeding-sahis-performance.html" title="Improving Sahi's performance" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_94EzacITAcY/SdSJJhtnM6I/AAAAAAAAAds/_QoLzzVcGHQ/s72-c/hh_no.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3244889400428602529</id><published>2009-03-04T21:55:00.000-08:00</published><updated>2009-04-01T07:22:39.493-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi V2 2009-03-04 Released</title><content type="html">Another stable build of Sahi (&lt;a href="http://sahi.co.in/"&gt;http://sahi.co.in/&lt;/a&gt;) has been released yesterday. You can get the latest build here: &lt;a href="https://sourceforge.net/project/platformdownload.php?group_id=151639"&gt;https://sourceforge.net/project/platformdownload.php?group_id=151639&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This release has been a steady improvement of features from the older builds, making Sahi faster and more stable. It fixes a lot of bugs which had crept in since moving to Rhino as the engine and moving to httpurlconnection from raw sockets in the proxy.&lt;br /&gt;&lt;br /&gt;Below is the change log:&lt;br /&gt;&lt;br /&gt;04 March 2009&lt;br /&gt;-----------&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Features added&lt;/span&gt;&lt;br /&gt; Displaying popup name in Controller.&lt;br /&gt; Using -no-remote flag instead of MOZ_NO_REMOTE. Older users need to add this to ant targets.&lt;br /&gt; _fail(msg) added&lt;br /&gt;&lt;br /&gt; Added ext.http.both.proxy.bypass_hosts to sahi.properties to bypass some domains while&lt;br /&gt;  connecting through external proxy&lt;br /&gt;&lt;br /&gt; Added _sahi.printDiagnostics to get some info about browser and XMLHttpRequest being used.&lt;br /&gt;&lt;br /&gt; id ignored for JSF RichFaces.&lt;br /&gt; Support for IE modal dialogs (invoked via showModalDialog).&lt;br /&gt; _setSelected identifies options by id and index.&lt;br /&gt; _listItem API added for identification of LI tags.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Bugfixes&lt;/span&gt;&lt;br /&gt; Fix for identifying popups from a different domain&lt;br /&gt; Fixed _continueOnError&lt;br /&gt; Put back no-cache headers because pages were being picked from cache in IE causing login/logouts on some sites to fail.&lt;br /&gt; Fixed issues with link clicks on Chrome and Safari&lt;br /&gt; Missing tests now fail the build.&lt;br /&gt;&lt;br /&gt; Fix related to contentlength and transfer-encoding introduced in previous build.&lt;br /&gt; Fix for XHRs not tagged properly (and hence wrongly handled) when different domains were present in iframes.&lt;br /&gt; _readFile returns javascript string.&lt;br /&gt;&lt;br /&gt; Handling of events registered via listeners on link clicks.&lt;br /&gt; Links with numbers in text are quoted during recording. _link("&lt;&gt;").&lt;br /&gt;&lt;br /&gt; Link click does not proceed if event.returnValue is false&lt;br /&gt; Checking contentType also to figure out javascript content for XHR handling&lt;br /&gt;&lt;br /&gt; Fixed proxying to https sites which do not have a valid certificate. (bug introduced in 21 Jan 2009 build).&lt;br /&gt;&lt;br /&gt;One small change for users who were running multi threaded playback on Firefox: you will need to add "-no-remote" at the end of browserOption so that it now looks like this: "-profile ${basedir}/browser/ff/profiles/sahi$threadNo &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;-no-remote&lt;/span&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-3244889400428602529?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3244889400428602529/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=3244889400428602529" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3244889400428602529" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3244889400428602529" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2009/03/sahi-v2-2009-03-04-released.html" title="Sahi V2 2009-03-04 Released" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-8057735177573601269</id><published>2008-08-31T20:33:00.000-07:00</published><updated>2009-04-01T07:22:39.493-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi V2 20080831 Released</title><content type="html">After close to a month of development, Sahi V2 20080831 has been released today.  (&lt;a href="http://sahi.co.in/w/"&gt;http://sahi.co.in/w/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;This release uses Rhino as the scripting engine, thus moving most of the script execution to the proxy. This should go a long way in simplifying Sahi scripts. Scripts now execute on the proxy, and only stuff that needs to execute on the browser is sent to the browser. Thus scheduler functions are sent to the browser for execution. One change which has come in is that custom functions which may have been added for identification of browser elements, now need to be wrapped in a &amp;lt;browser&amp;gt;&amp;lt;/browser&amp;gt;  tag so that they are also sent to the browser.&lt;br /&gt;&lt;br /&gt;This build also has some important changes to the SocketPool which will fix issues related to too many sockets being used and errors due to BindExceptions. Suite execution has been changed such that even if the browser crashes, the suite will continue with the next script and thus not hold up a build. DB methods now close connections properly.&lt;br /&gt;&lt;br /&gt;There will still be a few rough edges and I hope users will report bugs so that they are easily fixed. Meanwhile, help spread the message through your blogs or email forums.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-8057735177573601269?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/8057735177573601269/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=8057735177573601269" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8057735177573601269" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/8057735177573601269" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2008/08/sahi-v2-20080831-released.html" title="Sahi V2 20080831 Released" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-3545091253216316664</id><published>2008-08-21T07:50:00.001-07:00</published><updated>2008-08-21T07:53:57.989-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Sahi" /><title type="text">Sahi - Latest developments</title><content type="html">Copy of post on forum: http://sahi.co.in/forums/viewtopic.php?id=261&lt;br /&gt;&lt;br /&gt;I had not been active on the Sahi forums (http://sahi.co.in/forums) for sometime. Thanks a ton to StringyLow, tinchie8, lepierrot, pankaj.nith and others for keeping this forum active, and replying to posts.&lt;br /&gt;&lt;br /&gt;Meanwhile I have been working on a version of Sahi which attacks one of the basic problems with Sahi.&lt;br /&gt;Scopes of variables, scheduler and normal functions and the the way steps are queued and executed and the way their integrity needs to be maintained across page loads.&lt;br /&gt;&lt;br /&gt;The problem had been that the scripts (after parsing) were executed on the browser itself, and when a page unloads, the state of the script's execution needed to be persisted on the proxy and then resurarected when the next page loaded. While this allowed the ease of using javascript for scripting, when scripts became bigger, the browsers and the proxy had to do a lot more persisting and resurrecting.&lt;br /&gt;&lt;br /&gt;As the logical next step, I wanted to move this script execution to the proxy. I now use Rhino, an excellent javascript engine, to execute the scripts on the proxy. Only steps that need to be executed on the browser are sent to the browser. Javascript can still be used for Sahi scripting. Even though the script still is parsed, it is much simpler to understand script execution than it was before. Rhino also comes with a debugger which can prove useful to Sahi script debugging.&lt;br /&gt;&lt;br /&gt;The version is slated to be released soon. I am looking for volunteers to test and give me feedback about the new version. If you have existing scripts, the scripts may need to be modified a little to make it work with the new version.&lt;br /&gt;If you are interested, please post back or email me at narayan at sahi.co.in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-3545091253216316664?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/3545091253216316664/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=3545091253216316664" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3545091253216316664" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/3545091253216316664" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2008/08/sahi-latest-developments.html" title="Sahi - Latest developments" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-72139541399447351</id><published>2008-07-04T03:36:00.000-07:00</published><updated>2009-04-01T07:26:14.816-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><title type="text">Testing applications with different subdomains</title><content type="html">Applications like Facebook use multiple subdomains to fetch content.&lt;br /&gt;To make Sahi work for such applications, open sahi/htdocs/spr/domainfix.js and uncomment the line&lt;br /&gt;&lt;br /&gt;document.domain = d.substring(ix+1)&lt;br /&gt;&lt;br /&gt;Restart Sahi and subdomains should work now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-72139541399447351?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/72139541399447351/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=72139541399447351" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/72139541399447351" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/72139541399447351" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2008/07/testing-applications-with-different.html" title="Testing applications with different subdomains" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-353277940695164657</id><published>2008-07-04T03:33:00.000-07:00</published><updated>2009-04-01T07:26:14.816-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><title type="text">Sahi Tutorials</title><content type="html">Excellent tutorial written by Jesse Larson.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sahi.co.in/forums/viewtopic.php?id=205"&gt;http://sahi.co.in/forums/viewtopic.php?id=205&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tutorial in Flash:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sahi.co.in/static/sahi_tutorial.html"&gt;http://sahi.co.in/static/sahi_tutorial.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-353277940695164657?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/353277940695164657/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=353277940695164657" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/353277940695164657" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/353277940695164657" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2008/07/sahi-tutorials.html" title="Sahi Tutorials" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-2222104045559592235</id><published>2007-10-10T22:17:00.000-07:00</published><updated>2009-04-01T07:25:16.579-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="features" /><category scheme="http://www.blogger.com/atom/ns#" term="technical" /><title type="text">Sahi no longer needs waiting for AJAX calls</title><content type="html">The new release of Sahi (&lt;a href="https://sourceforge.net/project/showfiles.php?group_id=151639"&gt;Sahi Nightly 2001-10-11&lt;/a&gt;) automatically waits for AJAX responses to complete before proceeding.&lt;br /&gt;&lt;br /&gt;This removes the need to add AJAX request url patterns to exclude_inject.txt&lt;br /&gt;&lt;br /&gt;Sahi accomplishes this by waiting for XHR requests to complete before it proceeds to its next step. It already used to wait for frames and iframes.&lt;br /&gt;&lt;br /&gt;Another significant change is the way variables are used in Sahi code.&lt;br /&gt;I shall be writing a new blog post for that.&lt;br /&gt;&lt;br /&gt;_dragDropXY(element, x, y) has been added.&lt;br /&gt;A lot of bugs including iframe traversal, _setFile on IE and _button have been fixed.&lt;br /&gt;&lt;br /&gt;Download: &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=151639"&gt;https://sourceforge.net/project/showfiles.php?group_id=151639&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sahi.co.in/"&gt;http://sahi.co.in/&lt;/a&gt; is unfortunately down right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-2222104045559592235?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/2222104045559592235/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=2222104045559592235" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/2222104045559592235" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/2222104045559592235" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2007/10/sahi-no-longer-needs-waiting-for-ajax.html" title="Sahi no longer needs waiting for AJAX calls" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-6836329682516214005</id><published>2007-06-12T20:29:00.000-07:00</published><updated>2009-04-01T07:25:16.579-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="features" /><category scheme="http://www.blogger.com/atom/ns#" term="technical" /><title type="text">Ajax and Sahi</title><content type="html">&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In Sahi, some javascript is added to all pages. In an ajax call, the response should be xml. But sahi may taint the xml with its javascript and hence ajax calls may stop working. Sahi looks at the content type of a file before it injects its js, but most of the time the ajax responses also have the content type as text/html&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sahi can be asked to not inject js into requests whose urls follow specific patterns.&lt;br /&gt;Say urls which have say "/ajax/" in them can be excluded from injection.&lt;br /&gt;&lt;br /&gt;What you need to do is add the regular expression pattern of the ajaxy urls to config/exclude_inject.txt&lt;br /&gt;so if your url is something like&lt;br /&gt;"&lt;a href="http://www.example.com/ajax/list.html" target="_blank"&gt;http://www.example.com/ajax/list.html&lt;/a&gt;" use&lt;br /&gt;".*/ajax/.*" (without quotes) to match all urls with /ajax/ in them and exclude them from js injection.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-6836329682516214005?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/6836329682516214005/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=6836329682516214005" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/6836329682516214005" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/6836329682516214005" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2007/06/ajax-and-sahi.html" title="Ajax and Sahi" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-115807987546764646</id><published>2006-09-12T09:49:00.000-07:00</published><updated>2009-04-01T07:22:39.493-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi Nightly Build 2006-09-12 released</title><content type="html">A lot of features have been added in this release.&lt;br /&gt;&lt;br /&gt;* APIS added &lt;br /&gt;_expectPrompt(label, txt) &lt;br /&gt;_lastPrompt() &lt;br /&gt;_debug(s) &lt;br /&gt;_debugToErr(s) &lt;br /&gt;_debugToFile(s, file) &lt;br /&gt;_getDB(driver, jdbcurl, username, password) &lt;br /&gt;_readFile(file) &lt;br /&gt; &lt;br /&gt;* _expectConfirm(boolean) has been changed to _expectConfirm(label, boolean); &lt;br /&gt;* Fixed bug relating to invalid logs being created when there are popups &lt;br /&gt;* _getDB API added for database access &lt;br /&gt;* _readFile(file) added for file reading &lt;br /&gt;* debug apis added for writing to a log file &lt;br /&gt;* Fixed bug regarding dollar array variables. Arrays can also be used as dollar variables now &lt;br /&gt;* scheduler functions work from inside _call also, without messing the execution stack&lt;br /&gt;&lt;br /&gt;Download from &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=151639"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-115807987546764646?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/115807987546764646/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=115807987546764646" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115807987546764646" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115807987546764646" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2006/09/sahi-nightly-build-2006-09-12-released.html" title="Sahi Nightly Build 2006-09-12 released" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-115484353620546498</id><published>2006-08-05T22:39:00.000-07:00</published><updated>2009-04-01T07:26:33.503-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><title type="text">Toggling Proxy on Browsers</title><content type="html">One of the pain points of using Sahi is to remember to set the proxy on the browser while testing and removing it later.&lt;br /&gt;&lt;br /&gt;There are a few tools which alleviate this well.&lt;br /&gt;&lt;br /&gt;Firefox:&lt;br /&gt;&lt;br /&gt;Use &lt;a href="http://proxybutton.mozdev.org/installation.html"&gt;Proxy Button&lt;/a&gt; to toggle the proxy in one click from the Firefox toolbar.&lt;br /&gt;&lt;br /&gt;Internet Explorer:&lt;br /&gt;&lt;br /&gt;Use &lt;a href="http://www.bartdart.com/"&gt;ProxyPal&lt;/a&gt; to toggle proxy from the IE toolbar.&lt;br /&gt;&lt;br /&gt;Use &lt;sahi&gt;/tools/toggle_IE_proxy.exe to toggle proxy.&lt;br /&gt;&lt;br /&gt;Command Line:&lt;br /&gt;toggle_IE_proxy.exe enable&lt;br /&gt;toggle_IE_proxy.exe disable&lt;br /&gt;&lt;br /&gt;Ant:&lt;br /&gt;&lt;br /&gt;&amp;lt;antcall target="proxyon"/&amp;gt;&lt;br /&gt;&amp;lt;antcall target="proxyoff"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="proxyon"&amp;gt;&lt;br /&gt; &amp;lt;exec executable="tools/toggle_IE_proxy.exe"&amp;gt;&lt;br /&gt;  &amp;lt;arg value="enable"/&amp;gt;&lt;br /&gt; &amp;lt;/exec&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="proxyoff"&amp;gt;&lt;br /&gt; &amp;lt;exec executable="tools/toggle_IE_proxy.exe"&amp;gt;&lt;br /&gt;  &amp;lt;arg value="disable"/&amp;gt;&lt;br /&gt; &amp;lt;/exec&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sahi.sourceforge.net/ant.html"&gt;Full ant file&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-115484353620546498?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/115484353620546498/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=115484353620546498" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115484353620546498" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115484353620546498" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2006/08/toggling-proxy-on-browsers.html" title="Toggling Proxy on Browsers" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-115484219155135785</id><published>2006-08-05T22:16:00.000-07:00</published><updated>2009-04-01T07:22:39.493-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><title type="text">Sahi Nightly Build 2006-08-06 released</title><content type="html">This build has the following added features:&lt;br /&gt;&lt;br /&gt;* &lt;a href="http://sahi.sourceforge.net/apis.html#setfile"&gt;File upload support&lt;/a&gt;&lt;br /&gt;* Proxy toggling through &lt;a href="http://sahi.sourceforge.net/ant.html"&gt;ant&lt;/a&gt;/command line for Internet Explorer&lt;br /&gt;* &lt;a href="http://sahi.sourceforge.net/apis.html#confirm"&gt;_expectConfirm(boolean) and _lastConfirm() apis added&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Special thanks to Sriram Narayanan (Ram to ThoughtWorkers) who created toggle_IE_proxy.exe, a 34 KB file of immense use to Sahi users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-115484219155135785?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/115484219155135785/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=115484219155135785" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115484219155135785" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115484219155135785" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2006/08/sahi-nightly-build-2006-08-06-released.html" title="Sahi Nightly Build 2006-08-06 released" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32259128.post-115484055646789667</id><published>2006-08-05T21:59:00.000-07:00</published><updated>2006-08-05T22:55:01.766-07:00</updated><title type="text">Sahi</title><content type="html">My &lt;a href="http://narayanraman.blogspot.com"&gt;personal blog&lt;/a&gt; now seems to have a little too much of &lt;a href="http://sahi.sourceforge.net"&gt;Sahi&lt;/a&gt; on it.&lt;br /&gt;Hence this blog. &lt;br /&gt;This will mostly have updates, releases and upcoming features.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32259128-115484055646789667?l=blog.sahi.co.in'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sahi.co.in/feeds/115484055646789667/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=32259128&amp;postID=115484055646789667" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115484055646789667" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/32259128/posts/default/115484055646789667" /><link rel="alternate" type="text/html" href="http://blog.sahi.co.in/2006/08/sahi.html" title="Sahi" /><author><name>V. Narayan Raman</name><uri>http://www.blogger.com/profile/18094480866664974663</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="04259581750369646065" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>
