<?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-1023602686709660760</id><updated>2024-11-05T19:00:05.271-08:00</updated><category term="Watir testing"/><category term="General Testing"/><category term="ruby scripting"/><category term="Watir Framework"/><category term="Services"/><category term="Training Institutes in India"/><title type='text'>Web Application Testing in Ruby</title><subtitle type='html'>This will help you for Automation Software Testing with Watir Tool(Ruby)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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>96</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-1766509750078860988</id><published>2013-06-16T00:46:00.000-07:00</published><updated>2013-06-16T01:13:11.319-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Training Institutes in India"/><title type='text'>Top Training Institute in Bangalore</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val=&quot;Cambria Math&quot;/&gt;
   &lt;m:brkBin m:val=&quot;before&quot;/&gt;
   &lt;m:brkBinSub m:val=&quot;&amp;#45;-&quot;/&gt;
   &lt;m:smallFrac m:val=&quot;off&quot;/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val=&quot;0&quot;/&gt;
   &lt;m:rMargin m:val=&quot;0&quot;/&gt;
   &lt;m:defJc m:val=&quot;centerGroup&quot;/&gt;
   &lt;m:wrapIndent m:val=&quot;1440&quot;/&gt;
   &lt;m:intLim m:val=&quot;subSup&quot;/&gt;
   &lt;m:naryLim m:val=&quot;undOvr&quot;/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;br /&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; DefUnhideWhenUsed=&quot;true&quot;
  DefSemiHidden=&quot;true&quot; DefQFormat=&quot;false&quot; DefPriority=&quot;99&quot;
  LatentStyleCount=&quot;267&quot;&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Normal&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;heading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;35&quot; QFormat=&quot;true&quot; Name=&quot;caption&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;10&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; Name=&quot;Default Paragraph Font&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;11&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtitle&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;22&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Strong&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;20&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;59&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Table Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Placeholder Text&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;No Spacing&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Revision&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;34&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;List Paragraph&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;29&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;30&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;19&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;21&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;31&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;32&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;33&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Book Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;37&quot; Name=&quot;Bibliography&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; QFormat=&quot;true&quot; Name=&quot;TOC Heading&quot;/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-priority:99;
 mso-style-qformat:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0in 5.4pt 0in 5.4pt;
 mso-para-margin:0in;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:11.0pt;
 font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;
 mso-ascii-font-family:Calibri;
 mso-ascii-theme-font:minor-latin;
 mso-fareast-font-family:&quot;Times New Roman&quot;;
 mso-fareast-theme-font:minor-fareast;
 mso-hansi-font-family:Calibri;
 mso-hansi-theme-font:minor-latin;
 mso-bidi-font-family:&quot;Times New Roman&quot;;
 mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;RIA INSTITUTE OF
TECHNOLOGY&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val=&quot;Cambria Math&quot;/&gt;
   &lt;m:brkBin m:val=&quot;before&quot;/&gt;
   &lt;m:brkBinSub m:val=&quot;&amp;#45;-&quot;/&gt;
   &lt;m:smallFrac m:val=&quot;off&quot;/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val=&quot;0&quot;/&gt;
   &lt;m:rMargin m:val=&quot;0&quot;/&gt;
   &lt;m:defJc m:val=&quot;centerGroup&quot;/&gt;
   &lt;m:wrapIndent m:val=&quot;1440&quot;/&gt;
   &lt;m:intLim m:val=&quot;subSup&quot;/&gt;
   &lt;m:naryLim m:val=&quot;undOvr&quot;/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; DefUnhideWhenUsed=&quot;true&quot;
  DefSemiHidden=&quot;true&quot; DefQFormat=&quot;false&quot; DefPriority=&quot;99&quot;
  LatentStyleCount=&quot;267&quot;&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Normal&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;heading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;35&quot; QFormat=&quot;true&quot; Name=&quot;caption&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;10&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; Name=&quot;Default Paragraph Font&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;11&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtitle&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;22&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Strong&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;20&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;59&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Table Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Placeholder Text&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;No Spacing&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Revision&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;34&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;List Paragraph&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;29&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;30&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;19&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;21&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;31&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;32&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;33&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Book Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;37&quot; Name=&quot;Bibliography&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; QFormat=&quot;true&quot; Name=&quot;TOC Heading&quot;/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-priority:99;
 mso-style-qformat:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0in 5.4pt 0in 5.4pt;
 mso-para-margin:0in;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:11.0pt;
 font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;
 mso-ascii-font-family:Calibri;
 mso-ascii-theme-font:minor-latin;
 mso-fareast-font-family:&quot;Times New Roman&quot;;
 mso-fareast-theme-font:minor-fareast;
 mso-hansi-font-family:Calibri;
 mso-hansi-theme-font:minor-latin;
 mso-bidi-font-family:&quot;Times New Roman&quot;;
 mso-bidi-theme-font:minor-bidi;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11.0pt; line-height: 115%; mso-ansi-language: EN-US; mso-bidi-font-family: &amp;quot;Times New Roman&amp;quot;; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US;&quot;&gt;ISO -9001-2008 CERTIFIED&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;C,C++&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;JAVA/J2EE&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt; &lt;/span&gt;.NET&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
SOFTWARE TESTING&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt; &lt;/span&gt;PHP/MYSQL&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
PL/SQL&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
SPOKEN ENGLISH&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
TALLY ERP 9&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
ADVACNE EXCEL&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
MS ACCESS (VBA) &lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
QTP &lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
SAP FICO/SD/MM/PP/ABAP/BI/BO/BODS/CRM TECH/HCM&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;mso-spacerun: yes;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Corporate office – Marathahalli&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Branch office – R.T.Nagar&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;Call- 9886001060&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;a href=&quot;mailto:info@riainstitute.in&quot;&gt;info@riainstitute.in&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;a href=&quot;http://www.riainstitute.co.in/&quot;&gt;www.riainstitute.co.in&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;a href=&quot;http://www.riainstitute.in/&quot;&gt;www.riainstitute.in&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;mso-tab-count: 1;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/1766509750078860988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2013/06/top-training-institute-in-bangalore.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1766509750078860988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1766509750078860988'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2013/06/top-training-institute-in-bangalore.html' title='Top Training Institute in Bangalore'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-4893125665659814664</id><published>2011-06-03T03:32:00.001-07:00</published><updated>2011-06-03T03:32:50.586-07:00</updated><title type='text'>Ruby scripting with Excel</title><content type='html'>Ruby scripting with Excel:-&lt;br /&gt;
First of all:&lt;br /&gt;
&lt;br /&gt;
require &#39;win32ole&#39;&lt;br /&gt;
&lt;br /&gt;
Opening spreadsheets, accessing workbooks and worksheets&lt;br /&gt;
&lt;br /&gt;
excel = WIN32OLE::new(&#39;excel.Application&#39;)&lt;br /&gt;
workbook = excel.Workbooks.Open(&#39;c:\examples\spreadsheet.xls&#39;)&lt;br /&gt;
worksheet = workbook.Worksheets(1) #get hold of the first worksheet&lt;br /&gt;
worksheet.Select  #bring it to the front -need sometimes to run macros, &lt;br /&gt;
#    not for working with a worksheet from ruby&lt;br /&gt;
excel[&#39;Visible&#39;] = true #make visible, set to false to make invisible &lt;br /&gt;
#    again. Don&#39;t need it to be visible for script to work&lt;br /&gt;
&lt;br /&gt;
reading data from spreadsheet&lt;br /&gt;
worksheet.Range(&#39;a12&#39;)[&#39;Value&#39;]  #get value of single cell&lt;br /&gt;
data = worksheet.Range(&#39;a1:c12&#39;)[&#39;Value&#39;] #read into 2D array&lt;br /&gt;
&lt;br /&gt;
finding the first empty row (using empty column A)&lt;br /&gt;
&lt;br /&gt;
line = &#39;1&#39;&lt;br /&gt;
while worksheet.Range(&quot;a#{line}&quot;)[&#39;Value&#39;]&lt;br /&gt;
   line.succ!&lt;br /&gt;
end #line now holds row number of first empty row&lt;br /&gt;
&lt;br /&gt;
or to read as you go&lt;br /&gt;
&lt;br /&gt;
line = &#39;1&#39;&lt;br /&gt;
data = []&lt;br /&gt;
while worksheet.Range(&quot;a#{line}&quot;)[&#39;Value&#39;]&lt;br /&gt;
   data &lt;&lt; worksheet.Range(&quot;a#{line}:d#{line}&quot;)[&#39;Value&#39;]
   line.succ!
end

writing data into spreadsheet, example

worksheet.Range(&#39;e2&#39;)[&#39;Value&#39;] = Time.now.strftime 
    &#39;%d/%m/%Y&#39; #single value
worksheet.Range(&#39;a5:c5&#39;)[&#39;Value&#39;] = [&#39;Test&#39;, &#39;25&#39;, &#39;result&#39;]

loading all Excel constants into a class

class ExcelConst
end
WIN32OLE.const_load(excel, ExcelConst)

Now the constant xlDown is accessible as

ExcelConst::XlDown

To find out what constants to use you can use this script. You run it by passing in a string which is matched against the constant names.

require &#39;win32ole&#39;

module ExcelConsts
end

excel = WIN32OLE.new(&quot;Excel.Application&quot;)
WIN32OLE.const_load(excel, ExcelConsts)
excel.quit()

puts &#39;Matches for: &#39; + ARGV[0]
ExcelConsts.constants.each {|const|
    match = const.match(/#{ARGV[0]}/)
    value = eval(&quot;ExcelConsts::#{const}&quot;)
    puts &#39; &#39;*4 + const + &#39; =&gt; &#39; + value.to_s unless match.nil?&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
An example would be looking for the constant to center text. I ran&lt;br /&gt;
&lt;br /&gt;
ruby search_excel_consts.rb Center &lt;br /&gt;
&lt;br /&gt;
and the following results came up:&lt;br /&gt;
&lt;br /&gt;
XlCenterAcrossSelection =&gt; 7&lt;br /&gt;
XlVAlignCenter =&gt; -4108&lt;br /&gt;
XlCenter =&gt; -4108&lt;br /&gt;
XlLabelPositionCenter =&gt; -4108&lt;br /&gt;
XlPhoneticAlignCenter =&gt; 2&lt;br /&gt;
XlHAlignCetner =&gt; -4108&lt;br /&gt;
XlHAlignCenterAcrossSelection =&gt; 7&lt;br /&gt;
&lt;br /&gt;
calling macros&lt;br /&gt;
&lt;br /&gt;
excel.Run(&#39;SortByNumber&#39;)&lt;br /&gt;
&lt;br /&gt;
Setting background colour&lt;br /&gt;
&lt;br /&gt;
worksheet.Range(&#39;a3:f5&#39;).Interior[&#39;ColorIndex&#39;] = 36 #pale yellow&lt;br /&gt;
# Set background color back to uncoloured (rnicz)&lt;br /&gt;
worksheet.Range(&#39;a3:f5&#39;).Interior[&#39;ColorIndex&#39;] = -4142 # XlColorIndexNone constant&lt;br /&gt;
# or use Excel constant to set background color back to uncoloured&lt;br /&gt;
worksheet.Range(&#39;a3:f5&#39;).Interior[&#39;ColorIndex&#39;] = ExcelConst::XlColorIndexNone&lt;br /&gt;
&lt;br /&gt;
Adding Formulae&lt;br /&gt;
&lt;br /&gt;
emptyRow = 15&lt;br /&gt;
worksheet.Range(&quot;t#{emptyRow}&quot;)[&#39;Formula&#39;] = &quot;=(Q#{emptyRow}+L#{emptyRow}+I#{emptyRow}+S#{emptyRow})&quot;&lt;br /&gt;
&lt;br /&gt;
saving changes&lt;br /&gt;
&lt;br /&gt;
workbook.Close(1)&lt;br /&gt;
# or&lt;br /&gt;
workbook.SaveAs &#39;myfile.xls&#39;&lt;br /&gt;
# default path is the system defined My Documents folder&lt;br /&gt;
&lt;br /&gt;
ending session&lt;br /&gt;
&lt;br /&gt;
excel.Quit&lt;br /&gt;
&lt;br /&gt;
If you&#39;re experimenting from within irb and are having problems with processes hanging around after you&#39;ve called excel.Quit - try deleting the reference to excel and invoking the garbage collector.&lt;br /&gt;
&lt;br /&gt;
excel.Quit&lt;br /&gt;
excel = nil&lt;br /&gt;
GC.start&lt;br /&gt;
&lt;br /&gt;
Hopefully this is of some use. Please add anything else you have discovered.&lt;br /&gt;
&lt;br /&gt;
Some further stuff that I learned so far...&lt;br /&gt;
It partly overlaps with what ChrisMorris already wrote, maybe we can merge it later on. -- BernhardLeicher&lt;br /&gt;
&lt;br /&gt;
Start Excel, create new workbook and save it:&lt;br /&gt;
&lt;br /&gt;
require &#39;win32ole&#39;&lt;br /&gt;
excel = WIN32OLE.new(&quot;excel.application&quot;)&lt;br /&gt;
excel.visible = true     # in case you want to see what happens &lt;br /&gt;
workbook = excel.workbooks.add&lt;br /&gt;
workbook.saveas(&#39;c:\examples\spreadsheet1.xls&#39;)&lt;br /&gt;
workbook.close&lt;br /&gt;
&lt;br /&gt;
Or, suppose Excel is already started and a few Excel files are opened (=workbooks in Excel jargon): Connect to the running instance of Excel, activate one of the workbooks and write something.&lt;br /&gt;
&lt;br /&gt;
This also shows that Excel collections can be iterated very handy with &quot;each&quot;, and that collections can sometimes be indexed by number or by name:&lt;br /&gt;
&lt;br /&gt;
excel = WIN32OLE.connect(&quot;excel.application&quot;)&lt;br /&gt;
excel.workbooks.each{|wb|puts wb.name}  # loop through workbooks and display names&lt;br /&gt;
excel.workbooks(1).activate             # activate by number&lt;br /&gt;
excel.workbooks(&quot;Mappe1&quot;).activate      # or by name     &lt;br /&gt;
excel.range(&quot;b5&quot;).value=&quot;soso&quot;          # write something to cell B5&lt;br /&gt;
&lt;br /&gt;
Connecting to Excel is particularly good fun when done interactively from irb: You instantly see what happens!&lt;br /&gt;
&lt;br /&gt;
irb(main):001:0&gt; require &#39;win32ole&#39;&lt;br /&gt;
true&lt;br /&gt;
irb(main):002:0&gt; excel=WIN32OLE.connect(&#39;excel.application&#39;)&lt;br /&gt;
#&lt;br /&gt;
irb(main):003:0&gt; excel.workbooks.each{|wb|puts wb.name}&lt;br /&gt;
PERSONL.XLS&lt;br /&gt;
Mappe1&lt;br /&gt;
Mappe2&lt;br /&gt;
Mappe3&lt;br /&gt;
nil&lt;br /&gt;
irb(main):004:0&gt; excel.workbooks(1).name&lt;br /&gt;
&quot;PERSONL.XLS&quot;&lt;br /&gt;
irb(main):005:0&gt; excel.workbooks(&quot;Mappe1&quot;).activate&lt;br /&gt;
true&lt;br /&gt;
irb(main):006:0&gt; excel.range(&quot;b5&quot;).value=&quot;soso&quot;&lt;br /&gt;
nil&lt;br /&gt;
&lt;br /&gt;
Excel =&gt; workbook =&gt; worksheet =&gt; range(cell)&lt;br /&gt;
&lt;br /&gt;
What always bugged me when browsing through examples were the various ways of referring to a particular cell on a particular worksheet in a particular workbook. When Excel is started and &quot;Mappe1&quot; is the currently active workbook and &quot;Tabelle1&quot; is the currently active worksheet, all following statements do the same thing:&lt;br /&gt;
&lt;br /&gt;
excel.workbooks(&quot;Mappe1&quot;).worksheets(&quot;Tabelle1&quot;).range(&quot;a1&quot;).value&lt;br /&gt;
excel.worksheets(&quot;Tabelle1&quot;).range(&quot;a1&quot;).value&lt;br /&gt;
excel.activeworkbook.activesheet.range(&quot;a1&quot;).value&lt;br /&gt;
excel.activesheet.range(&quot;a1&quot;).value&lt;br /&gt;
excel.range(&quot;a1&quot;).value&lt;br /&gt;
&lt;br /&gt;
My confusion was probably caused by the fact that a lot of properties/methods can be called on &quot;excel&quot; directly and then default to the currently active workbook/worksheet. It&#39;s more a matter of taste to specify &quot;activesheet&quot; and &quot;activeworkbook&quot; or not.&lt;br /&gt;
&lt;br /&gt;
And regarding the hierarchy, it seems to be as simple as: When Excel is up and running, it contains 0 (no file opened) or more workbooks (Workbook? Just Excel jargon for an Excel file!), with each workbook/file containing 1 or more worksheets.&lt;br /&gt;
&lt;br /&gt;
Various methods for addressing a cell or range of cells&lt;br /&gt;
&lt;br /&gt;
In the Excel object model there isn&#39;t something like a cell object, it&#39;s all covered by the &quot;Range&quot; object. A range can represent only one cell or a whole bunch of them (a column, a row, a rectangular block of cells, ....).&lt;br /&gt;
&lt;br /&gt;
Let&#39;s assume for the following examples, that &quot;sheet&quot; contains a reference to an Excel worksheet, obtained e.g. by:&lt;br /&gt;
&lt;br /&gt;
require &#39;win32ole&#39;&lt;br /&gt;
excel = WIN32OLE.connect(&#39;excel.application&#39;)   # connect to running instance of Excel&lt;br /&gt;
sheet = excel.activesheet&lt;br /&gt;
&lt;br /&gt;
sheet.range(cellname/cell[, cellname/cell])&lt;br /&gt;
&lt;br /&gt;
A range can be obtained by using the worksheet&#39;s Range property. A range with only one cell:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;)&lt;br /&gt;
&lt;br /&gt;
Or a rectangular block of cells (A1 to C3):&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;, &quot;c3&quot;)&lt;br /&gt;
&lt;br /&gt;
Same with one argument:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1:c3&quot;)&lt;br /&gt;
&lt;br /&gt;
Whole Column A:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a:a&quot;)&lt;br /&gt;
&lt;br /&gt;
Whole Row 3:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;3:3&quot;)&lt;br /&gt;
&lt;br /&gt;
A range itself has a range property, thus allowing to write:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;c3&quot;).range(&quot;a1&quot;).address     # &gt;&gt; &quot;$C$3&quot;&lt;br /&gt;
&lt;br /&gt;
Doesn&#39;t make much sense, one might note that the second range&#39;s address becomes relative to the first range.&lt;br /&gt;
&lt;br /&gt;
sheet.cells(rowindex, columnindex)&lt;br /&gt;
&lt;br /&gt;
This is all wonderful, but shouldn&#39;t there be a way of addressing cells by row and column number? The worksheet&#39;s Cells property does that: It gets you a range with one cell by specifying the row and column number. The indices are counted from 1, so Cells(1,1) gives you cell A1:&lt;br /&gt;
&lt;br /&gt;
sheet.cells(3,1).address                  # &gt;&gt; &quot;$C$3&quot;&lt;br /&gt;
&lt;br /&gt;
Combined with range to get range A1:C3:&lt;br /&gt;
&lt;br /&gt;
sheet.range(sheet.cells(1,1), sheet.cells(3,3))   &lt;br /&gt;
&lt;br /&gt;
And when applied to another range, row and column index become relative to the first range:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;b2&quot;).cells(2,2).address      # &gt;&gt; &quot;$C$3&quot;&lt;br /&gt;
&lt;br /&gt;
The index can be negative:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;c3&quot;).cells(-1,-1).address    # &gt;&gt; &quot;$A$1&quot;&lt;br /&gt;
range.offset(rowoffset, columnoffset)&lt;br /&gt;
&lt;br /&gt;
If you have a range, this can be used to return another range that is y rows and x columns away (or offset) from this one. This time the offsets count from 0:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;).offset(0,0).address      # &gt;&gt; &quot;$A$1&quot;&lt;br /&gt;
sheet.range(&quot;b5&quot;).offset(1,1).address      # &gt;&gt; &quot;$C$6&quot;&lt;br /&gt;
&lt;br /&gt;
While offset somehow reminds of the cells function, this might make a difference: If range contains a block of cells, an offset block of cells is returned too:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1:c3&quot;).offset(0,2).address   # &gt;&gt; &quot;$C$1:$E$3&quot;&lt;br /&gt;
&lt;br /&gt;
Negative offsets can be specified too:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;b2&quot;).offset(-1,-1).address    # &gt;&gt; &quot;$A$1&quot;&lt;br /&gt;
&lt;br /&gt;
Getting cell values&lt;br /&gt;
&lt;br /&gt;
There isn&#39;t only one method for obtaining a cell&#39;s value, but at least three of them: text, value, value2. So which should one use, what is the difference between them?&lt;br /&gt;
&lt;br /&gt;
Sidenote:&lt;br /&gt;
An Excel cell&#39;s content is somewhat relative, what you see isn&#39;t necessarily what is actually inside the cell, because a cell&#39;s content is displayed according to a specified format. A cell might contain &quot;0.12345&quot;, but is displayed as &quot;0.12&quot; or &quot;0.12 DM&quot; or whatever. It might be good to know, that internally a cell&#39;s content is either a text or a floating point number. That&#39;s it, nothing else.&lt;br /&gt;
&lt;br /&gt;
Just for curiosity:&lt;br /&gt;
Dates are represented internally as floating point values too (more details at Chip Pearson&#39;s site: HTTP://www.cpearson.com/excel/datetime.htm):³59³ &quot;Excel stores dates and times as a number representing the number of days since 1900-Jan-0, plus a fractional portion of a 24 hour day: ddddd.tttttt . This is called a serial date, or serial date-time.&quot;&lt;br /&gt;
So if the content is 37936.0 and its format is &quot;date&quot;, it&#39;s displayed as &quot;11.11.03&quot; or &quot;Nov 2003&quot;.&lt;br /&gt;
&lt;br /&gt;
For the following examples let&#39;s assume a content of:&lt;br /&gt;
&lt;br /&gt;
A1 =&gt; 10.12345 =&gt; formatted with 2 decimal digits =&gt; 10.12&lt;br /&gt;
B1 =&gt; 10.12345 =&gt; formatted as currency =&gt; 10,00 DM&lt;br /&gt;
C1 =&gt; 11.11.03 =&gt; date =&gt; 11.11.03 &lt;br /&gt;
&lt;br /&gt;
range.text&lt;br /&gt;
&lt;br /&gt;
Text property retrieves the value as it is displayed, as a string. It&#39;s readonly, so only for getting values. Because my country settings are &quot;German&quot;, floats are displayed with a comma.&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;).text      # &gt;&gt; &quot;10,12&quot;&lt;br /&gt;
sheet.range(&quot;b1&quot;).text      # &gt;&gt; &quot;10,12 DM&quot;&lt;br /&gt;
sheet.range(&quot;c1&quot;).text      # &gt;&gt; &quot;11.11.03&quot;&lt;br /&gt;
&lt;br /&gt;
range.value&lt;br /&gt;
&lt;br /&gt;
This is the result when retrieved with value:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;).value       # &gt;&gt; 10.12345&lt;br /&gt;
sheet.range(&quot;b1&quot;).value       # &gt;&gt; &quot;10,1235&quot;&lt;br /&gt;
sheet.range(&quot;c1&quot;).value       # &gt;&gt; &quot;2003/11/11 00:00:00&quot;&lt;br /&gt;
&lt;br /&gt;
Retrieves the &quot;internal&quot; value (A1 becomes a float), whereby currency and date are still returned as strings albeit somewhat different than before.&lt;br /&gt;
&lt;br /&gt;
range.value2&lt;br /&gt;
&lt;br /&gt;
According to the Excel documentation value2 behaves just like value, but additionally retrieves currency and dates as doubles (the actual internal content):&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;).value2        # &gt;&gt; 10.12345&lt;br /&gt;
sheet.range(&quot;b1&quot;).value2        # &gt;&gt; 10.12345&lt;br /&gt;
sheet.range(&quot;c1&quot;).value2        # &gt;&gt; 37936.0 &lt;br /&gt;
&lt;br /&gt;
Yes, seems to work as advertised.&lt;br /&gt;
&lt;br /&gt;
Setting values&lt;br /&gt;
&lt;br /&gt;
Seems that only &quot;value&quot; is useful here. An integer or float arrives as expected as number in Excel:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;).value = 1.2345&lt;br /&gt;
sheet.range(&quot;a1&quot;).value = 2&lt;br /&gt;
&lt;br /&gt;
For strings Excel does the same processing that it does when something is interactively entered. It thus depends on how Excel interprets the string:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1&quot;).value = &quot;10.11.2003&quot;     # becomes a date&lt;br /&gt;
sheet.range(&quot;a1&quot;).value = &quot;1,2345&quot;           # becomes a number (at least with German country settings)&lt;br /&gt;
&lt;br /&gt;
Iterating ranges...&lt;br /&gt;
&lt;br /&gt;
...with each&lt;br /&gt;
&lt;br /&gt;
Ranges can be iterated with each:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1:a10&quot;).each{|cell|puts cell.value}&lt;br /&gt;
&lt;br /&gt;
If the range is a block of cells the iteration goes from left to right, then down one line, and so on:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;a1:b5&quot;).each{|cell|puts cell.value}&lt;br /&gt;
&lt;br /&gt;
Iterating block of cells by row and output the first cell of each row:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;b3:c7&quot;).rows.each{|r|puts r.cells(1,1).value}&lt;br /&gt;
&lt;br /&gt;
and by column:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;b3:c7&quot;).columns.each{|c|puts c.cells(1,1).value}&lt;br /&gt;
&lt;br /&gt;
Result of row.value is an array within an array:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;b3:c7&quot;).rows.each{|r|puts r.value.inspect}  # &gt;&gt; [1.0, 10.0]?&lt;br /&gt;
&lt;br /&gt;
...with activecell&lt;br /&gt;
&lt;br /&gt;
Like moving around an Excel sheet with the cursor. Moving down one cell:&lt;br /&gt;
&lt;br /&gt;
sheet.activecell.offset(1,0).activate&lt;br /&gt;
&lt;br /&gt;
Walking down from the active cell until an empty cell is encountered:&lt;br /&gt;
&lt;br /&gt;
sheet.activecell.offset(1,0).activate while excel.activecell.value&lt;br /&gt;
&lt;br /&gt;
...with an index&lt;br /&gt;
&lt;br /&gt;
range = sheet.range(&quot;b3:c7&quot;)&lt;br /&gt;
noofrows = range.rows.count&lt;br /&gt;
(1..noofrows).each{|i|puts range.cells(i,1).value}&lt;br /&gt;
&lt;br /&gt;
Named Ranges&lt;br /&gt;
&lt;br /&gt;
Named ranges make Excel spreadsheets more usable for the end user. To create a named range &quot;myRange&quot;:&lt;br /&gt;
&lt;br /&gt;
sheet.names.Add( { &#39;Name&#39; =&gt; &#39;myRange&#39;, &#39;RefersTo&#39; =&gt; &#39;A2:A216&#39; } )&lt;br /&gt;
&lt;br /&gt;
One problem! This doesn&#39;t work. Use a Range object for RefersTo?, not a String:&lt;br /&gt;
&lt;br /&gt;
myRange = sheet.Range( &#39;A2:A216&#39; )&lt;br /&gt;
sheet.names.Add( { &#39;Name&#39; =&gt; &#39;myRange&#39;, &#39;RefersTo&#39; =&gt; myRange } )&lt;br /&gt;
&lt;br /&gt;
How do you use named ranges in ruby? Named ranges are kept in the worksheet as well as the workbook. You may need to check both locations.&lt;br /&gt;
&lt;br /&gt;
Something like the following works for named ranges manually defined by the user:&lt;br /&gt;
&lt;br /&gt;
rangeString = workbook.names( &#39;Sheet1!myRange&#39; ).Value&lt;br /&gt;
&lt;br /&gt;
1. Remove &quot;=&quot; prefix (e.g. &quot;=Sheet1!$A$2:$A$4&quot;) &lt;br /&gt;
&lt;br /&gt;
rangeString = rangeString.slice( 1, rangeString.length - 1 ) if ( rangeString =~ /^=/ ) worksheet.range( rangeString ).value = &#39;testing...&#39;&lt;br /&gt;
&lt;br /&gt;
Finding Data Regions...&lt;br /&gt;
&lt;br /&gt;
Data don&#39;t always start in row 1, column A, the number of columns might not be fixed, and the number of rows is most often variable. There are two handy methods that can help to find that &quot;block of data&quot;.&lt;br /&gt;
&lt;br /&gt;
Let&#39;s assume, that B3:C7 contain data.&lt;br /&gt;
&lt;br /&gt;
...with CurrentRegion&lt;br /&gt;
&lt;br /&gt;
Given any cell inside the &quot;data block&quot;, CurrentRegion?() finds the surrounding contiguous data region and returns its range:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;b5&quot;).currentregion.address   # &gt;&gt; &quot;$B$3:$C$7&quot;&lt;br /&gt;
&lt;br /&gt;
...by &quot;jumping around&quot;&lt;br /&gt;
&lt;br /&gt;
There&#39;s a shortcut key in Excel &quot;+&quot;, that allows you to jump to the end/start of regions with content. With our example and the cursor in B3, pressing + would jump the cursor to cell B7, pressing that shortcut again would move the cursor to the last line of the spreadsheet to B65536. There&#39;s an equivalent method: &quot;End()&quot;.&lt;br /&gt;
&lt;br /&gt;
Finding the last row with data:&lt;br /&gt;
&lt;br /&gt;
sheet.range(&quot;b3&quot;).end(-4121).address   # &gt;&gt; &quot;$B$7&quot;&lt;br /&gt;
&lt;br /&gt;
The parameter indicates the direction, the Excel constants are:&lt;br /&gt;
&lt;br /&gt;
xlDown    = -4121&lt;br /&gt;
xlToLeft  = -4159&lt;br /&gt;
xlToRight = -4161&lt;br /&gt;
xlUp      = -4162&lt;br /&gt;
&lt;br /&gt;
Saving to CSV (or other formats)&lt;br /&gt;
&lt;br /&gt;
Note that Excel can show quite a lot of warnings / confirm request. To supress these:&lt;br /&gt;
&lt;br /&gt;
excel.DisplayAlerts = false&lt;br /&gt;
&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
workbook.SaveAs &#39;myfile.csv&#39;, xlCSV&lt;br /&gt;
&lt;br /&gt;
where xlCSV = 6.&lt;br /&gt;
&lt;br /&gt;
Here are some common file formats:&lt;br /&gt;
&lt;br /&gt;
xlCSV=6&lt;br /&gt;
xlCSVMac=22&lt;br /&gt;
xlCSVMSDOS=24&lt;br /&gt;
xlCSVWindows=23&lt;br /&gt;
xlCurrentPlatformText=-4158&lt;br /&gt;
xlExcel9795=43&lt;br /&gt;
xlTextMSDOS=21&lt;br /&gt;
xlTextPrinter=36&lt;br /&gt;
xlTextWindows=20&lt;br /&gt;
&lt;br /&gt;
See also: ScriptingOutlook, ScriptingAccess&lt;br /&gt;
&lt;br /&gt;
- How about OpenOffice and Ruby scripting? Anything in this area? The examples all seem to rely on&lt;br /&gt;
&lt;br /&gt;
require &#39;win32ole&#39;</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/4893125665659814664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/06/ruby-scripting-with-excel_03.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4893125665659814664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4893125665659814664'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/06/ruby-scripting-with-excel_03.html' title='Ruby scripting with Excel'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-7209683039866308744</id><published>2011-06-03T03:28:00.000-07:00</published><updated>2011-06-03T03:28:19.557-07:00</updated><title type='text'>Web Application Testing in Ruby: Web Application Testing in Ruby: Ruby scripting with Excel</title><content type='html'>&lt;a href=&quot;http://www.watirtesting.com/2011/06/web-application-testing-in-ruby-ruby.html&quot;&gt;Web Application Testing in Ruby: Web Application Testing in Ruby: Ruby scripting with Excel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;reading data from spreadsheet&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;worksheet.Range(&#39;a12&#39;)[&#39;Value&#39;]  #get value of single cell&lt;br /&gt;data = worksheet.Range(&#39;a1:c12&#39;)[&#39;Value&#39;] #read into 2D array</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/7209683039866308744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/06/web-application-testing-in-ruby-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/7209683039866308744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/7209683039866308744'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/06/web-application-testing-in-ruby-web.html' title='Web Application Testing in Ruby: Web Application Testing in Ruby: Ruby scripting with Excel'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-5459520048664082406</id><published>2011-06-03T03:24:00.000-07:00</published><updated>2011-06-03T03:24:48.898-07:00</updated><title type='text'>Web Application Testing in Ruby: Ruby scripting with Excel</title><content type='html'>&lt;a href=&quot;http://www.watirtesting.com/2011/06/ruby-scripting-with-excel.html&quot;&gt;Web Application Testing in Ruby: Ruby scripting with Excel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Opening spreadsheets, accessing workbooks and worksheets&lt;/strong&gt;&lt;br /&gt;excel = WIN32OLE::new(&#39;excel.Application&#39;)&lt;br /&gt;workbook = excel.Workbooks.Open(&#39;c:\examples\spreadsheet.xls&#39;)&lt;br /&gt;worksheet = workbook.Worksheets(1) #get hold of the first worksheet&lt;br /&gt;worksheet.Select  #bring it to the front -need sometimes to run macros, &lt;br /&gt;#    not for working with a worksheet from ruby&lt;br /&gt;excel[&#39;Visible&#39;] = true #make visible, set to false to make invisible &lt;br /&gt;#    again. Don&#39;t need it to be visible for script to work</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/5459520048664082406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/06/web-application-testing-in-ruby-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/5459520048664082406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/5459520048664082406'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/06/web-application-testing-in-ruby-ruby.html' title='Web Application Testing in Ruby: Ruby scripting with Excel'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-4268340120751262674</id><published>2011-06-03T03:23:00.001-07:00</published><updated>2011-06-03T03:23:37.742-07:00</updated><title type='text'>Ruby scripting with Excel</title><content type='html'>&lt;b&gt;First of all:&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
require &#39;win32ole&#39;</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/4268340120751262674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/06/ruby-scripting-with-excel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4268340120751262674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4268340120751262674'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/06/ruby-scripting-with-excel.html' title='Ruby scripting with Excel'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-6865403992918908314</id><published>2011-05-14T05:45:00.000-07:00</published><updated>2011-05-14T05:45:18.999-07:00</updated><title type='text'>Nested frames</title><content type='html'>&lt;a href=&quot;http://www.watirtesting.com/2011/05/frames-many-web-applications-use-frames.html&quot;&gt;Web Application Testing in Ruby&lt;/a&gt;&lt;br /&gt;Nested Frames&lt;br /&gt;Sometimes a web page that is referenced by the &lt;rame&gt; tag is also a page that contains a &lt;rameset&gt; tag. This is a nested frame. To deal with this, simply access the nested frame like this:&lt;br /&gt;&lt;br /&gt;ie.rame(:name, &quot;rame&quot;).rame(:name, &quot;nested_frame&quot;)</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/6865403992918908314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/05/nested-frames.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/6865403992918908314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/6865403992918908314'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/05/nested-frames.html' title='Nested frames'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-8718370990593394811</id><published>2011-05-14T05:43:00.000-07:00</published><updated>2011-05-14T05:43:40.152-07:00</updated><title type='text'>Web Application Testing in Ruby</title><content type='html'>&lt;a href=&quot;http://www.watirtesting.com/2011/05/frames-many-web-applications-use-frames.html&quot;&gt;Web Application Testing in Ruby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IFrames&lt;br /&gt;Firewatir (and maybe Watir and Watir-webdriver too) is somewhat stateful when interacting with iframes.  Calling frame.locate switches Firewatir&#39;s internal context into the frame.  Once Firewatir&#39;s internal context is switched to the iframe code can interact with that frame&#39;s elements.  However, interacting with those elements resets Firewatir&#39;s context back to the root document.  So repeated calls to locate can be used to establish the right internal context before subsequent element interactions.  Related bug.  Here is a code snippet used to interact with an AJAX button in an iframe that does not respond to click events, but rather responds to a sequence of mousedown/mouseup events.&lt;br /&gt;&lt;br /&gt;browser.frame(:index, 1).locate&lt;br /&gt;browser.div(:id, &quot;somebutton&quot;).fire_event(&quot;onmousedown&quot;)&lt;br /&gt;browser.frame(:index, 1).locate&lt;br /&gt;browser.div(:id, &quot;somebutton&quot;).fire_event(&quot;onmouseup&quot;)</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/8718370990593394811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/05/web-application-testing-in-ruby_14.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8718370990593394811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8718370990593394811'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/05/web-application-testing-in-ruby_14.html' title='Web Application Testing in Ruby'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-5485723164494148544</id><published>2011-05-14T05:42:00.000-07:00</published><updated>2011-05-14T05:42:12.482-07:00</updated><title type='text'>Web Application Testing in Ruby</title><content type='html'>&lt;a href=&quot;http://www.watirtesting.com/2011/05/frames-many-web-applications-use-frames.html&quot;&gt;Web Application Testing in Ruby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Why do I get an access denied error when trying to access a frame?&lt;br /&gt;This error message is due to Internet Explorer&#39;s attempt to prevent cross-window domain scripting (also known as cross-site scripting, or XSS).  For security reasons, IE prevents embedded code in one frame from accessing another if the frame contents come from different domains. Watir runs into the same barriers when you attempt to navigate from a page hosted from one site to a frame hosted by another.&lt;br /&gt;&lt;br /&gt;You may try one or more of the following methods to resolve this issue:&lt;br /&gt;&lt;br /&gt;Navigate directly to the subframe (and the server that hosts it).  That is, instead of having your script click on the link, use ie.goto(&quot;http://www.thenewsite.com/framecontents.html&quot;).&lt;br /&gt;Add the particular host to the Internet Explorer Trusted Sites list.  From IE&#39;s menu bar, choose Tools / Internet Options; click on the Security tab; click on the Trusted Sites icon; click on the Sites... button; type the name of the site into the field labelled &quot;Add this Web site to the zone:&quot;.  You may need to uncheck the box labelled &quot;Require server verification ( https: ) for all sites in this zone.&quot;  Click OK to finish the process.&lt;br /&gt;Create an alias in the hosts file.  This text file is typically in the folder c:\windows\system32\drivers\etc.  Add a line in the form&lt;br /&gt;    192.168.10.32 foosystem&lt;br /&gt;    &lt;br /&gt;Replace 192.168.10.32 with the IP address of the host that is serving up the frame contents.  Then access the frame using https://foosystem/testsystem.&lt;br /&gt;Set Internet Explorer to its lowest possible security setting.  From IE&#39;s menu bar, choose Tools / Internet Options; click on the Security tab; click on the Default Level button, and slide the slider to the Low setting; then click on OK to finish the process.&lt;br /&gt;Watir 1.4 If none of these work, and you are still getting annoying error messages about Access Denied when your scripts run, you can turn off these warnings. &lt;br /&gt;&lt;br /&gt;ie.logger.level = Logger::ERROR</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/5485723164494148544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/05/web-application-testing-in-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/5485723164494148544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/5485723164494148544'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/05/web-application-testing-in-ruby.html' title='Web Application Testing in Ruby'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-8388285002848180526</id><published>2011-05-14T05:41:00.001-07:00</published><updated>2011-05-14T05:41:09.517-07:00</updated><title type='text'></title><content type='html'>Frames&lt;br /&gt;
Many web applications use frames. If you are having trouble accessing objects on a web page, be sure to check to see if the application is using frames. To find out, view the source of the page and look for &lt;frame&gt; or &lt;iframe&gt; HTML tags. It will look something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;frameset cols=&quot;*,*&quot;&gt;&lt;br /&gt;
  &lt;frame src=&quot;menu.htm&quot; name=&quot;menu&quot;&gt;&lt;br /&gt;
  &lt;frame src=&quot;main.htm&quot; name=&quot;main&quot;&gt;&lt;br /&gt;
&lt;/frameset&gt;&lt;br /&gt;
In the HTML above, we have a menu frame on the left and a main frame on the right.&lt;br /&gt;
&lt;br /&gt;
You can use Watir to find out if your page has frames:&lt;br /&gt;
&lt;br /&gt;
ie.show_frames&lt;br /&gt;
This is a good method to use with IRB. It prints out the index and the name of the frames in the current page. Like this:&lt;br /&gt;
&lt;br /&gt;
irb(main):009:0&gt; ie.show_frames&lt;br /&gt;
there are 2 frames&lt;br /&gt;
frame  index: 1 name: menu&lt;br /&gt;
frame  index: 2 name: main&lt;br /&gt;
=&gt; 0..1&lt;br /&gt;
Watir allows access to frame objects by identifying them by the attributes available in the &lt;frame&gt; HTML tag or by frame&#39;s index. Common attributes are id, name and src. For complete list see HTML Elements Supported by Watir.&lt;br /&gt;
&lt;br /&gt;
name Attribute&lt;br /&gt;
Watir code to access a frame using name attribute:&lt;br /&gt;
&lt;br /&gt;
ie.frame(:name, &quot;menu&quot;)&lt;br /&gt;
To access individual objects within that frame, you prefix the object using the Watir code above. If we had a link in the menu frame:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;index.htm&quot;&gt;Click Menu Item&lt;/a&gt;&lt;br /&gt;
we could click it like this:&lt;br /&gt;
&lt;br /&gt;
ie.frame(:name, &quot;menu&quot;).link(:text, &quot;Click Menu Item&quot;).click&lt;br /&gt;
Nested Frames&lt;br /&gt;
Sometimes a web page that is referenced by the &lt;frame&gt; tag is also a page that contains a &lt;frameset&gt; tag. This is a nested frame. To deal with this, simply access the nested frame like this:&lt;br /&gt;
&lt;br /&gt;
ie.frame(:name, &quot;frame&quot;).frame(:name, &quot;nested_frame&quot;)&lt;br /&gt;
IFrames&lt;br /&gt;
Firewatir (and maybe Watir and Watir-webdriver too) is somewhat stateful when interacting with iframes.  Calling frame.locate switches Firewatir&#39;s internal context into the frame.  Once Firewatir&#39;s internal context is switched to the iframe code can interact with that frame&#39;s elements.  However, interacting with those elements resets Firewatir&#39;s context back to the root document.  So repeated calls to locate can be used to establish the right internal context before subsequent element interactions.  Related bug.  Here is a code snippet used to interact with an AJAX button in an iframe that does not respond to click events, but rather responds to a sequence of mousedown/mouseup events.&lt;br /&gt;
&lt;br /&gt;
browser.frame(:index, 1).locate&lt;br /&gt;
browser.div(:id, &quot;somebutton&quot;).fire_event(&quot;onmousedown&quot;)&lt;br /&gt;
browser.frame(:index, 1).locate&lt;br /&gt;
browser.div(:id, &quot;somebutton&quot;).fire_event(&quot;onmouseup&quot;)&lt;br /&gt;
Why do I get an access denied error when trying to access a frame?&lt;br /&gt;
This error message is due to Internet Explorer&#39;s attempt to prevent cross-window domain scripting (also known as cross-site scripting, or XSS).  For security reasons, IE prevents embedded code in one frame from accessing another if the frame contents come from different domains. Watir runs into the same barriers when you attempt to navigate from a page hosted from one site to a frame hosted by another.&lt;br /&gt;
&lt;br /&gt;
You may try one or more of the following methods to resolve this issue:&lt;br /&gt;
&lt;br /&gt;
Navigate directly to the subframe (and the server that hosts it).  That is, instead of having your script click on the link, use ie.goto(&quot;http://www.thenewsite.com/framecontents.html&quot;).&lt;br /&gt;
Add the particular host to the Internet Explorer Trusted Sites list.  From IE&#39;s menu bar, choose Tools / Internet Options; click on the Security tab; click on the Trusted Sites icon; click on the Sites... button; type the name of the site into the field labelled &quot;Add this Web site to the zone:&quot;.  You may need to uncheck the box labelled &quot;Require server verification ( https: ) for all sites in this zone.&quot;  Click OK to finish the process.&lt;br /&gt;
Create an alias in the hosts file.  This text file is typically in the folder c:\windows\system32\drivers\etc.  Add a line in the form&lt;br /&gt;
    192.168.10.32 foosystem&lt;br /&gt;
    &lt;br /&gt;
Replace 192.168.10.32 with the IP address of the host that is serving up the frame contents.  Then access the frame using https://foosystem/testsystem.&lt;br /&gt;
Set Internet Explorer to its lowest possible security setting.  From IE&#39;s menu bar, choose Tools / Internet Options; click on the Security tab; click on the Default Level button, and slide the slider to the Low setting; then click on OK to finish the process.&lt;br /&gt;
Watir 1.4 If none of these work, and you are still getting annoying error messages about Access Denied when your scripts run, you can turn off these warnings. &lt;br /&gt;
&lt;br /&gt;
ie.logger.level = Logger::ERROR&lt;br /&gt;
    </content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/8388285002848180526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/05/frames-many-web-applications-use-frames.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8388285002848180526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8388285002848180526'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/05/frames-many-web-applications-use-frames.html' title=''/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-5909013539995789541</id><published>2011-05-14T05:37:00.001-07:00</published><updated>2011-05-14T05:37:58.916-07:00</updated><title type='text'>How do I use OpenOffice.org Calc with Watir for data-driven tests?</title><content type='html'>Similar to Excel and the rest of Microsoft Office, OpenOffice.org is enabled for automation using a COM/OLE-like interface called UNO. So here&#39;s a brief example of how to access your Excel or OpenOffice.org spreadsheet using UNO, the Ruby Windows OLE interface, and OpenOffice.org.&lt;br /&gt;
&lt;br /&gt;
require &quot;win32ole&quot;&lt;br /&gt;
&lt;br /&gt;
noArgs = []&lt;br /&gt;
file_uri = &quot;file:///c:/test.ods&quot;&lt;br /&gt;
&lt;br /&gt;
serviceManager = WIN32OLE.new(&quot;com.sun.star.ServiceManager&quot;)&lt;br /&gt;
coreReflection = serviceManager.createInstance(&quot;com.sun.star.reflection.CoreReflection&quot;)&lt;br /&gt;
desktop = serviceManager.creatInstance(&quot;com.sun.star.frame.Desktop&quot;)&lt;br /&gt;
spreadsheet = desktop.loadComponentFromURL (file_uri, &quot;_blank&quot;, 0, noArgs)&lt;br /&gt;
sheetsCollection = spreadsheet.Sheets&lt;br /&gt;
sheet1 = sheetsCollection.getByIndex(0)&lt;br /&gt;
cellA1Formula = sheet1.getCellByPosition(0, 0).Formula # Gets text or number or whatever is in the cell&lt;br /&gt;
cellA1NumericValue = sheet1.getCellByPosition(0, 0).Value # Gets numerical value of the cell&lt;br /&gt;
cell1A = sheet1.getCellByPosition(0, 0) # Gets cell 1A&lt;br /&gt;
cell1A.Formula = &quot;Nathan Lane&quot; # Sets the formula for cell 1A to &quot;Nathan Lane&quot;</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/5909013539995789541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/05/how-do-i-use-openofficeorg-calc-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/5909013539995789541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/5909013539995789541'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/05/how-do-i-use-openofficeorg-calc-with.html' title='How do I use OpenOffice.org Calc with Watir for data-driven tests?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-4353805133597792364</id><published>2011-05-14T05:36:00.000-07:00</published><updated>2011-05-14T05:36:40.034-07:00</updated><title type='text'>What is Data-Driven Tests in Watir ? How do I use Excel with Watir for data-driven tests?</title><content type='html'>Data-Driven Tests&lt;br /&gt;
How do I use Excel with Watir for data-driven tests?&lt;br /&gt;
require &#39;win32ole&#39;&lt;br /&gt;
&lt;br /&gt;
excel = WIN32OLE::new(&quot;excel.Application&quot;)&lt;br /&gt;
workbook = excel.Workbooks.Open(&quot;c:\\examples\\example_sheet.xls&quot;)&lt;br /&gt;
&lt;br /&gt;
worksheet = workbook.WorkSheets(1) # get first workbook&lt;br /&gt;
worksheet.Select # just to make sure macros are executed, if your sheet doesn&#39;t have macros you can skip this step.&lt;br /&gt;
   &lt;br /&gt;
value = worksheet.Range(&quot;a12&quot;).Value # get the value at cell a12 in worksheet.&lt;br /&gt;
   &lt;br /&gt;
data = worksheet.Range(&quot;a1:c12&quot;).Value # returns 2D array with values starting from cell a1 to cell c12</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/4353805133597792364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/05/what-is-data-driven-tests-in-watir-how.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4353805133597792364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4353805133597792364'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/05/what-is-data-driven-tests-in-watir-how.html' title='What is Data-Driven Tests in Watir ? How do I use Excel with Watir for data-driven tests?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-4928907131968276073</id><published>2011-05-14T05:30:00.001-07:00</published><updated>2011-05-14T05:30:19.711-07:00</updated><title type='text'>Latest Interview questions and answers on Ruby scripting</title><content type='html'>What is a class?&lt;br /&gt;
&lt;br /&gt;
A text-book answer: classes are a blue-print for constructing computer models for real or virtual objects… boring.&lt;br /&gt;
&lt;br /&gt;
In reality: classes hold data, have methods that interact with that data, and are used to instantiate objects.&lt;br /&gt;
&lt;br /&gt;
Like this.&lt;br /&gt;
&lt;br /&gt;
class WhatAreClasses  &lt;br /&gt;
  def initialize  &lt;br /&gt;
    @data = &quot;I&#39;m instance data of this object. Hello.&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
  def method  &lt;br /&gt;
    puts @data.gsub(&quot;instance&quot;, &quot;altered&quot;)  &lt;br /&gt;
  end  &lt;br /&gt;
end  &lt;br /&gt;
object = WhatAreClasses.new  &lt;br /&gt;
object.method  &lt;br /&gt;
 #=&gt; I&#39;m altered data of this object. Hello.  &lt;br /&gt;
What is an object?&lt;br /&gt;
&lt;br /&gt;
An instance of a class.&lt;br /&gt;
&lt;br /&gt;
To some, it’s also the root class in ruby (Object).&lt;br /&gt;
&lt;br /&gt;
Classes themselves descend from the Object root class. (Kudos to Ezra)&lt;br /&gt;
&lt;br /&gt;
What is a module? Can you tell me the difference between classes and modules?&lt;br /&gt;
&lt;br /&gt;
Modules serve as a mechanism for namespaces.&lt;br /&gt;
&lt;br /&gt;
module ANamespace  &lt;br /&gt;
  class AClass  &lt;br /&gt;
    def initialize  &lt;br /&gt;
      puts &quot;Another object, coming right up!&quot;  &lt;br /&gt;
    end  &lt;br /&gt;
  end  &lt;br /&gt;
end  &lt;br /&gt;
ANamespace::AClass.new  &lt;br /&gt;
 #=&gt; Another object, coming right up!  &lt;br /&gt;
Also, modules provide as a mechanism for multiple inheritance via mix-ins and cannot be instantiated like classes can.&lt;br /&gt;
&lt;br /&gt;
module AMixIn  &lt;br /&gt;
  def who_am_i?  &lt;br /&gt;
    puts &quot;An existentialist, that&#39;s who.&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
end   &lt;br /&gt;
 # String is already the parent class  &lt;br /&gt;
class DeepString &lt; String  
  # extend adds instance methods from AMixIn as class methods  
  extend AMixIn  
end  
DeepString.who_am_i?  
 #=&gt; An existentialist, that&#39;s who.  &lt;br /&gt;
AMixIn.new  &lt;br /&gt;
 #=&gt; NoMethodError: undefined method ‘new’ for AMixIn:Module  &lt;br /&gt;
Can you tell me the three levels of method access control for classes and modules? What do they imply about the method?&lt;br /&gt;
&lt;br /&gt;
All methods, no matter the access control, can be accessed within the class. But what about outside callers?&lt;br /&gt;
&lt;br /&gt;
Public methods enforce no access control — they can be called in any scope.&lt;br /&gt;
&lt;br /&gt;
Protected methods are only accessible to other objects of the same class.&lt;br /&gt;
&lt;br /&gt;
Private methods are only accessible within the context of the current object.&lt;br /&gt;
&lt;br /&gt;
class AccessLevel  &lt;br /&gt;
  def something_interesting  &lt;br /&gt;
    another = AccessLevel.new  &lt;br /&gt;
    another.public_method  &lt;br /&gt;
    another.protected_method  &lt;br /&gt;
    another.private_method  &lt;br /&gt;
  end  &lt;br /&gt;
  def public_method  &lt;br /&gt;
    puts &quot;Public method. Nice to meet you.&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
  protected  &lt;br /&gt;
  def protected_method  &lt;br /&gt;
    puts &quot;Protected method. Sweet!&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
  private   &lt;br /&gt;
  def private_method  &lt;br /&gt;
    puts &quot;Incoming exception!&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
end  &lt;br /&gt;
AccessLevel.new.something_interesting  &lt;br /&gt;
 #=&gt; Public method.  Nice to meet you.  &lt;br /&gt;
 #=&gt; Protected method.  Sweet!  &lt;br /&gt;
 #=&gt; NoMethodError: private method ‘private_method’ called for  &lt;br /&gt;
 #=&gt;  #&lt;AccessLevel:0x898c8&gt;  &lt;br /&gt;
There are three ways to invoke a method in ruby. Can you give me at least two?&lt;br /&gt;
&lt;br /&gt;
Here, I’m looking for the dot operator (or period operator), the Object#send method, or method(:foo).call&lt;br /&gt;
&lt;br /&gt;
object = Object.new  &lt;br /&gt;
puts object.object_id  &lt;br /&gt;
 #=&gt; 282660  &lt;br /&gt;
puts object.send(:object_id)  &lt;br /&gt;
 #=&gt; 282660  &lt;br /&gt;
puts object.method(:object_id).call # (Kudos to Ezra)  &lt;br /&gt;
 #=&gt; 282660  &lt;br /&gt;
Separating the professional from the hobbyist&lt;br /&gt;
Senior programmers should be able to give competent answers for all questions. Junior programmers should answer some correct, but usually won’t know them all.&lt;br /&gt;
&lt;br /&gt;
Explain this ruby idiom: a ||= b&lt;br /&gt;
&lt;br /&gt;
A common idiom that strong ruby developers use all the time.&lt;br /&gt;
&lt;br /&gt;
# a = b when a == false  &lt;br /&gt;
# otherwise a remains unchanged  &lt;br /&gt;
a || a = b # (Kudos to Markus Prinz)  &lt;br /&gt;
a = 1  &lt;br /&gt;
b = 2  &lt;br /&gt;
a ||= b #=&gt; a = 1  &lt;br /&gt;
a = nil  &lt;br /&gt;
b = 2  &lt;br /&gt;
a ||= b #=&gt; a = 2  &lt;br /&gt;
a = false  &lt;br /&gt;
b = 2  &lt;br /&gt;
a ||= b #=&gt; a = 2  &lt;br /&gt;
What does self mean?&lt;br /&gt;
&lt;br /&gt;
self always refers to the current object. But this question is more difficult than it seems because Classes are also objects in ruby. (Kudos to Stephen)&lt;br /&gt;
&lt;br /&gt;
class WhatIsSelf  &lt;br /&gt;
  def test  &lt;br /&gt;
    puts &quot;At the instance level, self is #{self}&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
  def self.test  &lt;br /&gt;
    puts &quot;At the class level, self is #{self}&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
end  &lt;br /&gt;
WhatIsSelf.test   &lt;br /&gt;
 #=&gt; At the class level, self is WhatIsSelf  &lt;br /&gt;
WhatIsSelf.new.test   &lt;br /&gt;
 #=&gt; At the instance level, self is #&lt;WhatIsSelf:0x28190&gt;  &lt;br /&gt;
This short snippet indicates two things:&lt;br /&gt;
&lt;br /&gt;
at the class level, self is the class, in this case WhatIsSelf.&lt;br /&gt;
at the instance level, self is the instance in context, in this case the instance of WhatIsSelf at memory location 0×28190.&lt;br /&gt;
What is a Proc?&lt;br /&gt;
&lt;br /&gt;
Everyone usually confuses procs with blocks, but the strongest rubyist can grok the true meaning of the question.&lt;br /&gt;
&lt;br /&gt;
Essentially, Procs are anonymous methods (or nameless functions) containing code. They can be placed inside a variable and passed around like any other object or scalar value. They are created by Proc.new, lambda, and blocks (invoked by the yield keyword).&lt;br /&gt;
&lt;br /&gt;
Note: Procs and lambdas do have subtle, but important, differences in ruby v1.8.6. However, I wouldn’t expect a candidate talk about these nitty-gritty details during an interview. (Kudos to Noah Thorp)&lt;br /&gt;
&lt;br /&gt;
 # wants a proc, a lambda, AND a block  &lt;br /&gt;
def three_ways(proc, lambda, &amp;block)  &lt;br /&gt;
  proc.call  &lt;br /&gt;
  lambda.call  &lt;br /&gt;
  yield # like block.call  &lt;br /&gt;
  puts &quot;#{proc.inspect} #{lambda.inspect} #{block.inspect}&quot;  &lt;br /&gt;
end  &lt;br /&gt;
anonymous = Proc.new { puts &quot;I&#39;m a Proc for sure.&quot; }  &lt;br /&gt;
nameless  = lambda { puts &quot;But what about me?&quot; }  &lt;br /&gt;
three_ways(anonymous, nameless) do  &lt;br /&gt;
  puts &quot;I&#39;m a block, but could it be???&quot;  &lt;br /&gt;
end  &lt;br /&gt;
 #=&gt; I&#39;m a Proc for sure.  &lt;br /&gt;
 #=&gt; But what about me?  &lt;br /&gt;
 #=&gt; I&#39;m a block, but could it be???  &lt;br /&gt;
 #=&gt; #&lt;Proc:0x00089d64&gt; #&lt;Proc:0x00089c74&gt; #&lt;Proc:0x00089b34&gt;  &lt;br /&gt;
What is unit testing (in classical terms)? What is the primary technique when writing a test?&lt;br /&gt;
&lt;br /&gt;
The strongest candidates should be quite comfortable with test or behavior driven development.&lt;br /&gt;
&lt;br /&gt;
Unit testing, simply put, is testing methods — the smallest unit in object-oriented programming. Strong candidates will argue that it allows a developer to flesh out their API before it’s consumed by other systems in the application.&lt;br /&gt;
&lt;br /&gt;
The primary way to achieve this is to assert that the actual result of the method matches an expected result.&lt;br /&gt;
&lt;br /&gt;
require &quot;test/unit&quot;  &lt;br /&gt;
class Brokened  &lt;br /&gt;
  def uh_oh  &lt;br /&gt;
    &quot;I needs fixing&quot;  &lt;br /&gt;
  end  &lt;br /&gt;
end  &lt;br /&gt;
class BrokenedTest &lt; Test::Unit::TestCase  
  def test_uh_oh  
    actual = Brokened.new  
    assert_equal(&quot;I&#39;m all better!&quot;, actual.uh_oh)  
  end  
end  
 #=&gt; Started  &lt;br /&gt;
 #=&gt; F  &lt;br /&gt;
 #=&gt; Finished in 0.663831 seconds.  &lt;br /&gt;
 #=&gt;   &lt;br /&gt;
 #=&gt;   1) Failure:  &lt;br /&gt;
 #=&gt; test_uh_oh:11  &lt;br /&gt;
 #=&gt; &lt;&quot;I&#39;m all better!&quot;&gt; expected but was  &lt;br /&gt;
 #=&gt; &lt;&quot;I needs fixing&quot;&gt;.  &lt;br /&gt;
 #=&gt;   &lt;br /&gt;
 #=&gt; 1 tests, 1 assertions, 1 failures, 0 errors  &lt;br /&gt;
Show me the money!&lt;br /&gt;
Variable typing is one of those topics that everyone sort of understands it, but is hard to put it into words. I’ve iterated and improved the next series of questions to really test a senior level candidate’s knowledge of static and dynamic typing. This is my best attempt so far.&lt;br /&gt;
&lt;br /&gt;
What is the primary difference in these two code snippets?&lt;br /&gt;
&lt;br /&gt;
// Java  &lt;br /&gt;
public boolean isEmpty(String s) {  &lt;br /&gt;
  return s.length() == 0;  &lt;br /&gt;
}  &lt;br /&gt;
# ruby  &lt;br /&gt;
def empty?(s)  &lt;br /&gt;
  return s.size == 0  &lt;br /&gt;
end  &lt;br /&gt;
The Java method only accepts Strings as arguments and only returns a boolean while…&lt;br /&gt;
&lt;br /&gt;
The ruby method accepts any Object and could return anything, but in this case will return a boolean if executed without exceptions.&lt;br /&gt;
&lt;br /&gt;
What does this say about the advantages of ruby’s dynamic (duck) typed system?&lt;br /&gt;
&lt;br /&gt;
That ruby program use less code and are more flexible.&lt;br /&gt;
&lt;br /&gt;
What are some disadvantages (real and potential)?&lt;br /&gt;
&lt;br /&gt;
Developers cannot be 100% certain that all arguments sent this empty? method will have a size method that is publicly accessible. Also, ruby is an interpreted language and it may take longer to run than compiled programs, such as Java, that are programmed similarly.&lt;br /&gt;
&lt;br /&gt;
What could a developer do to address these disadvantages?&lt;br /&gt;
&lt;br /&gt;
She could write unit tests or specs to ensure her application behaves as intended. She could also profile her application with tools like the unix time command, the ruby Benchmark class, and the ruby library called ruby-prof.&lt;br /&gt;
&lt;br /&gt;
A cunning programmer would also argue that these two techniques ought to be used for both static and dynamic languages when developing complex systems.&lt;br /&gt;
&lt;br /&gt;
Wrapping things up&lt;br /&gt;
To finish up with, I like to lob in some easy ones again. Plus I’m like to scratch my own curiosity about a candidates relationship with the ruby community.&lt;br /&gt;
&lt;br /&gt;
What are rubygems? Any favorites not including rails? Any that you’ve worked on personally?&lt;br /&gt;
&lt;br /&gt;
rubygems is package manager software for ruby libraries (i.e. gems). The package manager has basic CRUD operations, dependency trees, and supports asynchronous communication between multiple gem servers.</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/4928907131968276073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/05/latest-interview-questions-and-answers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4928907131968276073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4928907131968276073'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/05/latest-interview-questions-and-answers.html' title='Latest Interview questions and answers on Ruby scripting'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-7815690538884789545</id><published>2011-04-15T05:52:00.000-07:00</published><updated>2013-07-30T03:56:20.901-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Services"/><title type='text'>Services</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Services&lt;br /&gt;
&lt;br /&gt;
We have done several projects on Ruby Watir testing and QTP Automation testing.To discuss how we can help you, please contact us on Services@watirtesting.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Key Points&lt;br /&gt;
&lt;br /&gt;
Team of 15+ dedicated WATIR script developers and QTP Experts.&lt;br /&gt;
Regularly updated on enhancements made to WATIR.&lt;br /&gt;
4+ years of experience in WATIR and QTP Automated Test Development.&lt;br /&gt;
Clients satisfied with a cheaper and effective automation effort.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Online Training (WATIR/QTP,Ruby Scripting/VB Scripting).&lt;br /&gt;
Online Training (WATIR Frameworks/QTP Frameworks).&lt;br /&gt;
Online Training (Ruby Scripting/VB Scripting).&lt;br /&gt;
selling WATIR Frameworks/Ruby Frameworks.&lt;br /&gt;
Setup of Testing Environment for Automation Testing.&lt;br /&gt;
Providing candidates for Automation Testing.&lt;br /&gt;
Project work for Automation Testing Testing.&lt;br /&gt;
Project Work on contract Basis.&lt;br /&gt;
&lt;br /&gt;
Other Services Like Load Testing, Performance Testing, Manual Testing and web development.&lt;br /&gt;
&lt;br /&gt;
Please mail me &lt;br /&gt;
sales@hlworldtech.com&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/7815690538884789545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/04/online-services.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/7815690538884789545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/7815690538884789545'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/04/online-services.html' title='Services'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-8555941549924577485</id><published>2011-02-22T00:00:00.000-08:00</published><updated>2011-04-11T07:59:05.539-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><title type='text'>What is TRM?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/what-is-stub.html&quot;&gt;Web Application Testing in Ruby: What is stub?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;TRM means Test Responsibility Matrix. &lt;br /&gt;&lt;br /&gt;TRM: --- It indicates mapping between test factors and development stages... &lt;br /&gt;&lt;br /&gt;Test factors like: &lt;br /&gt;Ease of use, reliability, portability, authorization, access control, audit trail, ease of operates, maintainable... Like dat... &lt;br /&gt;Development stages... &lt;br /&gt;Requirement gathering, Analysis, design, coding, testing, and maintenance</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/8555941549924577485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-trm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8555941549924577485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8555941549924577485'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-trm.html' title='What is TRM?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-6516137834595237498</id><published>2011-02-21T23:59:00.000-08:00</published><updated>2011-04-11T07:57:17.331-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>What is release notes?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/what-is-stub.html&quot;&gt;Web Application Testing in Ruby: What is stub?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It&#39;s a document released along with the product which explains about the product. It also contains about the bugs that are in deferred status.</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/6516137834595237498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-release-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/6516137834595237498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/6516137834595237498'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-release-notes.html' title='What is release notes?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-6090342807798185158</id><published>2011-02-21T23:58:00.000-08:00</published><updated>2011-04-11T07:57:17.332-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>What is internationalization Testing?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/what-is-stub.html&quot;&gt;Web Application Testing in Ruby: What is stub?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Software Internationalization is process of developing software products independent from cultural norms, language or other specific attributes of a market</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/6090342807798185158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-internationalization-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/6090342807798185158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/6090342807798185158'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-internationalization-testing.html' title='What is internationalization Testing?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-9099506647609157701</id><published>2011-02-21T23:56:00.000-08:00</published><updated>2011-04-11T07:57:17.332-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>What is stub?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/what-is-bidirectional-traceability.html&quot;&gt;Web Application Testing in Ruby: What is bidirectional traceability?&lt;/a&gt;&lt;br /&gt;Stub is a dummy program or component, the code is not ready for testing, it&#39;s used for testing...that means, in a project if there are 4 modules and last is remaining and there is no time then we will use dummy program to complete that fourth module and we will run whole 4 modules also. The dummy program is also known as stub</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/9099506647609157701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-stub.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/9099506647609157701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/9099506647609157701'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-stub.html' title='What is stub?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-8077442317767444807</id><published>2011-02-21T23:54:00.000-08:00</published><updated>2011-04-11T07:57:17.333-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>What is bidirectional traceability?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/what-is-agile-testing.html&quot;&gt;Web Application Testing in Ruby: What is agile testing?&lt;/a&gt;&lt;br /&gt;What is bidirectional traceability? &lt;br /&gt;&lt;br /&gt;Bidirectional traceability needs to be implemented both forward and backward (i.e., from requirements to end products and from end product back to requirements). &lt;br /&gt;When the requirements are managed well, traceability can be established from the source requirement to its lower level requirements and from the lower level requirements back to their source. Such bidirectional traceability helps determine that all source requirements have been completely addressed and that all lower level requirements can be traced to a valid source.</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/8077442317767444807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-bidirectional-traceability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8077442317767444807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/8077442317767444807'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-bidirectional-traceability.html' title='What is bidirectional traceability?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-328926117237875463</id><published>2011-02-21T23:53:00.000-08:00</published><updated>2011-04-11T07:57:17.333-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>What is agile testing?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/what-is-recovery-testing.html&quot;&gt;Web Application Testing in Ruby: What is Recovery testing?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What is agile testing? &lt;br /&gt;What is agile testing? &lt;br /&gt;&lt;br /&gt;Agile testing is used whenever customer requirements are changing dynamically&lt;br /&gt;&lt;br /&gt;If we have no SRS, BRS but we have test cases does you execute the test cases blindly or do you follow any other process.&lt;br /&gt;&lt;br /&gt;Test case would have detail steps of what the application is supposed to do. &lt;br /&gt;1) Functionality of application. &lt;br /&gt;2) In addition you can refer to Backend, is mean look into the Database. To gain more knowledge of the application.</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/328926117237875463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-agile-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/328926117237875463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/328926117237875463'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-agile-testing.html' title='What is agile testing?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-4353505803318167680</id><published>2011-02-21T23:48:00.000-08:00</published><updated>2011-04-11T07:57:17.334-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>What is Recovery testing?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/what-is-recovery-testing.html&quot;&gt;Web Application Testing in Ruby: What is Recovery testing?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Recovery Testing is the testing which is used to find how &lt;br /&gt;well the application will get recover from crashes.</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/4353505803318167680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-recovery-testing_21.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4353505803318167680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/4353505803318167680'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-recovery-testing_21.html' title='What is Recovery testing?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-3749893256757234534</id><published>2011-02-21T23:47:00.000-08:00</published><updated>2011-04-11T07:57:17.334-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="General Testing"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>What is Recovery testing?</title><content type='html'>Evaluates the contigency features are built in the &lt;br /&gt;
application for handling interruptions and to return to &lt;br /&gt;
specific check points. This test also assures that disaster &lt;br /&gt;
recovery if possible.</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/3749893256757234534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-recovery-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/3749893256757234534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/3749893256757234534'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/what-is-recovery-testing.html' title='What is Recovery testing?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-1673871408604389780</id><published>2011-02-09T20:31:00.000-08:00</published><updated>2011-02-09T20:31:47.256-08:00</updated><title type='text'>Excel Interface Class</title><content type='html'>Summary&lt;br /&gt;
This ruby class provides simple methods for reading and writing data records to and from Excel spreadsheets. This data can then be easily used to create data-driven Watir tests. This class hides the complexities of directly using ruby&#39;s win32ole library to interface with Excel.&lt;br /&gt;
&lt;br /&gt;
Features&lt;br /&gt;
Excel Data can be identified/located on any sheet using and either a &quot;Range&quot; (e.g. &quot;A1:C20&quot;) or dynamically by searching for a specific text label above a data range&lt;br /&gt;
Excel Data formated as rows of records or as columns of records can easily be read&lt;br /&gt;
Data can be read in as an Array of Hashes (using headers as keys), a plain 2D Array, or a simple Hash of key-value pairs.&lt;br /&gt;
If the excel data file is already open, this class will simply attach to the open workbook and read its data instead of trying to re-open the file.&lt;br /&gt;
[6/22/07] Support adding and removing excel worksheets&lt;br /&gt;
[6/22/07] Support for ordered hashes, and writing them back to an excel file.&lt;br /&gt;
[6/25/07] Uploaded the RDOC documentation for the XLS class see XLS_doc.zip&lt;br /&gt;
[7/11/07] Made all get methods more flexible in how the range is specified (they now accept a string representing a literal range,a Named Range in the workbook, or a text label above a contiguous range of cells with data). This allowed me to simplify/shorten method names and to remove Redundant methods.</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/1673871408604389780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/excel-interface-class.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1673871408604389780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1673871408604389780'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/excel-interface-class.html' title='Excel Interface Class'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-1697493071378785468</id><published>2011-02-09T20:26:00.000-08:00</published><updated>2011-02-09T20:26:16.593-08:00</updated><title type='text'>Web Application Testing in Ruby: How to wait in Watir?</title><content type='html'>&lt;a href=&quot;http://watirruby.blogspot.com/2011/02/how-to-wait-in-watir.html&quot;&gt;Web Application Testing in Ruby: How to wait in Watir?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1 - New Windows&lt;br /&gt;Navigating to a new page with the existing IE window will not require you to define any special behavior. However, if you perform an action that brings up a secondary page (pop-up) you will need to define some code to wait on it&#39;s existence. Luckily, if you can deal with pop-ups with the &quot;attach&quot; method, there is already an implicit wait in the attach method. If you have a modal dialog box or other windows related dialog box (Security Alert Box, Login, File Download, etc.) you will need to create your own wait methods. See this section for more info.&lt;br /&gt;&lt;br /&gt;2 - Objects that depend on Javascript to show up&lt;br /&gt;Sometimes IE thinks it&#39;s done before everything is loaded. Unfortunately, IE#wait doesn&#39;t always work here because it exits whenever IE thinks it&#39;s done. So, if this is your problem, you will need to tell Watir to wait. There are several ways to solve this, here are two.&lt;br /&gt;&lt;br /&gt;If you want to wait forever, consider the following:&lt;br /&gt;&lt;br /&gt;sleep 1 until ie.text.include? &quot;new results are loaded&quot;&lt;br /&gt;This code will keep sleeping until the text &quot;new results are loaded&quot; appears on the page. However, you may not want to wait forever. Using the following code will wait; for the text &quot;new results are loaded&quot; to appear on the page OR 60 seconds, whichever comes first.&lt;br /&gt;&lt;br /&gt;wait_until {ie.text.include? &quot;new results are loaded&quot;}&lt;br /&gt;Sometimes you need to wait for something to happen in the Application under test before you interact with it. Sleep statements are hardcoded and lock you down into a certain number of seconds before moving through your test. To avoid that, we&#39;ve written a polling mechanism in the latest versions of Watir - the wait_until method.&lt;br /&gt;&lt;br /&gt;An example might be that you&#39;re loading the Google home page and for some reason it&#39;s taking time to load. Here&#39;s a basic contrived script with a sleep statement.&lt;br /&gt;&lt;br /&gt;require &#39;watir&#39;&lt;br /&gt;&lt;br /&gt;browser = Watir::Browser.start(&#39;http://www.google.com&#39;)&lt;br /&gt;sleep 5     # we need to wait for the page to load and on a subjective basis I&#39;ve chosen 5 seconds which works on my machine&lt;br /&gt;browser.text_field(:name, &#39;q&#39;).set(&#39;ruby poignant&#39;)&lt;br /&gt;....&lt;br /&gt;Unfortunately the sleep is hardcoded and doesn&#39;t work for anyone else on my team who have slower network connections, my connection has gotten faster, but it still waits for 5 seconds before setting the text field.&lt;br /&gt;&lt;br /&gt;Watir has a Watir::Waiter class with a wait_until method that can poll for a certain condition to return true before continuing on or erroring out. By default it checks the condition every half second up until 60 seconds. So I rewrite my code to look like this:&lt;br /&gt;&lt;br /&gt;require &#39;watir&#39;&lt;br /&gt;browser = Watir::Browser.start(&#39;http://www.google.com&#39;)&lt;br /&gt;# In this case all I care about is the text field existing, you could&lt;br /&gt;# check title, text, anything you&#39;re expecting before continuing&lt;br /&gt;Watir::Waiter::wait_until { browser.text_field(:name, &#39;q&#39;).exists? }&lt;br /&gt;browser.text_field(:name, &#39;q&#39;).set(&#39;ruby poignant&#39;)&lt;br /&gt;...&lt;br /&gt;It now works for me with a half second delay, but also works for the other members of my team who have network delays up to a minute. If you&#39;re considering using sleep, use wait_until instead. It will make your test code more resilient to timing issues in those cases where you really need to use it.&lt;br /&gt;&lt;br /&gt;3 - Handling asynchronous javascript / AJAX&lt;br /&gt;if you include asynchronous JS in your definition of done, you&#39;ll need to code around that specifically. There&#39;s an open feature request to have Watir&#39;s wait method track XHRs and timers that are launched when the page is loaded, and wait for them as well. That may be tricky to do though, and with an all-volunteer project, it really depends on someone making the time to do it.&lt;br /&gt;&lt;br /&gt;In lieu of that, one option is having the application keep track if XHRs and timers that it kicks off, and setting the some value to true when they are all complete. For example:&lt;br /&gt;&lt;br /&gt;def wait_until_loaded(timeout = 30)&lt;br /&gt;    start_time = Time.now&lt;br /&gt;    until (however_your_application_reports_its_loaded == &#39;true&#39;)  do&lt;br /&gt;      sleep 0.1&lt;br /&gt;      if Time.now - start_time&gt; timeout&lt;br /&gt;        raise RuntimeError, &quot;Timed out after #{timeout} seconds&quot;&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;A simpler option is:&lt;br /&gt;&lt;br /&gt;tries = 0&lt;br /&gt;until browser.link(:text, /link_to_wait_for/).exists? do&lt;br /&gt;  sleep 0.5&lt;br /&gt;  tries += 1&lt;br /&gt;end&lt;br /&gt;browser.link(:text, /link_to_wait_for/).click&lt;br /&gt;end&lt;br /&gt;Another option is to retry until timeout or no exception is raised.&lt;br /&gt;&lt;br /&gt;def rescue_wait_retry(exception = Watir::Exception::UnknownObjectException, times = 10, seconds = 2, &amp;block)&lt;br /&gt;  begin&lt;br /&gt;    return yield&lt;br /&gt;  rescue exception =&gt; e&lt;br /&gt;    puts &quot;Caught #{exception}: #{e}. Sleeping #{seconds} seconds.&quot; if $DEBUG&lt;br /&gt;    sleep(seconds)&lt;br /&gt;    @ie.wait&lt;br /&gt;    if (times -= 1)&gt; 0&lt;br /&gt;      puts &quot;Retrying... #{times} times left&quot; if $DEBUG&lt;br /&gt;      retry&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  yield&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;@ie.link(:url, %r|confirmdelete\.action\?educationId|).click #This starts some ajax stuff&lt;br /&gt;rescue_wait_retry { @ie.button(:id, &#39;form_0&#39;).click }&lt;br /&gt;Not sure about this one but this is a good introduction to the problem.&lt;br /&gt;&lt;br /&gt;Also, from the thread &quot;[wtr-general] SUMMARY: Enable/disable JS support in IE&quot;&lt;br /&gt;&lt;br /&gt;Q - How to check from watir code whether web page was reloaded or it was updated dynamically withJS.&lt;br /&gt;A - Not so easy to implement for HCOM application due to a lot of ajax stuff. The following code should work when JS is disabled, plus we can pass additional condition to check here (e.g. waiter for object appearance on the page). Note: $ie is global IE instance in our framework. Also I think that we need to use something like click_no_wait method to reload the page, otherwise IE.wait() method won&#39;t let us do the check until page is ready. What I was asking here is how to check that page is reloading rather than just some elements on the page are updated with JS.&lt;br /&gt;&lt;br /&gt;class Page&lt;br /&gt;    def loading?(additionalCondition = false)&lt;br /&gt;      if $ie.ie.busy || ($ie.ie.readyState != 4) || additionalCondition&lt;br /&gt;        true&lt;br /&gt;      else&lt;br /&gt;        false&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;4 - Yourself while you watch a script execute&lt;br /&gt;Maybe you are watching the script execute and you just want to slow things down for troubleshooting reasons. Of course, there is always the venerable (and oft overused) &quot;sleep&quot; method. Using &quot;sleep( x )&quot; will cause the script to pause for x seconds.&lt;br /&gt;&lt;br /&gt;If, however, you are annoyed by the slowness of your script, you can always make it faster:&lt;br /&gt;&lt;br /&gt;ie = Watir::IE.new&lt;br /&gt;ie.speed = :fast&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;ie = Watir::IE.new&lt;br /&gt;ie.speed = :zippy&lt;br /&gt;See this for more information.&lt;br /&gt;&lt;br /&gt;click_no_wait&lt;br /&gt;Information here about what this method is all about.&lt;br /&gt;&lt;br /&gt;Continuing testing if IE refuses to load a page&lt;br /&gt;When IE.attach does not find a window it throws a NoMatchingWindowFoundException. You can catch the exception instead of letting watir exit your tests. At this point you can build some &#39;recovery&#39; if you need it or simply continue or exit your test explicitly after logging some test data.&lt;br /&gt;&lt;br /&gt;require &quot;watir&quot;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  @ie = Watir::IE.attach(:url , /Webpage Dialog/) #let&#39;s say the window does not exist on the desktop&lt;br /&gt;rescue  Watir::Exception::NoMatchingWindowFoundException =&gt; e&lt;br /&gt;  puts &quot;Failed to find new pop up window! #{e}&quot;&lt;br /&gt;  # you can now recover or exit or continue&lt;br /&gt;end&lt;br /&gt;When IE.goto is invoked it implicitly waits for the page to load and runs any registered @error_checkers. If you don&#39;t have them added to browser then you can explicitly call check_for_http_errors. On HTTP errors encountered the Exception will be thrown. You can rescue the exception and continue with your test and recover or just exit after logging some test data.&lt;br /&gt;&lt;br /&gt;require &#39;watir&#39;&lt;br /&gt;@ie = Watir::IE.new #start new browser window&lt;br /&gt;@ie.goto &#39;http://asdf asdf.com&#39; #navigation to this page will load Can Not Find Server page #notice the space in url string&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  @ie.check_for_http_error # will throw Exception&lt;br /&gt;rescue Watir::Exception::NavigationException =&gt; e #catch the Exception&lt;br /&gt;  puts &quot;Page did not load: #{e}&quot; # =&gt; &#39;Cannot find server or DNS Error&#39;&lt;br /&gt;  # you can now recover or exit or just continue&lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;# OR you can register error_checker which will be called when goto is invoked&lt;br /&gt;require &#39;watir/contrib/page_checker&#39;&lt;br /&gt;@ie.add_checker(PageCheckers::NAVIGATION_CHECKER)&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  @ie.goto &quot;http://marekj.com/asdfasdfasdfa&quot;&lt;br /&gt;rescue Watir::Exception::NavigationException =&gt; e #catch the Exception&lt;br /&gt;  puts &quot;Page did not load: #{e}&quot; # =&gt; &#39;HTTP 404 - File not found&#39;&lt;br /&gt;  # you can now recover or exit or just continue&lt;br /&gt;end</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/1697493071378785468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/web-application-testing-in-ruby-how-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1697493071378785468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1697493071378785468'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/web-application-testing-in-ruby-how-to.html' title='Web Application Testing in Ruby: How to wait in Watir?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-1879032677633874660</id><published>2011-02-09T20:25:00.000-08:00</published><updated>2011-02-09T20:25:06.625-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>How to wait in Watir?</title><content type='html'>Watir does not wait for new page to load, except:&lt;br /&gt;
&lt;br /&gt;
when you &quot;attach&quot; to an existing &lt;br /&gt;
&lt;br /&gt;
window&lt;br /&gt;
use the &quot;click&quot; method&lt;br /&gt;
&quot;set&quot; or &quot;clear&quot; radio buttons or checkboxes&lt;br /&gt;
when you select an item in a select list&lt;br /&gt;
when you clear a text field&lt;br /&gt;
when you &quot;goto&quot; a new page&lt;br /&gt;
when you &quot;submit&quot; a form&lt;br /&gt;
when you &quot;back&quot;, &quot;forward&quot; or &quot;refresh&quot; the browser&lt;br /&gt;
when you &quot;fire_event&quot; on any element&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ie = Watir::IE.attach(:title, &#39;My Window&#39;)&lt;br /&gt;
# no need to wait, ie.wait called implicitly&lt;br /&gt;
ie.link(:id, &#39;mylink&#39;).click&lt;br /&gt;
# no need to wait, ie.wait called implicitly&lt;br /&gt;
assert(ie.link(:id, &#39;mynewlink).exists?)&lt;br /&gt;
&lt;br /&gt;
&quot;Watir is deterministic. Watir does not wait X seconds. It waits until the page is loaded. Period.&quot;</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/1879032677633874660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/how-to-wait-in-watir.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1879032677633874660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/1879032677633874660'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/how-to-wait-in-watir.html' title='How to wait in Watir?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry><entry><id>tag:blogger.com,1999:blog-1023602686709660760.post-7411167352867407464</id><published>2011-02-09T20:16:00.000-08:00</published><updated>2011-02-09T20:16:09.213-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ruby scripting"/><title type='text'>How do I use Ruby for shell scripting?</title><content type='html'>Dir[&#39;*.rb&#39;] #basic globs&lt;br /&gt;
Dir[&#39;**/*.rb&#39;] #** == any depth of directory, including current dir.&lt;br /&gt;
#=&gt; array of relative names&lt;br /&gt;
&lt;br /&gt;
File.expand_path(&#39;~/file.txt&#39;) #=&gt; &quot;/User/mat/file.txt&quot;&lt;br /&gt;
File.dirname(&#39;dir/file.txt&#39;) #=&gt; &#39;dir&#39;&lt;br /&gt;
File.basename(&#39;dir/file.txt&#39;) #=&gt; &#39;file.txt&#39;&lt;br /&gt;
File.join(&#39;a&#39;, &#39;bunch&#39;, &#39;of&#39;, &#39;strings&#39;) #=&gt; &#39;a/bunch/of/strings&#39;&lt;br /&gt;
&lt;br /&gt;
__FILE__ #=&gt; the name of the current file&lt;br /&gt;
Also useful from the stdlib is FileUtils&lt;br /&gt;
&lt;br /&gt;
require &#39;fileutils&#39; #I know, no underscore is not ruby-like&lt;br /&gt;
include FileUtils&lt;br /&gt;
# Gives you access (without prepending by &#39;FileUtils.&#39;) to&lt;br /&gt;
cd(dir, options)&lt;br /&gt;
cd(dir, options) {|dir| .... }&lt;br /&gt;
pwd()&lt;br /&gt;
mkdir(dir, options)&lt;br /&gt;
mkdir(list, options)&lt;br /&gt;
mkdir_p(dir, options)&lt;br /&gt;
mkdir_p(list, options)&lt;br /&gt;
rmdir(dir, options)&lt;br /&gt;
rmdir(list, options)&lt;br /&gt;
ln(old, new, options)&lt;br /&gt;
ln(list, destdir, options)&lt;br /&gt;
ln_s(old, new, options)&lt;br /&gt;
ln_s(list, destdir, options)&lt;br /&gt;
ln_sf(src, dest, options)&lt;br /&gt;
cp(src, dest, options)&lt;br /&gt;
cp(list, dir, options)&lt;br /&gt;
cp_r(src, dest, options)&lt;br /&gt;
cp_r(list, dir, options)&lt;br /&gt;
mv(src, dest, options)&lt;br /&gt;
mv(list, dir, options)&lt;br /&gt;
rm(list, options)&lt;br /&gt;
rm_r(list, options)&lt;br /&gt;
rm_rf(list, options)&lt;br /&gt;
install(src, dest, mode = &lt;src&#39;s&gt;, options)&lt;br /&gt;
chmod(mode, list, options)&lt;br /&gt;
chmod_R(mode, list, options)&lt;br /&gt;
chown(user, group, list, options)&lt;br /&gt;
chown_R(user, group, list, options)&lt;br /&gt;
touch(list, options)</content><link rel='replies' type='application/atom+xml' href='http://watirruby.blogspot.com/feeds/7411167352867407464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://watirruby.blogspot.com/2011/02/how-do-i-use-ruby-for-shell-scripting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/7411167352867407464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1023602686709660760/posts/default/7411167352867407464'/><link rel='alternate' type='text/html' href='http://watirruby.blogspot.com/2011/02/how-do-i-use-ruby-for-shell-scripting.html' title='How do I use Ruby for shell scripting?'/><author><name>Shahadat Khan</name><uri>http://www.blogger.com/profile/09982730657436813170</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></entry></feed>