<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/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-4073546017384129072</id><updated>2019-07-13T18:52:17.851+05:30</updated><category term="Testing"/><category term="Selenium"/><category term="Automation"/><category term="general"/><category term="WebDriver"/><category term="jQuery"/><category term="Ajax"/><category term="Firefox"/><category term="Python"/><category term="Tools"/><category term="Addons"/><category term="Code Snippet"/><category term="Flash"/><category term="Mail"/><category term="Thunderbird"/><category term="AutoIt"/><category term="BDD"/><category term="Benubird"/><category term="Companies"/><category term="Corruption"/><category term="Cygwin"/><category term="Emulator"/><category term="Firebug"/><category term="Flex"/><category term="Frameworks"/><category term="GMail"/><category term="IPv6"/><category term="Jython"/><category term="NetExport"/><category term="OS"/><category term="Organization"/><category term="PDF"/><category term="RSS"/><category term="Statistics"/><category term="Wine"/><category term="Zoho"/><category term="Zoho Mail"/><category term="announcement"/><category term="other"/><title type='text'>Raja&#39;s Learnings</title><subtitle type='html'>Place to write my thoughts and works. </subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-4221929134959807644</id><published>2014-05-22T11:02:00.001+05:30</published><updated>2014-05-22T12:38:08.566+05:30</updated><title type='text'>Indian Elections 2014 Data and analysis</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Here is Indian Elections 2014 data and some analysis from it. &lt;br /&gt;&lt;br /&gt;If there is no data shown, please switch to http by clicking &lt;a href=&quot;http://vrajasankar.blogspot.in/2014/05/indian-elections-2014-data-and-analysis.html&quot;&gt;this link&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;First, Winning candidates with votes received, victory margin &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;iframe frameborder=&quot;0&quot; height=&quot;400&quot; src=&quot;http://cf.datawrapper.de/0oULL/1/&quot; width=&quot;600&quot;&gt;test&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Party wise deposit lost/retained results &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;iframe frameborder=&quot;0&quot; height=&quot;400&quot; src=&quot;http://cf.datawrapper.de/oFb8T/2/&quot; width=&quot;600&quot;&gt;test&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;BSP and AAP lost maximum deposits and denoted crores to Election Commission. AIADMK is the only major party which retained deposits in all the seats it contested. Independents got deposits in only 18 seats.  &lt;br /&gt;&lt;br /&gt;These two charts prepared using the following data &lt;br /&gt;&lt;br /&gt;All the candidates data  &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;iframe frameborder=&quot;0&quot; height=&quot;400&quot; src=&quot;http://cf.datawrapper.de/0oULL/1/&quot; width=&quot;600&quot;&gt;test&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Total votes polled in each seat &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;iframe frameborder=&quot;0&quot; height=&quot;400&quot; src=&quot;http://cf.datawrapper.de/IZcxN/1/&quot; width=&quot;600&quot;&gt;test&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I will add more analysis in coming days. If you want to download the data from drop box go here, &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/13763555/winning%20candidates%20with%20diff.ods&quot;&gt;Wining candidates data &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/13763555/electionvotescount.csv&quot;&gt;Total votes polled &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/13763555/totalcandidatesvotes.csv&quot;&gt;All the candidates data&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/13763555/partywise%20depoist.ods&quot;&gt;Party wise depoist deatils&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/4221929134959807644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2014/05/indian-elections-2014-data-and-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/4221929134959807644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/4221929134959807644'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2014/05/indian-elections-2014-data-and-analysis.html' title='Indian Elections 2014 Data and analysis'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-3906021549409167732</id><published>2013-08-10T19:58:00.001+05:30</published><updated>2013-08-10T19:58:40.624+05:30</updated><title type='text'>Functional HtmlUnit testing in Python using Requests for Humans, </title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Using testing for Html by HtmlUnit/http-requests using server side requests is a good way to improve the speed of testing. In Ajax era, testing the web throws more challenges in automation testing, better way is to test the XHR requests separately rather than trying to test all combinations in browser based UI automation. &lt;br /&gt;&lt;br /&gt;First let us see the GET/POST request by HtmlUnit, &lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;br /&gt;//Create a WebRequest for POST, use HttpMethod.GET for GET requests. &lt;/blockquote&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;WebRequest request = new WebRequest(new URL(&quot;http://yoururl.com&quot;), HttpMethod.POST);&lt;/blockquote&gt;&lt;blockquote&gt;request.setRequestParameters(new ArrayList());&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;//Add the params using ArrayList&lt;br /&gt;request.getRequestParameters().add(new NameValuePair(&quot;param1&quot;,&quot;value1&quot;));&lt;br /&gt;&lt;br /&gt;//Send the request to the server using getPage. &lt;br /&gt;HtmlPage page = webClient.getPage(request);&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;//Get the response as a String. &lt;br /&gt;String html= page.getWebResponse().getContentAsString(); &lt;/blockquote&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;//Cookies can accessed using the following code,&lt;br /&gt;CookieManager CM = webClient.getCookieManager();&lt;br /&gt;Set&lt;cookie&gt; ck = CM.getCookies();&lt;br /&gt;for(Cookie value : ck)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(value+&quot; &quot;+value.getValue());&lt;br /&gt;}&lt;br /&gt;&lt;/cookie&gt;&lt;/blockquote&gt;So, how to do this in Python using http-requests (Requests for humans)?&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt; #First to create a session using requests.Session&lt;br /&gt;s=requests.Session()&lt;br /&gt;#if you need to print the url along with params using this &lt;br /&gt;s=requests.Session(config={&#39;verbose&#39;:sys.stderr})&lt;br /&gt;&lt;br /&gt;#Create a dict for params to be sent &lt;br /&gt;url = &#39;https://yoururlhere.com&#39;&lt;br /&gt;params={&#39;param1&#39;:&#39;value1&#39; &#39;param2&#39;:&#39;value2&#39;}&lt;br /&gt;&lt;br /&gt;#Call the url &amp;amp; params &lt;br /&gt;reply=s.post(url, params=params)&lt;br /&gt;&lt;br /&gt;#if you want to send the params in the request body not in query string use the data option&lt;br /&gt;reply=s.post(url,data=params)&lt;br /&gt;&lt;br /&gt;#GET request using s.get option&lt;br /&gt;reply=s.get(url,data=params)&lt;br /&gt;&lt;br /&gt;#get the redirected url by accessing .url &lt;br /&gt;print reply.url&lt;br /&gt;&lt;br /&gt;#text or content will give the response&lt;br /&gt;print reply.text&lt;br /&gt;print reply.content&lt;br /&gt;&lt;br /&gt;#Accessing cookie is by s.cookies&lt;br /&gt;print s.cookies&lt;br /&gt;&lt;br /&gt;#convert cookie into dict by dict_from_cookiejar&lt;br /&gt;cookdict=requests.utils.dict_from_cookiejar(s.cookies)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;For HtmlUnit you may need to call&amp;nbsp; the following depending upon your need, options are self explanatory. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;WebClient webClient = new WebClient();&lt;br /&gt;webClient.setHTMLParserListener(HTMLParserListener.LOG_REPORTER);&lt;br /&gt;webClient.setRedirectEnabled(true);&lt;br /&gt;webClient.setJavaScriptEnabled(true);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;webClient.setThrowExceptionOnScriptError(false);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;webClient.setThrowExceptionOnFailingStatusCode(false);&amp;nbsp; &lt;br /&gt;webClient.setUseInsecureSSL(true);&lt;br /&gt;webClient.setCssEnabled(true);&lt;br /&gt;webClient.setAppletEnabled(true);&lt;br /&gt;webClient.setAjaxController(new NicelyResynchronizingAjaxController());&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Thanks for &lt;a href=&quot;http://docs.python-requests.org/en/latest/&quot; target=&quot;_blank&quot;&gt;http-requests&lt;/a&gt; and &lt;a href=&quot;http://htmlunit.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;HtmlUnit&lt;/a&gt; for these amazing frameworks which makes testing easier and faster.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Happy Testing. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/3906021549409167732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2013/08/functional-htmlunit-testing-in-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/3906021549409167732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/3906021549409167732'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2013/08/functional-htmlunit-testing-in-python.html' title='Functional HtmlUnit testing in Python using Requests for Humans, '/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-7702903735832553441</id><published>2013-06-26T08:39:00.002+05:30</published><updated>2013-06-29T20:29:20.525+05:30</updated><title type='text'>Code for converting Tamil Virtual University&#39;s Kamabaramayanam into E book format</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;The Tamil Epic Kambaramayanam is not available as e book format. However it is available in &lt;a href=&quot;http://www.tamilvu.org/&quot; target=&quot;_blank&quot;&gt;Tamil Virtual University&lt;/a&gt; as a HTML pages. Friend of mine, Iyyappan who wanted to study Kamabaramayan thought if that available as a e book format preferably mobile, it would be helpful. He asked me to lend a helping hand. &lt;br /&gt;&lt;br /&gt;I downloaded the html pages from the TVU site. I used python http-requests to download. After downloading, it comes the big issue. These html pages and content are not organized, there is no id, structure to convert the content into desired format. So initially I tried to convert, gave up, just formatted html using BeautifulSoup and combined all the pages. So now the content is in e book format but not good for reading. &lt;br /&gt;&lt;br /&gt;Here is the code for removing the extra html elements&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;print &#39;&lt;html&gt;&#39;&lt;/html&gt;&lt;br /&gt;print &#39;&lt;body&gt;&#39;&lt;/body&gt;&lt;br /&gt;print &#39;&lt;table&gt;&#39;&lt;/table&gt;&lt;br /&gt;for i in range(1,796+1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputfilename=&#39;filename&#39;+i+&#39;.html&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data=urllib2.urlopen(inputfilename)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; soup = BeautifulSoup(data)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data=soup.prettify()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; soup = BeautifulSoup(data)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ti=soup.findAll(attrs={&#39;class&#39;:&#39;link&#39;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for t in ti:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.extract()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ti=soup.findAll(attrs={&#39;class&#39;:&#39;thead&#39;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for t in ti:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.extract()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr=soup.findAll(&#39;hr&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for h in hr:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.extract()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr=soup.findAll(&#39;form&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for h in hr:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.extract()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr=soup.findAll(&#39;head&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for h in hr:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.extract()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr=soup.findAll(&#39;input&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for h in hr:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.extract()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print soup.prettify()&lt;br /&gt;print &#39;&lt;/blockquote&gt;&lt;/div&gt;&#39;print &#39;&lt;br /&gt;&#39;print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Now, need to find a way to format this code. So, I thought instead of trying to wrestle this content inside, html tags, just extract the content convert into text, then process it. &lt;br /&gt;&lt;br /&gt;So, I removed the remaining unwanted text such as page numbers, headings and extracted the text using the following code&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;inputfilename=&#39;file.html&#39;&lt;br /&gt;data=urllib2.urlopen(inputfilename)&lt;br /&gt;soup = BeautifulSoup(data)&lt;br /&gt;data=soup.prettify()&lt;br /&gt;soup = BeautifulSoup(data)&lt;br /&gt;ti=soup.findAll(attrs={&#39;class&#39;:&#39;pno&#39;})&lt;br /&gt;for t in ti:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.extract()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;ti=soup.findAll(attrs={&#39;class&#39;:&#39;subhead&#39;})&lt;br /&gt;for t in ti:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.extract()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;lines=[]&lt;br /&gt;for s in soup(text=True):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s=s.strip().replace(&#39;\t&#39;,&#39;&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #if s!=&#39;.&#39;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print s&lt;/blockquote&gt;&lt;br /&gt;Then I found a pattern in the texts to get that converted. I used the poem numbers to find poems. So if the poem numbers starting at 3000, next poem is at 3001 so on and so forth. Next the explanation of the poems are next to the poem that would be easy to find out too. Removing the newlines and formatting the poem is easy too. Now, I think, it could be done if the content in the html too, but I didnt see that pattern in HTML. I could try to do that from remaining chapters. &lt;br /&gt;&lt;br /&gt;Find the code below,&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;A=open(&#39;file.txt&#39;)&lt;br /&gt;E=A.readlines()&lt;br /&gt;A.close()&lt;br /&gt;&lt;br /&gt;startcount=6060&lt;br /&gt;emptyline=0&lt;br /&gt;state=True&lt;br /&gt;value=True&lt;br /&gt;linevalue=0&lt;br /&gt;i=0&lt;br /&gt;isurai=True&lt;br /&gt;for line in range(0,len(E)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print E[line].strip()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = re.compile(r&#39;\d&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if p.match(E[line].replace(&#39;.&#39;,&#39;&#39;)) and E[line].replace(&#39;.&#39;,&#39;&#39;).find(str(startcount))!=-1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[line],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print E[line+1],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print E[line+2],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not isurai:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(1,10,2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if E[line+1+i]==&#39;\n&#39;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if E[line+2+i].startswith(&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print line,&#39;a&#39;,i,i+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[line+1+i].replace(&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;,&#39;&#39;).replace(&#39;\n&#39;,&#39;&#39;)+E[line+2+i].replace(&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;,&#39;&#39;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print line,i,i+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[line+i+1].replace(&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;,&#39;&#39;).replace(&#39;\n&#39;,&#39;&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[line+i+2].replace(&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;,&#39;&#39;).replace(&#39;\n&#39;,&#39;&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if i&lt;4: p=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print &#39;iiiiiiiiii&#39;,i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; startcount=startcount+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; isurai=False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;\n&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printline=&#39;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printline1=&#39;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if i==9 or i==5:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; isurai=True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for j in range(i,150):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if p.match(E[line+j].replace(&#39;.&#39;,&#39;&#39;)) and E[line+j].replace(&#39;.&#39;,&#39;&#39;).find(str(startcount))!=-1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #if p.match(E[line+j]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printline1=E[line+j+1].replace(&#39;&amp;nbsp;&#39;,&#39;&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #else:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printline=printline+&#39; &#39;+E[line+j].replace(&#39;\n&#39;,&#39; &#39;).replace(&#39;&amp;nbsp;&#39;,&#39;&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print printline.strip(),&#39;\n\n&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print printline1.strip(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i=0&lt;/4:&gt;&lt;/blockquote&gt;&lt;br /&gt;After this need to check manually the missing the poems are content, also check the poem numbers. Because it is manually typed and not proof read, poem numbers are not in order. I had to manually change that re run the script everytime. &lt;br /&gt;&lt;br /&gt;Another manual work is to separate the sub headings from the explanations. Now the code to convert the txt to html format along with table of contents. &lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;A=open(&#39;file.txt&#39;)&lt;br /&gt;E=A.readlines()&lt;br /&gt;A.close()&lt;br /&gt;startcount=4740&lt;br /&gt;print &quot;&quot;&quot;&lt;br /&gt;&lt;html&gt;&lt;/html&gt;&lt;br /&gt;&lt;br /&gt;&lt;body&gt;&lt;/body&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; style=&quot;width: 100%px;&quot;&gt;&lt;/table&gt;&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;co=[]&lt;br /&gt;for e in range(0,len(E)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if E[e].find(&#39;\t&#39;)!=-1 and E[e].find(&#39;(&#39;)==-1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if E[e].find(&#39;.&#39;)!=-1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39; &lt;tr&gt;&lt;td align=&quot;center&quot; id=&quot;padalam_&#39;+E[e].strip()+&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[e]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39; &lt;tr&gt;&lt;td&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[e+2]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cc=&#39;&lt;a href=&quot;http://draft.blogger.com/blogger.g?blogID=4073546017384129072#padalam_%27+E[e].strip()+%27&quot;&gt;&#39;+E[e].strip()+&#39;&lt;/a&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; co.append(cc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39; &lt;tr&gt;&lt;td align=&quot;center&quot; id=&quot;padalam_sub_&#39;+E[e].strip()+&#39;&quot;&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[e]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cc=&#39;&lt;a href=&quot;http://draft.blogger.com/blogger.g?blogID=4073546017384129072#padalam_sub_%27+E[e].strip()+%27&quot;&gt;&#39;+E[e].strip()+&#39;&lt;/a&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; co.append(cc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = re.compile(r&#39;\d&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #if p.match(E[e].replace(&#39;.&#39;,&#39;&#39;)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[e]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print E[e].replace(&#39;.&#39;,&#39;&#39;).find(str(startcount))!=-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if p.match(E[e].replace(&#39;.&#39;,&#39;&#39;)) and E[e].replace(&#39;.&#39;,&#39;&#39;).find(str(startcount))!=-1:# :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print &#39;-----------&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39; &lt;tr align=&quot;center&quot; id=&quot;songandcontent_&#39;+str(startcount)+&#39;&quot;&gt;&#39;&lt;/tr&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;td&gt;&#39;&lt;/td&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;table&gt;&#39;&lt;/table&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39; &lt;tr&gt;&#39;&lt;/tr&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;td id=&quot;songno_&#39;+str(startcount)+&#39;&quot; valign=&quot;top&quot;&gt;&#39;&lt;/td&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[e]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;/blockquote&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;td align=&quot;left&quot; id=&quot;song_&#39;+str(startcount)+&#39;&quot;&gt;&#39;&lt;/td&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(1,20):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if E[e+i]!=&#39;\n&#39;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[e+i]+&#39;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39; &lt;tr&gt;&#39;&lt;/tr&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;td id=&quot;content_&#39;+str(startcount)+&#39;&quot;&gt;&#39;&lt;/td&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if E[e+i+1].find(&#39;\t&#39;)==-1 and len(E[e+i+1])&lt;250: p=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print len(E[e+i+1])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print E[e+i+1]+&#39;&lt;br /&gt;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&lt;/250:&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print &#39; &lt;tr&gt;&#39;&lt;/tr&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; startcount=startcount+1&lt;br /&gt;print &quot;&quot;&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;tr&gt;&lt;/tr&gt;&lt;br /&gt;&lt;td&gt;&lt;/td&gt;&lt;br /&gt;&lt;table align=&quot;center&quot;&gt;&lt;/table&gt;&lt;br /&gt;&lt;tr&gt;&lt;/tr&gt;&lt;br /&gt;&lt;td&gt;&lt;/td&gt;&lt;br /&gt;&quot;&quot;&quot;&lt;br /&gt;for cc in co:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(cc)&amp;gt;28:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if cc.find(&#39;padalam_sub_&#39;)!=-1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;,cc,&#39;&lt;br /&gt;&#39;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &#39;&lt;br /&gt;&#39;,cc,&#39;&lt;br /&gt;&lt;br /&gt;&#39;&lt;br /&gt;print &quot;&quot;&quot;&lt;br /&gt;&lt;td&gt;&lt;/td&gt;&lt;br /&gt;&lt;tr&gt;&lt;/tr&gt;&lt;br /&gt;&lt;table&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&quot;&quot;&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;print &quot;&quot;&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;&quot;&quot;Final manual work is move the TOC from bottom to top. Just cut and paste. All done. &lt;br /&gt;&lt;br /&gt;Used python libs, &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;requests:%20HTTP%20for%20Humans&quot;&gt;Requests: HTTP for Humans&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.crummy.com/software/BeautifulSoup/&quot; target=&quot;_blank&quot;&gt;Beautiful Soup&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Find the formatted html in my public dropbox folder,&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.dropbox.com/sh/yy9lq619z299fp5/zqZuKIF74H&quot;&gt;https://www.dropbox.com/sh/yy9lq619z299fp5/zqZuKIF74H&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download the file names contain _formatted&lt;br /&gt;&lt;a href=&quot;http://draft.blogger.com/goog_287902904&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href=&quot;https://www.dropbox.com/sh/yy9lq619z299fp5/dAuP0o-KGF/arayanya_formatted.html&quot;&gt;https://www.dropbox.com/sh/yy9lq619z299fp5/dAuP0o-KGF/arayanya_formatted.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.dropbox.com/sh/yy9lq619z299fp5/RkzrW3EiE3/ayodhya_formatted.html&quot;&gt;https://www.dropbox.com/sh/yy9lq619z299fp5/RkzrW3EiE3/ayodhya_formatted.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.dropbox.com/sh/yy9lq619z299fp5/hzZvSIdNzn/kikinada_formatted.html&quot;&gt;https://www.dropbox.com/sh/yy9lq619z299fp5/hzZvSIdNzn/kikinada_formatted.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://www.dropbox.com/sh/yy9lq619z299fp5/aD_91lnW90/sundra_formatted.html&quot;&gt;https://www.dropbox.com/sh/yy9lq619z299fp5/aD_91lnW90/sundra_formatted.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the 7 chapters only four chapters are converted. Need to convert remaining three chapters. Hoping to finish that work in coming week. </content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/7702903735832553441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2013/06/code-for-converting-tamil-virtual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/7702903735832553441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/7702903735832553441'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2013/06/code-for-converting-tamil-virtual.html' title='Code for converting Tamil Virtual University&#39;s Kamabaramayanam into E book format'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-5238670934665548601</id><published>2013-06-06T19:57:00.002+05:30</published><updated>2013-06-06T19:57:31.059+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="BDD"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="WebDriver"/><title type='text'>Automation vs Product Code - What is the difference?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;span style=&quot;font-family: Verdana,sans-serif;&quot;&gt;What are you doing? Do you write code? &lt;br /&gt;&lt;br /&gt;That would be one of questions faced by testers who write automation code/script. What is difference? &lt;br /&gt;&lt;br /&gt;well, a simple explanation would be automation is interaction between browser, that wont help because most of things a tester uses is based on interaction between two systems. So that what is the difference? Why it is so hard for automation code to run?&lt;br /&gt;&lt;br /&gt;Automation code needs 100% code coverage. In other words, each line should work or not to break the flow of the test script. If that happens automation tests become brittle. Compare to product code, coverage is less that 100%. There are figures about 30%,40%&amp;nbsp; or 80% etc but it always below 100%. &lt;br /&gt;&lt;br /&gt;When traditional method of coding is applied to automation, result is endless writing-rewriting of automation scripts. Automation testers end up in a state where they work hard, then work harder but there is no output or useful work is done leading to the conclusion that automation is not going to work. &lt;br /&gt;&lt;br /&gt;Another difference is how automation handle the changes in the UI? When there is change in the UI that particular change needs to be handled in the script otherwise test would fail. The question is how product teams handle these kind of changes? If we analyze that, then it is clear that traditional model of code should be applied here too. By separating the UI handles and script flow. (Clue- MVC)&lt;br /&gt;&lt;br /&gt;So, we end up using traditional model where we shouldn&#39;t using and should use a model that can be easily modified without causing too much trouble. &lt;br /&gt;&lt;br /&gt;In &lt;a href=&quot;http://en.wikipedia.org/wiki/Tirukku%E1%B9%9Ba%E1%B8%B7&quot; target=&quot;_blank&quot;&gt;Tirukkural&lt;/a&gt; , one of oldest books of law, it says that, (my translation)&lt;br /&gt;&lt;br /&gt;Doing what shouldn&#39;t be done brings bad results&lt;br /&gt;Not doing what should be done brings bad results&lt;br /&gt;&lt;br /&gt;There are people tried to solve this dilemma using methods such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Behavior-driven_development&quot; target=&quot;_blank&quot;&gt;BDD&lt;/a&gt; or Acceptance testing tools such as fit or Selenese. &lt;br /&gt;&lt;br /&gt;Even though, BDD itself is mainly used for product coding, but it fits easily in automation testing. Instead of writing scripts or lines of code, automation testers will write the flow, that will be executed via a framework or by other means. That flow can be understood by developers, marketing people etc. &lt;br /&gt;&lt;br /&gt;Apart from using BDD, separating code and ui selectors can make the tests more stable. One can go one step further even separate the data in code too, so code flow, data used for testing, ui element selectors will be in separate places making very easy to write tests, find why tests are brittle. This is needed because by simply using BDD alone can&#39;t make the life easier for the testers.&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/5238670934665548601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2013/06/automation-vs-product-code-what-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5238670934665548601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5238670934665548601'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2013/06/automation-vs-product-code-what-is.html' title='Automation vs Product Code - What is the difference?'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-2688556458149373627</id><published>2013-03-18T17:37:00.002+05:30</published><updated>2013-03-18T17:37:59.257+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="WebDriver"/><title type='text'>Learning Selenium/WebDriver</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Recently, I am facing a question lot of times.&lt;br /&gt;&lt;br /&gt;How do I learn Selenium/Webdriver?&lt;br /&gt;&lt;br /&gt;That question is asked by my friends, friends of friends, co-workers who wanted to learn Selenium but couldn&#39;t know where to start. I tell them, that is easy, go to youtube.com, search for webdriver talks in Google Tech Talks, Google Test Automation Conf, Selenium Conf etc, you will find videos,presentations by creators of Selenium.&lt;br /&gt;&lt;br /&gt;After repeating this lot of times, I thought, Ok let put those video links some where and send it to them. Because lot of them dont know who created Webdriver or commiters to Webdriver. So here are the links. I will keep updating this whenever I found time or new things.&lt;br /&gt;&lt;br /&gt;First, Selenium IDE from SeleniumConf&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/9EI7AIJlDp8?feature=player_embedded&#39; frameborder=&#39;0&#39; /&gt;&lt;/div&gt;&lt;br /&gt;GTAC 2011: WebDriver &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/OsNkcUq0veI?feature=player_embedded&#39; frameborder=&#39;0&#39; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Automating Your Browser Based Testing Using WebDriver&amp;nbsp; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/lfIzRHNXQhM?feature=player_embedded&#39; frameborder=&#39;0&#39; /&gt;&lt;/div&gt;&lt;br /&gt;Se Builder&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/Yv4wkSYnaeU?feature=player_embedded&#39; frameborder=&#39;0&#39; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Web performance testing using Webdriver&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/muz47xeugos?feature=player_embedded&#39; frameborder=&#39;0&#39; /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Apart from those sources, you can also look into these places to find Selenium related things.&lt;br /&gt;&lt;br /&gt;Selenium Officical HQ &lt;a href=&quot;http://seleniumhq.org/&quot;&gt;http://seleniumhq.org/&lt;/a&gt;&lt;br /&gt;Selenium Blog &lt;a href=&quot;http://seleniumhq.wordpress.com/&quot;&gt;http://seleniumhq.wordpress.com/&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/2688556458149373627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2013/03/learning-seleniumwebdriver.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/2688556458149373627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/2688556458149373627'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2013/03/learning-seleniumwebdriver.html' title='Learning Selenium/WebDriver'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-6403505717686906800</id><published>2012-07-15T22:25:00.000+05:30</published><updated>2012-07-15T22:25:12.770+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Benubird"/><category scheme="http://www.blogger.com/atom/ns#" term="PDF"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="Tools"/><title type='text'>Managing PDF/Documents using Benubird PDF</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Having the books, presentations, articles in PDF is the best way to read and use it across platforms. However, if you have more than thousands of them, then it is difficult to manage. Here my account of my efforts to find a way on my own and how I stumbled upon a good product to manage it.&lt;br /&gt;&lt;br /&gt;When I started to use PDF books few years ago, at that time, with few files organizing into folders was easy. Then &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_Desktop&quot; target=&quot;_blank&quot;&gt;Google Desktop&lt;/a&gt; came, that made life easy. But that has other issues such as re-indexing when moving folders/system and of course the security vulnerabilities. So, I decided to go for a primitive solution. Have the name, title, author, description and location of PDFs in a spreadsheet. I made some tinkering so that I can open a pdf from spreadsheet. This too has some issues. If I send the file to someone else they also have to do this.&lt;br /&gt;&lt;br /&gt;Ideal solution is to have those properties in the PDF so that extracting, sorting etc would be easier. Alas, it took long time for me to realize. So, how to do that? First, to know, how many files have those properties?&lt;br /&gt;&lt;br /&gt; I started to search for python PDF packages and found &lt;a href=&quot;http://pybrary.net/pyPdf/&quot; target=&quot;_blank&quot;&gt;pyPDF&lt;/a&gt; is good in extracting information from PDFs. But if the PDF size is more than 15MB then it hangs. Apart from that, edit the property of the PDF is only possible by creating a new PDF with those properties and content. This means I will end in duplicate files and need to check those files manually before deleting them. I&#39;ve tried other tools too but it is same thing. Even the famous &lt;a href=&quot;http://www.sno.phy.queensu.ca/%7Ephil/exiftool/&quot; target=&quot;_blank&quot;&gt;ExifTool &lt;/a&gt;is also creates new file.&lt;br /&gt;&lt;br /&gt;So next thing is search for pdf manager. First hit is &lt;a href=&quot;http://www.mendeley.com/&quot; target=&quot;_blank&quot;&gt;Mendeley&lt;/a&gt;. Actually it is managing your research papers, make the citations easy not for other purposes. So, it doesnt have any option is edit to title in PDF. You can only edit that in Mendeley not outside of it. That is not I am looking for but coming&amp;nbsp; close.&lt;br /&gt;&lt;br /&gt;Next, searching &lt;a href=&quot;http://alternativeto.net/software/mendeley/&quot; target=&quot;_blank&quot;&gt;alternatives for Mendeley&lt;/a&gt;. After reviewing few apps, found &lt;a href=&quot;http://www.debenu.com/products/desktop/debenu-pdf-benubird&quot; target=&quot;_blank&quot;&gt;Benubird PDF&lt;/a&gt;. To my surprise, it offers easy editing of PDF properties and this app will write that to PDF. But dont try this with PDF opened in Acrobat. Benubird will overwrite the pdf leaving only one page. Ideally that throw a warning but it is okie as of now. It has other nice features as watched folders, smart lists, lists etc. UI shows Filename, title, author, Subject, tags size, type, path etc. &lt;br /&gt;&lt;br /&gt;I have transferred all of my spreadsheet data to PDFs via Benubird. Hope that it will work fine.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Other links if you want to check&lt;br /&gt;&lt;a href=&quot;http://www.unixuser.org/%7Eeuske/python/pdfminer/index.html&quot; target=&quot;_blank&quot;&gt;PDFMiner &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://code.google.com/p/pdfrw/&quot; target=&quot;_blank&quot;&gt;pdfrw&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/timuralp/pdflib&quot; target=&quot;_blank&quot;&gt;pdflib&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/6403505717686906800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2012/07/managing-pdfdocuments-using-benubird-pdf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/6403505717686906800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/6403505717686906800'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2012/07/managing-pdfdocuments-using-benubird-pdf.html' title='Managing PDF/Documents using Benubird PDF'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-2280655949466167129</id><published>2012-04-23T20:16:00.001+05:30</published><updated>2012-07-15T22:26:05.221+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="Code Snippet"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="Tools"/><category scheme="http://www.blogger.com/atom/ns#" term="WebDriver"/><title type='text'>Logging Selenium WebDriver</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;With Selenium Webdriver version 2.15.0 logging is enabled to help the debugging. By default logging is enabled. Just add a logger to get the logs.  &lt;br /&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;Setting log level is also easy. Set in the logger or use this code&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;((RemoteWebDriver) driver).setLogLevel(ALL);&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;As this helps in debugging however, in latest version there is a change in the log output. In 2.15 out put is shown below,&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;Jan 13, 2012 5:42:00 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [null, newSession {&quot;desiredCapabilities&quot;:&quot;Capabilities [{platform=WINDOWS, ensureCleanSession=true, browserName=internet explorer, version=}]&quot;}]&lt;br /&gt;Jan 13, 2012 5:42:16 AM org.apache.http.impl.client.DefaultRequestDirector tryExecute&lt;br /&gt;INFO: I/O exception (java.net.SocketException) caught when processing request: Software caused connection abort: recv failed&lt;br /&gt;Jan 13, 2012 5:42:16 AM org.apache.http.impl.client.DefaultRequestDirector tryExecute&lt;br /&gt;INFO: Retrying request&lt;br /&gt;Jan 13, 2012 5:42:16 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, implicitlyWait {&quot;ms&quot;:300000}]&lt;br /&gt;Jan 13, 2012 5:42:17 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, get {&quot;url&quot;:&quot;&lt;a href=&quot;https://test.com/&quot;&gt;https://test.com/&lt;/a&gt;&quot;}]&lt;br /&gt;Jan 13, 2012 5:42:54 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, getCurrentWindowHandle {}]&lt;br /&gt;Jan 13, 2012 5:42:54 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, getCurrentWindowHandle {}]&lt;br /&gt;353b31e2-046e-403f-96da-4f520163d341&lt;br /&gt;Jan 13, 2012 5:42:54 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, switchToFrame {&quot;id&quot;:0}]&lt;br /&gt;Jan 13, 2012 5:42:54 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, findElement {&quot;using&quot;:&quot;name&quot;,&quot;value&quot;:&quot;a&quot;}]&lt;br /&gt;Jan 13, 2012 5:43:18 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, findElement {&quot;using&quot;:&quot;name&quot;,&quot;value&quot;:&quot;b&quot;}]&lt;br /&gt;Jan 13, 2012 5:43:18 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, sendKeysToElement {&quot;id&quot;:&quot;e9a6a8d3-301f-49a7-85fc-977f35414095&quot;,&quot;value&quot;:[&quot;test&quot;]}]&lt;br /&gt;Jan 13, 2012 5:43:30 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, findElement {&quot;using&quot;:&quot;name&quot;,&quot;value&quot;:&quot;p&quot;}]&lt;br /&gt;Jan 13, 2012 5:43:33 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, sendKeysToElement {&quot;id&quot;:&quot;c9373957-5fcd-4a63-999f-bf54fa1cc9fd&quot;,&quot;value&quot;:[&quot;test&quot;]}]&lt;br /&gt;Jan 13, 2012 5:43:40 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, submitElement {&quot;id&quot;:&quot;c9373957-5fcd-4a63-999f-bf54fa1cc9fd&quot;}]&lt;br /&gt;Jan 13, 2012 5:43:59 AM org.openqa.selenium.remote.RemoteWebDriver execute&lt;br /&gt;INFO: Executing: [e36c6b06-ab81-4daf-b99a-1af8cbc138cd, switchToWindow {&quot;name&quot;:&quot;353b31e2-046e-403f-96da-4f520163d341&quot;}] &lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;However, in 2.20 the output is like this,&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;Apr 6, 2012 12:17:02 PM java.util.logging.LogManager$RootLogger log&lt;br /&gt;INFO: Logging of firefox driver is enabled&lt;br /&gt;Apr 6, 2012 12:17:02 PM java.util.logging.LogManager$RootLogger log&lt;br /&gt;INFO: Logging of firefox driver is enabled&lt;br /&gt;Tabsv2.conf&lt;br /&gt;Apr 6, 2012 12:17:02 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: get&lt;br /&gt;Apr 6, 2012 12:17:02 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: getCurrentWindowHandle&lt;br /&gt;Apr 6, 2012 12:17:04 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: getCurrentWindowHandle&lt;br /&gt;{339289c1-afc6-4352-8ba5-b8e5f5c9997c}&lt;br /&gt;Apr 6, 2012 12:17:04 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: switchToFrame&lt;br /&gt;Apr 6, 2012 12:17:04 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: findElement&lt;br /&gt;Apr 6, 2012 12:17:04 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: findElement&lt;br /&gt;Apr 6, 2012 12:17:04 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: sendKeysToElement&lt;br /&gt;Apr 6, 2012 12:17:04 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: findElement&lt;br /&gt;Apr 6, 2012 12:17:04 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: sendKeysToElement&lt;br /&gt;Apr 6, 2012 12:17:05 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: submitElement&lt;br /&gt;Apr 6, 2012 12:17:05 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: switchToWindow&lt;br /&gt;Apr 6, 2012 12:17:05 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: get&lt;br /&gt;Apr 6, 2012 12:17:13 PM org.openqa.selenium.remote.RemoteWebDriver log&lt;br /&gt;FINE: Executing: getCurrentWindowHandle&lt;br /&gt;{339289c1-afc6-4352-8ba5-b8e5f5c9997c}  &lt;/div&gt;&lt;/blockquote&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;Notice the difference. Earlier, what the value is passed and what is the text to be typed all printed in the  logs. Now, it was changed.  &lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Why? Because they implementation is changed. Earlier this code is used to print the logs in &lt;a href=&quot;http://code.google.com/p/selenium/source/browse/trunk/java/client/src/org/openqa/selenium/remote/RemoteWebDriver.java&quot; target=&quot;_blank&quot;&gt;RemoteWebDriver.java&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre class=&quot;western&quot;&gt;try {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; log(sessionId, command.toString(), command, When.BEFORE);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; response = executor.execute(command);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (response == null) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; log(sessionId, command.toString (), command, When.AFTER);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;/blockquote&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;Now, it changed to like this,&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre class=&quot;western&quot;&gt;try {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; log(sessionId, command.getName(), command, When.BEFORE);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; response = executor.execute(command);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (response == null) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; log(sessionId, command.getName(), command, When.AFTER);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/pre&gt;&lt;/blockquote&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;So, I changed those lines in source, complied and replaced in the jar file Now, the logs look like as in 2.15.0&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;Happy Testing.  &lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0in;&quot;&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/2280655949466167129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2012/04/logging-selenium-webdriver.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/2280655949466167129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/2280655949466167129'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2012/04/logging-selenium-webdriver.html' title='Logging Selenium WebDriver'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-1026475219175694690</id><published>2012-03-08T07:56:00.002+05:30</published><updated>2012-03-08T07:56:36.137+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="WebDriver"/><title type='text'>Locate anything with jQuery in Selenium</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;One of major issues of automation of XHTML or Ajax based pages is locating the elements which dont have id/name. There is no need for the developers to put them in that way or testers can&#39;t go and enforce id/name for all the elements.&lt;br /&gt;&lt;br /&gt;First shortcut testers take is XPath locators. Yes, that is easy and can work in any browser, but the pitfall is fragility. A addition of row in that page can make the XPath locator to brake. This issue can be solved by using jQuery&#39;s :has and :contains options.&lt;br /&gt;&lt;br /&gt;Let see an example,&lt;br /&gt;&lt;br /&gt;See the below screenshot,&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-rPMkBGaccpg/T1gTu4FbRZI/AAAAAAAAFqQ/2N-8b8l6Mx8/s1600/bloghtml.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;113&quot; src=&quot;http://1.bp.blogspot.com/-rPMkBGaccpg/T1gTu4FbRZI/AAAAAAAAFqQ/2N-8b8l6Mx8/s320/bloghtml.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Code for this html can be found here, http://pastebin.com/6ndmTDST&lt;br /&gt;&lt;br /&gt;In that, there is no id,name or any other CSS attribute to locate expect that input and a tag.&lt;br /&gt;&lt;br /&gt;What is the locator for locating first checkbox?&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;jQuery(&#39;:has(input):contains(&quot;AA&quot;):last input&#39;)&lt;/span&gt;&lt;/blockquote&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;Locator for EB in the first row if EB and 1EA both has value of EB like the below image?&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-92Dwujo3MYM/T1gVS2ZTDeI/AAAAAAAAFqY/zEVtJW5C2z0/s1600/bloghtml1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;101&quot; src=&quot;http://2.bp.blogspot.com/-92Dwujo3MYM/T1gVS2ZTDeI/AAAAAAAAFqY/zEVtJW5C2z0/s320/bloghtml1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;jQuery(&#39;:has(&lt;/span&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;:contains(&quot;EB&quot;)&lt;/span&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;):contains(&quot;AA&quot;):last :contains(&quot;EB&quot;):last&#39;)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;How it works?&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;:has locates all the elements which have the element we are looking for. Then, first :contains filters out the last td/tr/div/span in which both elements are located. This takes out the necessity of juggling with parent,child,adjacent calculations. Once we have the row, it is easy to filter the element we are looking for. &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;You can locate pretty much anything using these two combinations. Next time, if you think some locator can&#39;t located without going for XPath, think again.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;Now, comes the next question, &lt;/span&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;WebDriver&lt;/span&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt; aka&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;&lt;/span&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;Selenium 2 doesn&#39;t support jQuery. It only support CSS selectors. How can I use these locators in Selenium? Well, you can inject jQuery into the page using JavaScript executor method. Code for the same can be found &lt;a href=&quot;https://www.google.co.in/search?q=jquery+in+webdriver&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:official&amp;amp;client=firefox-a#hl=en&amp;amp;safe=off&amp;amp;client=firefox-a&amp;amp;hs=uU9&amp;amp;rls=org.mozilla:en-US%3Aofficial&amp;amp;sclient=psy-ab&amp;amp;q=inject+jquery+in+webdriver&amp;amp;oq=inject+jquery+in+webdriver&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;gs_sm=3&amp;amp;gs_upl=13076l14522l0l14739l7l7l0l0l0l4l546l2004l2-2.1.1.1l5l0&amp;amp;gs_l=serp.3...13076l14522l0l14740l7l7l0l0l0l4l546l2004l2-2j1j1j1l5l0&amp;amp;pbx=1&amp;amp;bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&amp;amp;fp=43acf505fc8c6e21&amp;amp;biw=1366&amp;amp;bih=680&quot; target=&quot;_blank&quot;&gt;elsewhere&lt;/a&gt; or look at the Selenium/WebDriver users list.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;Note: You&#39;ll notice that, there is no jQuery in the HTML code. I used &lt;a href=&quot;http://firequery.binaryage.com/&quot; target=&quot;_blank&quot;&gt;FireQuery&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;objectBox objectBox-text &quot; role=&quot;presentation&quot;&gt;Happy Automated Testing.&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/1026475219175694690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2012/03/locate-anything-with-jquery-in-selenium.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/1026475219175694690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/1026475219175694690'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2012/03/locate-anything-with-jquery-in-selenium.html' title='Locate anything with jQuery in Selenium'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-rPMkBGaccpg/T1gTu4FbRZI/AAAAAAAAFqQ/2N-8b8l6Mx8/s72-c/bloghtml.png" height="72" width="72"/><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-5700767647079625372</id><published>2012-03-01T18:20:00.001+05:30</published><updated>2012-03-01T18:20:35.427+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><title type='text'>Manual vs Automation : Grinder Analogy</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;If you&#39;re looking for info about Grinder automation framework, you&#39;re in wrong place. &lt;br /&gt;&lt;br /&gt;After having hard time to explain my colleagues and friends about how not to do automation, I came up with an analogy they can understand better. &lt;br /&gt;&lt;br /&gt;It is Grinder. Actually wet grinder, used to make wet flour from rice, from which idilis(Rice cakes) were made. Traditional Indian way of grinding the rice is using attu-kal(grinding stone) which consist of stone with hole and another cylindrical shape which will fit into the hole. Flour is made by rotating the top cylindrical stone.&lt;br /&gt;&lt;br /&gt;After electricity, people tried find a way to machine which does this. Of course, you can get the same flour from blade grinder or mixier grinders with out worrying about stone. But that is a different story. So solving this problem is quite difficult unless they figured out machine work shouldn&#39;t be an exact replication of manual work.&lt;i&gt; Then the solution is very simple, just rotate the bottom stone&lt;/i&gt;. Bingo.&lt;br /&gt;&lt;br /&gt;See the images below,&lt;br /&gt;&lt;br /&gt;Traditional bottom stone and top cylindrical stone&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/5/5f/Grinding_stone.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/5/5f/Grinding_stone.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Modern wet - grinder&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/1/1d/Wet_grinder.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/1/1d/Wet_grinder.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;we can see this in washing machines, blade grinders etc.Same applies to UI automation.&lt;br /&gt;&lt;br /&gt;When you&#39;re doing automation, don&#39;t start with the manual scripts or how you did that manually. That will not help in making the automation or showing high level of productivity. If automation delivers the same productivity then there no point in doing it.&lt;br /&gt;&lt;br /&gt;Just throw away the manual testing procedure, start afresh for automating your product. You&#39;ll see a sea change.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/5700767647079625372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2012/03/manual-vs-automation-grinder-analogy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5700767647079625372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5700767647079625372'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2012/03/manual-vs-automation-grinder-analogy.html' title='Manual vs Automation : Grinder Analogy'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-3902845726951808809</id><published>2012-01-11T22:42:00.000+05:30</published><updated>2012-01-11T22:42:45.214+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Companies"/><category scheme="http://www.blogger.com/atom/ns#" term="Corruption"/><category scheme="http://www.blogger.com/atom/ns#" term="general"/><category scheme="http://www.blogger.com/atom/ns#" term="Organization"/><title type='text'>Organization and Corruption</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Why companies fail? Why companies fail to innovate and becomes a footnote in history?&lt;br /&gt;&lt;br /&gt;Those are questions comes to my mind, when I read J Krishnamurthi&#39;s saying about corruption because being a part of a organization. His sayings can be summarized into organization and corruption is inseparable. An organization/institutions will corrupt by it own nature.&lt;br /&gt;&lt;br /&gt;There are umpteen examples for this. I can&#39;t remember a organization or company which is not corrupted. Here corruption = utterly broken. i.e not doing what it intended to do.&lt;br /&gt;&lt;br /&gt;I wondered, why this is happening? What is making the these group of people to do nutty things? Is it because they are mobs, Mob rule or herd behavior? All these theories say, there is some magic happen when people act collectively. I don&#39;t think, rational man will act irrationally when they form a group. But we see this all the time. So there is something happens when a mob formed.&lt;br /&gt;&lt;br /&gt;For me, that something is questioning, lack of it. It can also be said as these institutions lack democracy. Only difference between democracy and mob behavior is questioning. In democracy, people have right to question, in mob rule that is not there. All the authoritative, autocratic, non democratic regimes are corrupt because there is no checks, no questioning.&lt;br /&gt;&lt;br /&gt;Read the Monkey-Banana-Ice water story. Take from here, http://www.motivation-for-dreamers.com/never-assume.html. Please the whole article in that link.&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;br /&gt;Michael Michalko in the second edition of the book Thinkertoys, gives  a very interesting example of behaviour that is based on assumptions.  He asks the reader to imagine a cage containing five monkeys.  A banana  is then hung on a string inside the cage and a set of stairs placed in  the cage leading up to the banana. Whenever a monkey goes up the stairs  and grabs the banana, ice-cold water is poured on all the monkeys in the  cage. Very soon, as the monkeys begin to associate touching the banana  with being sprayed with ice-cold water they will try to prevent one  another from trying to get the banana. &lt;br /&gt;The cold water is  then turned off and one monkey removed from the cage and replaced with  another that doesn’t know anything about the cold water. This new monkey  will inevitably try to get the banana, but the other four monkeys will  attack him to stop him from doing so. &lt;br /&gt;If another of the old  monkeys is removed and replaced with a newcomer, this newcomer will try  to grab the banana. The previous newcomer will gladly take part in  beating him up together with the other monkeys in order to prevent him  from climbing the stairs to the banana. &lt;br /&gt;Slowly, all the original  monkey can be replaced with new monkeys in this manner. The cage will  now be totally filled with monkeys that know nothing about the ice-cold  water, but they will all not try to get the banana and continue to  attack any monkey that tries to do so. “No monkey ever again approaches  the stairs. Why Not? Because as far as they know, that’s the way it’s  always been around here. Don’t be a monkey. Challenge all assumptions.”  These are Michalko’s words of advice. &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Is institutions fail because they are not democratic? I think, they are. &lt;br /&gt;&lt;br /&gt;Democracy means active participation in decision making. People dont be mute spectators if something goes wrong.&amp;nbsp; But in organizations? If you disagree with your boss, you quit. Simple solution, isn&#39;t it? One may ask, what if boss and I had differences but not to the point of quitting the company. Understanding the difference between election and revolution will add some clarity. &lt;br /&gt;&lt;br /&gt;Election gives formal right to say what one thinks about that administration/Govt.It happens in correct intervals. People presented with a choice.&lt;br /&gt;&lt;br /&gt;Revolution is some thing like a extreme step of quitting the company. You run out of all the options so you take the extreme step of agitating, protesting most of time violently and bring a change. &lt;br /&gt;&lt;br /&gt;In all circumstances, I like the first option. If companies give the right to the employee to say in company matters by some process, then it is hard for the company to ignore the issues. In reality, most of the participation in decision making done by whistle blowing or speaking up. How many people will brave for it? Lot people wont take that road. They simply quit, move to another company and same story repeats endlessly.&lt;br /&gt;&lt;br /&gt;There are exceptions to this common phenomena. Companies led by a visionary wont suffer by lack of questioning. But those are rare exceptions.&lt;br /&gt;&lt;br /&gt;Now comes the implementation. How to make companies democratic?. I will try to answer that in another post. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/3902845726951808809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2012/01/organization-and-corruption.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/3902845726951808809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/3902845726951808809'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2012/01/organization-and-corruption.html' title='Organization and Corruption'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-7578917175977544571</id><published>2012-01-05T12:26:00.000+05:30</published><updated>2012-01-05T12:26:12.029+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Addons"/><category scheme="http://www.blogger.com/atom/ns#" term="Ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="Firebug"/><category scheme="http://www.blogger.com/atom/ns#" term="Firefox"/><category scheme="http://www.blogger.com/atom/ns#" term="NetExport"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><title type='text'>WebSite Performance data using Selenium</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I wanted to export the Firebug&#39;s HTTP Traffic data shown in the Net panel if I crawl the page using Selenium . Why Selenium? There are other alternatives to get that data. However, I have two reasons for this approach.&lt;br /&gt;&lt;br /&gt;1. I wanted to know what data from which URL. This will combine the data with URL. i.e. seeing what user will see. It is easier to debug instead of just seeing the requests.&lt;br /&gt;2. Data from Firebug is better then alternatives.&lt;br /&gt;&lt;br /&gt;It is easy to see that manually. How to automate that? By using &lt;a href=&quot;http://www.softwareishard.com/blog/netexport/&quot;&gt;NetExport&lt;/a&gt; Add-on by Jan Odvarko. It exports the data as &lt;a href=&quot;http://www.softwareishard.com/blog/har-12-spec/&quot; target=&quot;_blank&quot;&gt;HAR archive&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;How to get that working in Selenium WebDriver?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create a profile for WebDriver using firefox -P -no-remote.Then, set the AutoExport option to true in Selenium. Below code does that&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;br /&gt;ProfilesIni allProfiles = new ProfilesIni();&lt;br /&gt;FirefoxProfile profile = allProfiles.getProfile(&quot;&amp;lt;ProfileName&amp;gt;&quot;);&lt;br /&gt; profile.setPreference(&quot;extensions.firebug.netexport.alwaysEnableAutoExport&quot;,&lt;br /&gt;driver = new FirefoxDriver(profile);&lt;/blockquote&gt;&lt;br /&gt;Now it will export the HTTP traffic data whenever the page is refreshed or new page loaded. Use &lt;a href=&quot;http://www.softwareishard.com/blog/har-viewer/&quot; target=&quot;_blank&quot;&gt;HARViewer&lt;/a&gt; to see the data.&lt;br /&gt;&lt;br /&gt;Now comes the tricky part. How to export the data for Ajax requests? I don&#39;t know. Netexport exports data, if and when page is reloaded. It can be done, if Selenium can execute the chrome functions. I&#39;m working on that. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/7578917175977544571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2012/01/website-performance-data-using-selenium.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/7578917175977544571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/7578917175977544571'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2012/01/website-performance-data-using-selenium.html' title='WebSite Performance data using Selenium'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-3654934817770130438</id><published>2011-12-28T16:59:00.000+05:30</published><updated>2011-12-28T16:59:11.601+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code Snippet"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>List files in a Directory-Pyton code</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;How to list the files along with path in python?&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;for root,dirs,files in os.walk(&#39;C:&#39;):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for file in files:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print root+&#39;\\&#39;+file&lt;/blockquote&gt;This will print the file name along with absolute path. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/3654934817770130438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/12/list-files-in-directory-pyton-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/3654934817770130438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/3654934817770130438'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/12/list-files-in-directory-pyton-code.html' title='List files in a Directory-Pyton code'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-4874921749841336719</id><published>2011-11-06T16:52:00.000+05:30</published><updated>2011-11-30T18:29:39.231+05:30</updated><title type='text'>Threading and UI test automation</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;If there is one thing that is the most difficult part of test automation is waiting for some action to finish then proceed. I am not talking about ajax/waiting for UI element, waiting for the AUT do something or waiting for some time to elapse. &lt;br /&gt;&lt;br /&gt;Most of the tools are use only sequential execution. I should say all, but I think there may some tool that has this feature. As this different from parallel or grid execution. Let me explain with steps,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Typical Test Script does the below functions,&lt;br /&gt;&lt;br /&gt;1. open a page&lt;br /&gt;2. Click something&lt;br /&gt;3. go to next Page&lt;br /&gt;4. do something&lt;br /&gt;5. check for something&lt;br /&gt;&lt;br /&gt;Above steps are perfectly good except when there is need to wait. See the below steps&lt;br /&gt;&lt;br /&gt;1. open a page&lt;br /&gt;2. Click something&lt;br /&gt;3. go to next Page&lt;br /&gt;4. do something&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt; Wait for sometime&amp;gt;&lt;br /&gt;5. check for something&lt;br /&gt;&lt;br /&gt;If the &amp;lt;wait for something&amp;gt; time to is few seconds or few minutes then no need to worry unless it affects the execution time significantly. &lt;br /&gt;&lt;br /&gt;What if that time is hours or day? &lt;br /&gt;How do I automate an app/webpage that needs periodic wait time?&lt;br /&gt;&lt;br /&gt;For ex, testing an Calender apps is a good example.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, what needs to be done the automation tools to work better?&lt;br /&gt;&lt;br /&gt;Programmers who reading would have shouted Threading/Concurrency. Yes, that is the obvious answer. Having a thread scheduler or task notifier will make this job easier. I am wondering, why this obvious things are not available in Test Automation tools? Why testers need to be satisfied with basic sequential execution? &lt;br /&gt;&lt;br /&gt;Yes, I can use the threading in API tools such as Selenium. This why I love API based tools rather than Record and Playback or off the shelf tools. See my previous post here Test Automation using Tool or API (http://vrajasankar.blogspot.com/2011/08/test-automation-using-tool-or-api.html)&lt;br /&gt;&lt;br /&gt;Further, this waiting for action can separated into two categories. &lt;br /&gt;&lt;br /&gt;1. Checking/waiting for outside action (nothing to do with UI)&lt;br /&gt;2. Checking/waiting for UI action. &lt;br /&gt;&lt;br /&gt;Examples for trying to check a action outside of the UI is check for mails, checking the values in DB, check if files are available etc. For this, actions can be checked in another thread while UI execution move next script thus speeding up the test execution.&lt;br /&gt;&lt;br /&gt;For the second option, either those actions can scheduled or another instance(head/headless) can be started to finish the test. &lt;br /&gt;&lt;br /&gt;I think, without this threading/concurrency capability it is not possible to automate the complex enterprise applications. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/4874921749841336719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/11/threading-and-ui-test-automation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/4874921749841336719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/4874921749841336719'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/11/threading-and-ui-test-automation.html' title='Threading and UI test automation'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-8300482271261558401</id><published>2011-09-27T09:59:00.000+05:30</published><updated>2011-09-27T09:59:04.093+05:30</updated><title type='text'>Productive Tester-I</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Long time ago I read Productive Programmer by &lt;a href=&quot;http://www.nealford.com/mybooks&quot;&gt;Neal Ford&lt;/a&gt;, after reading that I wondered what could be a book named Productive Tester consist of.&lt;br /&gt;&lt;br /&gt;Really? Is testing can be done like that?&lt;br /&gt;&lt;br /&gt;I am not interested in Software Test Cycle kind of plans, procedures, test scripts, etc to do testing. I am interested in how a small member team can test or do that testing without those fancy documents and million dollar products?&lt;br /&gt;&lt;br /&gt;I take IDE used by programmers for analogy. So, if IDE helps developers to create code in better way or just speed ups what could be the one for testers?&lt;br /&gt;&lt;br /&gt;One thing immediately comes to my mind is Log parsing and analysis. Log watcher by James Bach and Log parser utility by Microsoft. &lt;br /&gt;&lt;br /&gt;I will start posting my thoughts in the coming days in the series.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/8300482271261558401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/09/productive-tester-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/8300482271261558401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/8300482271261558401'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/09/productive-tester-i.html' title='Productive Tester-I'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-1253291579928509831</id><published>2011-08-29T17:44:00.003+05:30</published><updated>2011-08-29T17:44:55.223+05:30</updated><title type='text'>Test Automation using Tool or API</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This debate between Record-Playback&amp;nbsp; and Scripting is going for long. I have written about that too. Now, after Selenium 2 release, some people asked me, why should one needs a framework such as Selenium? Comments range from, &quot;it is hard to understand&quot;, &quot;can this be simple?&quot; or &quot;I want to get started in easy way&quot;.&lt;br /&gt;&lt;br /&gt;Those comments are seems to valid if you&#39;re not burned your finger in testing an enterprise app or writing automation code for thousands of tests. Because, only after automating 10 or 20 % of the cases, you&#39;ll come to know that, some actions can&#39;t be automated because there is no option in the tool to do that. Then, finding out that there is no way you can do that, will be an another big surprise.&lt;br /&gt;&lt;br /&gt;So, if we go in the Selenium way i.e the framework way, it is possible to do that? Yes. Because, as a Framework, it doesn&#39;t try to predict the permutations or combinations for all the test automation scenarios.&lt;br /&gt;&lt;br /&gt;There are lot ways, I want to test my application. I may use, keyword driven testing, data driven testing or scenario driven testing or some other driven testing. I may want my tests developed in BDD or do a acceptance testing. So can one tool/software give the options for all? It will actually make the product bloated.&lt;br /&gt;&lt;br /&gt;Take the analogy of WYSIWYG editors for HTML. Ican write html in a text editor or use those editors to speed up the work(drag and drop). It offers the flexibility and best of both worlds. Same can be said to IDE for programming languages. If something doesn&#39;t work in IDE, you can edit the file using text editor. If that possible and good for developing software, why it is not good to do that in Test Automation?&lt;br /&gt;&lt;br /&gt;Another example is using BDD. I want to use BDD but I want to use it my way or extenstion of something I already used, not the way like Rspec or JBehave/easyb. So tying these wont work for me.&lt;br /&gt;&lt;br /&gt;Now, if we deduce, the issue is &quot;what to do&quot; is combined with &quot;how to do&quot; causing most of the issues in test automation rather than technical issues such locating the elements in the UI.&lt;br /&gt;&lt;br /&gt;Here,&lt;br /&gt;&lt;br /&gt;What do to= Actions done in the UI such as Click, Select etc&lt;br /&gt;&lt;br /&gt;How to do= Sequential use of the above actions&lt;br /&gt;&lt;br /&gt;Separating &quot;what to do&quot; and &quot;how to do&quot; will bring lot of benefits. I would like to add another example to emphasis the point. Catching the JavaScript errors is a valuable improvement in automation. If I can tweak the Click function or extend, so that, I can check for every click, is there any JavaScript errors.&lt;br /&gt;&lt;br /&gt;Here are the requirements for a ideal automation framework &lt;br /&gt;&lt;br /&gt;1. All actions should be available independently . No dependencies .&lt;br /&gt;&lt;br /&gt;2. Should only do UI actions. Operations such as I/O, connecting to DB should be written by users.&lt;br /&gt;&lt;br /&gt;3. Should be extensible.Adding a new action should be easier.&lt;br /&gt;&lt;br /&gt;4. Should use standard languages and standard methods to locate the elements. Ex. Java/Python to script. CSS/DOM/XPATH to locate the elements. No vendor scripts. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;5. Running the tests should be independent.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/1253291579928509831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/08/test-automation-using-tool-or-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/1253291579928509831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/1253291579928509831'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/08/test-automation-using-tool-or-api.html' title='Test Automation using Tool or API'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-7262687531914993118</id><published>2011-07-19T06:35:00.003+05:30</published><updated>2011-07-19T10:47:59.179+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><title type='text'>Selenium and Waiting for Ajax</title><content type='html'>Keith Sterling posted a post, how to avoid Thread.sleep in automation code in&lt;span class=&quot;gD&quot; style=&quot;color: #5b1094;&quot;&gt;&amp;nbsp;&lt;a href=&quot;http://blog.magneticreason.com/?p=230&quot;&gt;Selenium Smells&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class=&quot;gD&quot; style=&quot;color: #5b1094;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Once of the biggest issues I see with people new to Selenium ( or any  number of the other web automation tools ) is the liberal scattering of  Thread.sleep(xxx) through out the code. This should be considered a bad  smell introducing timing specific code into your script. &lt;/blockquote&gt;As this waiting for a element is one of biggest headaches in automation, I thought, I should share my experience. &lt;br /&gt;&lt;br /&gt;In Sizzle.js(of jQuery), there is simple code snippet to check if there is an element present&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$(window.document).find(&#39;&lt;b&gt;locator&lt;/b&gt;&#39;).length&amp;gt;0&lt;/blockquote&gt;&lt;br /&gt;In ajax, the element may be there, but it is may not be visible to the users. So, checking for length alone wont do. For that, checking for visibility will do.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;$(window.document).find(&#39;locator&#39;).is(&#39;:visible&#39;)&lt;/blockquote&gt;Call these two snippets in the waitforcondition and see the magic. Selenium can automate any ajax or dynamic element actions.&lt;br /&gt;&lt;br /&gt;These tricks for only Selenium 1.0. I think, in Se2, these issues may not be there. I need to check and confirm this. </content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/7262687531914993118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/07/selenium-and-waiting-for-ajax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/7262687531914993118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/7262687531914993118'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/07/selenium-and-waiting-for-ajax.html' title='Selenium and Waiting for Ajax'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-6012254633828750815</id><published>2011-06-08T15:22:00.000+05:30</published><updated>2011-06-08T15:22:09.982+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="IPv6"/><title type='text'>IPv6 Day</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Today is IPv6 Day.&lt;br /&gt;&lt;br /&gt;Check the official site http://www.worldipv6day.org/&lt;br /&gt;&lt;br /&gt;Also run this test to check if your org is ready for IPv6 change, http://test-ipv6.com/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/6012254633828750815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/06/ipv6-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/6012254633828750815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/6012254633828750815'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/06/ipv6-day.html' title='IPv6 Day'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-8895711591734414498</id><published>2011-06-01T12:31:00.000+05:30</published><updated>2011-06-01T12:31:28.485+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Addons"/><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="Firefox"/><title type='text'>Firefox Addon Collection for Test Automation</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I&#39;ve created the following collection for easy find and use. Hope it will help you also.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;https://addons.mozilla.org/en-US/firefox/collections/rajasankar/ui-test-automation/&lt;br /&gt;&lt;br /&gt;Another my collection for personal browsing, https://addons.mozilla.org/en-US/firefox/collections/rajasankar/personal-browsing/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/8895711591734414498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/06/firefox-addon-collection-for-test.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/8895711591734414498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/8895711591734414498'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/06/firefox-addon-collection-for-test.html' title='Firefox Addon Collection for Test Automation'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-194197082809689556</id><published>2011-05-14T19:55:00.001+05:30</published><updated>2011-05-14T19:55:19.891+05:30</updated><title type='text'>Transparency and Business</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I tried to catch up my unread blogs and read a blog by Seth Godin.&amp;#160; In &lt;a href=&quot;http://sethgodin.typepad.com/seths_blog/2011/04/why-you-might-be-in-favor-of-transparency.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+typepad%2Fsethsmainblog+%28Seth%27s+Blog%29&amp;amp;utm_content=Google+Reader&quot; target=&quot;_blank&quot;&gt;Why you might choose to be in favor of transparency&lt;/a&gt;, he made the case for how businesses can benefit from transparency. I would like to add some more points. &lt;/p&gt;  &lt;p&gt;Businesses take extra care for not leaking their business plans, that is the conventional view every body agrees. It is based this following argument, in a cut throat competition, knowing what the competitor going to do, can be a big advantage. I also had that view until I read Ricardo Semler’s &lt;a href=&quot;http://www.amazon.com/Maverick-Success-Behind-Unusual-Workplace/dp/0446670553&quot; target=&quot;_blank&quot;&gt;Maverick : The Success Story Behind the World&#39;s Most Unusual Workplace&lt;/a&gt;. Semler showed to world that if you keep your plans dynamic, knowing what they could do, can’t bring an advantage to the competitor. When competitor working on that plan, it could be changed in Semelr’s factories. Workers debate and update the plans every day, every week so there no static plan to rely on. &lt;/p&gt;  &lt;p&gt;Seems to be illogical, isn’t it? &lt;/p&gt;  &lt;p&gt;Think about open source code. Lot of people thought that by making the source code open, security will be compromised. It was proved otherwise. &lt;/p&gt;  &lt;p&gt;If we extend this argument as Godin did in that blog, Internet removed the these barriers and opened the flood gates of knowledge. Transparency always brings benefits.&amp;#160; &lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/194197082809689556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/05/transparency-and-business.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/194197082809689556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/194197082809689556'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/05/transparency-and-business.html' title='Transparency and Business'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-5165500525548119340</id><published>2011-05-08T20:16:00.001+05:30</published><updated>2011-05-08T20:16:25.254+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><title type='text'>Standard Scripting languages in Test Automation</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;By standard scripting languages, I mean, JavaScript, Python etc. To know more about how non standard scripting languages used in test automation, please read &lt;a href=&quot;http://www.stickyminds.com/sitewide.asp?ObjectId=2326&amp;amp;Function=edetail&amp;amp;ObjectType&quot; target=&quot;_blank&quot;&gt;Hey Vendors, Give Us Real Scripting Languages&lt;/a&gt; by Bret Pettichord. Even, though, it was written in 2001, the points made is still valid today. &lt;/p&gt;  &lt;p&gt;Another aspect is using the standard locators in UI element locators. Let me explain with one example. I had a OR condition in&amp;#160; the element locator. In non standard locators, I am forced use this following script&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Check if Element A is present&lt;/p&gt;    &lt;p&gt;if A is present click A&lt;/p&gt;    &lt;p&gt;else&lt;/p&gt;    &lt;p&gt;Click Element B&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Which means I need to make at least two calls to check if the particular element is present. &lt;/p&gt;  &lt;p&gt;Consider the multiple selector option and multiple attribute selector in jQuery, &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://api.jquery.com/multiple-selector/&quot; target=&quot;_blank&quot;&gt;Multiple Selector (“selector1, selector2, selectorN”)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://api.jquery.com/multiple-attribute-selector/&quot; target=&quot;_blank&quot;&gt;Multiple Attribute Selector [name=&amp;quot;value&amp;quot;][name2=&amp;quot;value2&amp;quot;]&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Click (Element A,Element B)&lt;/p&gt;  &lt;p&gt;If I can use the above selector formats, just one step is enough. Add to this how many lines I don’t need to type to check this. Instead of four lines, script will have only one line. I choose jQuery as example. Those formats are actually &lt;a href=&quot;http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier&quot; target=&quot;_blank&quot;&gt;CSS selectors&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Next time if you’re still using a old custom format for element locators, think about CSS.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/5165500525548119340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/05/standard-scripting-languages-in-test.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5165500525548119340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5165500525548119340'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/05/standard-scripting-languages-in-test.html' title='Standard Scripting languages in Test Automation'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-6394448146349542939</id><published>2011-04-28T07:42:00.001+05:30</published><updated>2011-04-28T07:42:01.243+05:30</updated><title type='text'>Software Estimation - Understanding</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;As I work in software testing using automation, giving a figure of how long it will take to finish something is hard. Sometimes the figures are correct, some times not. When I started reading about that, there some rules of thumb given. Get the time from developers, double it add a little bit is one of them. Other reason&amp;#160; is software developers work to create new knowledge. I have problem with these kind of maxims. &lt;/p&gt;  &lt;p&gt;If you think about this conclusion, software estimation is hard because it is work to create new knowledge, you would obviously need to ask what about other sectors, engineering disciplines are doing in this area. &lt;/p&gt;  &lt;p&gt;Is producing new cars is hard because they work to create new knowledge?&lt;/p&gt;  &lt;p&gt;Is inventing new drugs/medicines is hard because they work to create new knowledge?&lt;/p&gt;  &lt;p&gt;However, one can argue that, they are just one or two exceptions, others sectors are same. &lt;/p&gt;  &lt;p&gt;How about designing a new home?&amp;#160; &lt;/p&gt;  &lt;p&gt;How about exploring for oil? &lt;/p&gt;  &lt;p&gt;The point is, all kind of estimations are actually predictions. Even if it called as forecasting, it is still prediction about future. The problem is no one can predict what they don’t know. If they know, there is no need to predict it. &lt;/p&gt;  &lt;p&gt;Here is quote from my favorite author &lt;a href=&quot;http://www.fooledbyrandomness.com/&quot; target=&quot;_blank&quot;&gt;Nassim Nicholas Taleb&lt;/a&gt; in &lt;a href=&quot;http://www.amazon.com/Black-Swan-Impact-Highly-Improbable/dp/1400063515&quot; target=&quot;_blank&quot;&gt;Black Swan&lt;/a&gt;,&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Consider the wheel again. If you are a Stone Age historical thinker called on to predict the future in a comprehensive report for your chief tribal planner, you must project the invention of the wheel or you will miss pretty much all of the action. Now, if you can prophesy the invention of the wheel, you already know what a wheel looks like, and thus you already know how to build a wheel, so you are already on your way. The Black Swan needs to be predicted!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Read Black Swan about the highly improbable. &lt;/p&gt;  &lt;p&gt;Let us take another simple work. Delivering mails (not emails), packages, parcels to customers. There is no thinking involved in it, right? If it is so, why we have a tracking feature to know where is the package now. &lt;/p&gt;  &lt;p&gt;Coming back to where we started, if estimation is hard how do we know when the project/development will complete? &lt;/p&gt;  &lt;p&gt;The short answer is there is no fail proof method to know. &lt;/p&gt;  &lt;p&gt;The long answer is, we use what we know to know when approximately it will complete, keeping in mind that something may go for toss at any time. Use number of options such tracking the progress, following standards etc may solve the some of the issues. &lt;/p&gt;  &lt;p&gt;If you consider, software test estimation, the picture is gloomy. In developing software, the work is cut. You have basic understanding of what the end product will look. However, that is not possible in test estimation. I am not going for clichés here. &lt;/p&gt;  &lt;p&gt;Yes, there are lot of strategies one can use to find bugs in the software. However, even if testing for lot of possibilities may still leave bring disaster because the tester haven’t tested for one possible input. &lt;/p&gt;  &lt;p&gt;Understanding that we can’t predict what we don’t know will be a first step to solve these issues. &lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/6394448146349542939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/software-estimation-understanding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/6394448146349542939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/6394448146349542939'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/software-estimation-understanding.html' title='Software Estimation - Understanding'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-2470587062447511531</id><published>2011-04-17T09:42:00.003+05:30</published><updated>2011-04-17T10:13:49.530+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><title type='text'>Testing Vs Automation Checking</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The argument that, testing is not checking has generated lot of content. While reading the whole debate, I thought, we’re missing some pieces. Hence this post.&lt;br /&gt;&lt;br /&gt;See the Testing vs Checking posts here,&lt;br /&gt;&lt;a href=&quot;http://www.developsense.com/blog/2009/08/testing-vs-checking/&quot;&gt;http://www.developsense.com/blog/2009/08/testing-vs-checking/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.developsense.com/blog/2009/09/tests-vs-checks-motive-for/&quot;&gt;http://www.developsense.com/blog/2009/09/tests-vs-checks-motive-for/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://thetesteye.com/blog/2010/03/the-testing-vs-checking-paradox/&quot;&gt;http://thetesteye.com/blog/2010/03/the-testing-vs-checking-paradox/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.testingreflections.com/node/view/8282&quot;&gt;http://www.testingreflections.com/node/view/8282&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.testingreflections.com/node/view/8243&quot;&gt;http://www.testingreflections.com/node/view/8243&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.infoq.com/news/2009/12/testing-or-checking&quot;&gt;http://www.infoq.com/news/2009/12/testing-or-checking&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.stickyminds.com/sitewide.asp?ObjectId=16684&amp;amp;Function=edetail&amp;amp;ObjectType=COL&quot;&gt;http://www.stickyminds.com/sitewide.asp?ObjectId=16684&amp;amp;Function=edetail&amp;amp;ObjectType=COL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A simple summary of the discussion. Testing is a learning process, that can’t be automated. Testers can only automate checking not testing. Checking means verifying a button/link/functionality is there or works expected. Other words, human intelligence can’t be automated. Yes, that is the point. However, it missed an other point. Human intelligence can be used in creative areas rather than doing mundane repetitive actions. &lt;br /&gt;&lt;br /&gt;Am I saying automated testing can be called as Tool Assisted Testing? Nope. &lt;br /&gt;&lt;br /&gt;Let us take Programming. A programming language has control flow, data structures, memory management,error reporting etc. If you look at the abstract level, all the actions done by the programming language is actually checking. &lt;br /&gt;&lt;blockquote&gt;Get an input ---&amp;gt; Check the input –&amp;gt; Do Some actions based on that ---&amp;gt; Show/Pass the output&lt;/blockquote&gt;Which means, if a programmer learns all these things, can he write a great application using this? Nope. &lt;br /&gt;Wisdom of what to put where and how, will differentiate between a good programmer and bad one. Handling errors, designing a UI will make a difference. &lt;br /&gt;&lt;br /&gt;Coming back to the point, the purpose of testing starts when tester sees an error and decides what to do with that. That particular error may be a bug or UI needs some improvement or may lead to finding an another bug.&lt;br /&gt;&lt;br /&gt;Enter automation. If automation can capture the errors in UI, shows a nice report along with screen shots, log entries etc, tester can analyze it and chart a future course of action. In essence, time spent on producing those errors may be or can be saved. We know the computer is dump, can’t think. So why assume it will assist us in finding the bugs? &lt;br /&gt;&lt;br /&gt;Using automation tools in right way and doing more work in less time (productivity) will give us more time to do testing. Human intelligence can be used to do more productive and creative works. &lt;br /&gt;&lt;br /&gt;Lets us see a quote from &lt;a href=&quot;http://sethgodin.typepad.com/seths_blog/2010/06/a-car-is-not-merely-a-faster-horse.html&quot; target=&quot;_blank&quot;&gt;Seth Godin&lt;/a&gt;, to understand what I mean. &lt;br /&gt;&lt;blockquote&gt;And email is not a faster fax. And online project management is not a bigger whiteboard. And Facebook is not an electronic rolodex.&lt;br /&gt;Play a new game, not the older game but faster.&lt;/blockquote&gt;In the same way, automation is not faster testing. For example, take &lt;a href=&quot;http://en.wikipedia.org/wiki/Static_code_analysis&quot; target=&quot;_blank&quot;&gt;Static code analysis.&lt;/a&gt; It can find flawed code that may be buggy. Using it to scan the entire repository will make job of the coder easy to find bugs. More over, if he makes some mistake it can be found using this. Code review will be a easier with static code analysis. &lt;br /&gt;&lt;br /&gt;Another example is continuous integration tools. It can start the testing when new code checked in.&lt;br /&gt;&lt;br /&gt;Test Automation is not faster testing. It enables more testing. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/2470587062447511531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/testing-vs-automation-checking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/2470587062447511531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/2470587062447511531'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/testing-vs-automation-checking.html' title='Testing Vs Automation Checking'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-8952090681826745241</id><published>2011-04-16T09:03:00.003+05:30</published><updated>2011-04-16T09:10:35.609+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Thunderbird"/><category scheme="http://www.blogger.com/atom/ns#" term="Zoho"/><category scheme="http://www.blogger.com/atom/ns#" term="Zoho Mail"/><title type='text'>Moving Thunderbird Mails to web mail</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;br /&gt;I am using Thunderbird for long time. For storage and other reasons, I want to move my Thunderbird mails to web mails such as &lt;a href=&quot;http://www.zoho.com/mail/&quot; target=&quot;_blank&quot;&gt;Zoho mail&lt;/a&gt;. There are some solutions to this issue. You can convert the mbox mails to eml, upload it to web. There is a solution to read this mbox and forward it one by one. Trying all these, I found a easy solution. IMAP come to rescue. &lt;br /&gt;&lt;br /&gt;IMAP will sync the folders and mails between client(Thunderbird) and Server(Zoho mail). So, I created IMAP account in Thunderbird, transferred the mails from local folder to Zoho mail folder. Bingo. I can see all the mails in the web interface. &lt;br /&gt;&lt;br /&gt;Here is the step by step instructions&lt;br /&gt;&lt;br /&gt;1. Download and install Thunderbird&lt;br /&gt;&lt;br /&gt;2. Create a Zoho mail IMAP account in Thunderbird. See this link for more info, &lt;a href=&quot;https://zohomail.wiki.zoho.com/Configure-in-Thunderbird-1.html&quot; target=&quot;_blank&quot;&gt;Configure in Thunderbird&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Create a folder under the Zoho mail account. Let us say that Test folder.&lt;br /&gt;&lt;br /&gt;4. Move/Copy your mails in the local folder to Test folder. &lt;br /&gt;&lt;br /&gt;5. Sync the account using get messages. &lt;br /&gt;&lt;br /&gt;Now, you can see all your moved mails in web interface. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/8952090681826745241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/moving-thunderbird-mails-to-web-mail.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/8952090681826745241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/8952090681826745241'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/moving-thunderbird-mails-to-web-mail.html' title='Moving Thunderbird Mails to web mail'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-4378207305393414093</id><published>2011-04-07T12:09:00.002+05:30</published><updated>2011-04-07T12:09:41.735+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="Tools"/><title type='text'>Tools used in Manual Testing</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;Common test tools useful in Manual testing&lt;br /&gt;&lt;br /&gt;1. &lt;a href=&quot;http://www.webyog.com/en/&quot; target=&quot;_blank&quot;&gt;SQLYog &lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  SQLyog MySQL GUI is the most powerful MySQL manager and admin tool,  combining the features of MySQL Administrator, phpMyAdmin and other  MySQL Front Ends and MySQL GUI tools.&lt;br /&gt;&lt;br /&gt;2. &lt;a href=&quot;http://www.dbvis.com/&quot;&gt;DBVisuvalizer&lt;/a&gt; : &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  DbVisualizer is the universal database tool for developers and database  administrators. It is the perfect solution since the&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; same tool can  be used on all major operating systems accessing a wide range of  databases.&lt;br /&gt;&lt;br /&gt;3. &lt;a href=&quot;http://www.eclipse.org/mat/&quot; target=&quot;_blank&quot;&gt;MAT (Eclipse Plugin)&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  The Eclipse Memory Analyzer is a fast and feature-rich Java heap  analyzer that helps you find memory leaks and reduce memory consumption.&lt;br /&gt;4. &lt;a href=&quot;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&amp;amp;displaylang=en&amp;amp;pf=true#Overview&quot; target=&quot;_blank&quot;&gt;MicroSoft LogParser&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Log parser is a powerful, versatile tool that provides universal query  access to text-based data such as log files, XML files and CSV files, as  well as key data sources on the Windows® operating system such as the  Event Log, the Registry, the file system, and Active Directory®.&lt;br /&gt;&lt;br /&gt;5. &lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb842062&quot; target=&quot;_blank&quot;&gt;Microsoft SysInternals Suite&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  The Sysinternals Troubleshooting Utilities have been rolled up into a   single Suite of tools. This file contains the individual troubleshooting  tools and help files. It does not contain non-troubleshooting tools   like the BSOD Screen Saver or NotMyFault.&lt;br /&gt;&lt;br /&gt;6. &lt;a href=&quot;http://www.chiark.greenend.org.uk/%7Esgtatham/putty/&quot; target=&quot;_blank&quot;&gt;Putty&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  PuTTY is a free implementation of Telnet and SSH for Windows and Unix  platforms, along with an xterm terminal emulator. It is written and  maintained primarily by Simon Tatham. &lt;br /&gt;&lt;br /&gt;7. &lt;a href=&quot;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=D7BA3CD6-18D1-4D05-B11E-4C64192AE97D&amp;amp;pf=true&quot; target=&quot;_blank&quot;&gt;WMIDiag&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A new utility to help system administrators diagnose and repair problems with the WMI service.&lt;br /&gt;&lt;br /&gt;8. &lt;a href=&quot;http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6430f853-1120-48db-8cc5-f2abdc3ed314&amp;amp;displaylang=en&amp;amp;pf=true&quot; target=&quot;_blank&quot;&gt;WMI Administrative Tools&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  WMI Tools include: WMI CIM Studio: view and edit classes, properties,  qualifiers, and instances in a CIM repository; run selected methods;  generate and compile MOF files. WMI Object Browser: view objects, edit  property values and qualifiers, and run methods.&lt;br /&gt;&lt;br /&gt;9. &lt;a href=&quot;http://unlocker.emptyloop.com/&quot; target=&quot;_blank&quot;&gt;Unlocker&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tool to remove the folder locking&lt;br /&gt;&lt;br /&gt;10. &lt;a href=&quot;http://windirstat.info/&quot; target=&quot;_blank&quot;&gt;WinDirStat&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows. &lt;br /&gt;&lt;br /&gt;11. &lt;a href=&quot;http://winmerge.org/&quot; target=&quot;_blank&quot;&gt;WinMerge&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  WinMerge is an Open Source differencing and merging tool for Windows.  WinMerge can compare both folders and files, presenting differences in a  visual text format that is easy to understand and handle.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;zemanta-pixie-img&quot; src=&quot;http://img.zemanta.com/pixy.gif?x-id=4a283800-3ffc-8ed8-9867-c8a7cac467fb&quot; /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/4378207305393414093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/tools-used-in-manual-testing.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/4378207305393414093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/4378207305393414093'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/04/tools-used-in-manual-testing.html' title='Tools used in Manual Testing'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry><entry><id>tag:blogger.com,1999:blog-4073546017384129072.post-5076950179480872978</id><published>2011-01-26T14:25:00.001+05:30</published><updated>2011-01-26T15:12:39.332+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation"/><category scheme="http://www.blogger.com/atom/ns#" term="Frameworks"/><category scheme="http://www.blogger.com/atom/ns#" term="Selenium"/><category scheme="http://www.blogger.com/atom/ns#" term="Testing"/><title type='text'>Selenium and Choosing a Framework</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; After seeing some people asking questions about choosing/developing a framework to use Selenium, I thought, I could offer few tips. This may look like ways to creating a new automation product, however, customizing the tool to the needs of app and the team, will decide the success of test automation. It is like bespoke vs ready-made.&lt;/span&gt;&lt;br /&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; I&#39;ve separated this into two categories, one is how to run and other is how to have a robust, reusable Selenium tests. If you choose to go with this way, forget about Se IDE. This is not to discredit the IDE but to understand that record and playback, wont work in this approach. If you think that you can record and put the cases in the script, sorry to bust the bubble. It wont work.&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span style=&quot;color: black; font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;I. Running the Selenium scripts.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;I will list the available choices. These are specific to Java.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I can live with the default main method as I do in my app - No need for any existing frameworks. You can decide on your own or use the Java Reflect API.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I want run with minimum work. - Choose JUnit or TestNG, again depends upon how you want to organize tests.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;I want to run using CI - Plug-ins are available for Maven/Hudson&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span style=&quot;color: black; font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;II. For a robust Selenium tests.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span style=&quot;color: black; font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; This portion will also cover general test automation best practices, however, I will highlight how to get that using Selenium.&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;A. &lt;i&gt;Understand the App you&#39;re going to automate&lt;/i&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span style=&quot;color: black; font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; I&#39;ve seen a number of people trying to automate, without understanding the UI/App. It will be a spectacular failure because, that is wrong way to start with. UI can be a heavily ajaxified , may have lot of dynamic ids or app may be in early stages so UI may change infrequently.&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For ajaxified pages using CSS selectors is the best option. Going with Sizzle/jQuery based CSS selectors is nice. If the app has lot of dynamic elements, talk to your developers to understand the underlying pattern. Having a custom locator using that pattern will solve lot of issues. Don&#39;t use Xpaths with div or span in the locators, if that div is changed to span, your tests are broken. There wont be any visible changes but tests still wont run. So think before using those locators. &lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span style=&quot;color: black; font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; B. &lt;i&gt;What is testing requirement now and what are the plans for future?&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span style=&quot;color: black; font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Now the hardest part. Deciding what you&#39;re going to do and what else will be needed in future will decide time and difficulty of the your test automation. Let me list few options.&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Access to database/csv/excel etc&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Integration with logging framework if you need to print info message wherever needed&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Integrating with speed load testing frameworks such as JMeter&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;Integration with HTML/JS validation frameworks such as HtmlUnit. This way you can do unit testing of the page.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt; Once you&#39;ve decided on these, taking care of options to handle exceptions/alerts, capture screen shots, generating test results/reports come to play. If the framework/model doesn&#39;t handle these things then it will not reduce work or add value to the testing. &lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span style=&quot;color: black; font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;III. Page Objects or BDD?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; As you know in Selenium 2, Page Objects come with it. However, by separating element locators from code using properties or xml file you can get benefit of the Page Objects without going for it. You can point out that Page Objects can do much more that, however, my fingers crossed on that issue.  &lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;margin-bottom: 0in; orphans: 2; widows: 2;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; If it so, why BDD? Using BDD model you can separate flow of actions from the code, that extends the concept of Page Objects. Moreover, creating and maintaining code written using BDD is easy. And if you extend that write your own framework for BDD, you can even create the customizations you need without trying to predict what you will need in future. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana, sans-serif;&quot;&gt;In the end, creating tests which will bring value to testing, app and the team matters. So choose wisely.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vrajasankar.blogspot.com/feeds/5076950179480872978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://vrajasankar.blogspot.com/2011/01/selenium-and-choosing-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5076950179480872978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4073546017384129072/posts/default/5076950179480872978'/><link rel='alternate' type='text/html' href='http://vrajasankar.blogspot.com/2011/01/selenium-and-choosing-framework.html' title='Selenium and Choosing a Framework'/><author><name>Rajasankar</name><uri>http://www.blogger.com/profile/11632647603647641971</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></entry></feed>