<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Ranorex Blog</title>
	
	<link>http://www.ranorex.com/blog</link>
	<description>Software Automation &amp; Automated Testing Blog</description>
	<lastBuildDate>Tue, 15 May 2012 11:17:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ranorex-blog" /><feedburner:info uri="ranorex-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Using Subversion with Ranorex projects</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/l3uOyAxFRgM/subversion-and-ranorex</link>
		<comments>http://www.ranorex.com/blog/subversion-and-ranorex#comments</comments>
		<pubDate>Wed, 29 Feb 2012 10:19:16 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Management]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=2049</guid>
		<description><![CDATA[In general, it’s a good idea to use some kind of revision control system to keep track of the progression of your automated test projects – that way you can revert to a previous version if you run into trouble. Additionally using such a version control system is almost essential if you are working as [...]]]></description>
			<content:encoded><![CDATA[<p>In general, it’s a good idea to use some kind of revision control system to keep track of the progression of your automated test projects – that way you can revert to a previous version if you run into trouble.</p>
<p>Additionally using such a version control system is almost essential if you are working as a team on the same test automation project.</p>
<div id="attachment_2050" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/subversion-and-ranorex"><img class="size-medium wp-image-2050" title="Ranorex With SVN" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Ranorex-With-SVN-546x364.png" alt="Using Subversion with Ranorex projects" width="546" height="364" /></a><p class="wp-caption-text">Using Subversion with Ranorex projects</p></div>
<p>Therefore we recommend to use a source versioning system like SVN (which integrates in Ranorex Studio), having the advantages of</p>
<ul>
<li>making the history of all changes made to your project visible</li>
<li>providing backup functionality</li>
<li>preventing security issues on network shares (source code checked out locally)</li>
</ul>
<p>to name some of them.</p>
<p>The following paragraphs will explain how to</p>
<ul>
<li><a href="http://www.ranorex.com/blog/subversion-and-ranorex#setup">set up Ranorex for a better Subversion experience,</a></li>
<li><a href="http://www.ranorex.com/blog/subversion-and-ranorex#checkout">check out a repository to your local drive,</a></li>
<li><a href="http://www.ranorex.com/blog/subversion-and-ranorex#commit">commit a project to your repository</a></li>
<li><a href="http://www.ranorex.com/blog/subversion-and-ranorex#models">and the two different versioning models available with Subversion</a></li>
</ul>
<p><span id="more-2049"></span></p>
<p>Before starting with the Ranorex specific part of this blog post I would recommend to have a look at the book <a href="http://svnbook.red-bean.com/index.en.html">Version Control with Subversion</a> to get a complete overview about version control (and learn things such as how to set up a SVN server).</p>
<p><a id="setup"></a></p>
<h2>Setting up Ranorex for a better Subversion experience</h2>
<p>Before performing all the subversion specific update/commit stuff, you should adjust the subversion settings as described in Noam Kfirs blog post “<a href="http://noam.kfir.cc/blog/2011/08/30/better-ranorex-studio-settings-for-subversion">Better Ranorex Studio settings for Subversion</a>”.</p>
<p>To do so open the Tools Options dialog and check the option “Automatically add new files” in Subversion Options area</p>
<div id="attachment_2054" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Automatically-Add-New-Files.png"><img class="size-medium wp-image-2054" title="Check &quot;Automatically add new files&quot;" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Automatically-Add-New-Files-546x378.png" alt="Check &quot;Automatically add new files&quot;" width="546" height="378" /></a><p class="wp-caption-text">Check &quot;Automatically add new files&quot;</p></div>
<p>and uncheck the option “Automatically copy/move log files to the project reports directory” in Ranorex Log Viewer area.</p>
<div id="attachment_2055" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Automatically-Copy-Logs.png"><img class="size-medium wp-image-2055" title="Uncheck &quot;Automatically copy/move log files to the project reports directory&quot;" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Automatically-Copy-Logs-546x378.png" alt="Uncheck &quot;Automatically copy/move log files to the project reports directory&quot;" width="546" height="378" /></a><p class="wp-caption-text">Uncheck &quot;Automatically copy/move log files to the project reports directory&quot;</p></div>
<p>In the Subversion Options area at the Tools Options dialog you can also choose the SVN version you are using (1.6 or 1.7).</p>
<p><a id="checkout"></a></p>
<h2>Checking out a repository to your local drive</h2>
<p><em><strong>Please note</strong> that it&#8217;s necessary to have access to a SVN-Server and a repository located on this SVN-Server to perform the following steps. Therefore please have a look at the book <a href="http://svnbook.red-bean.com/index.en.html">Version Control with Subversion</a> or contact your system administrator. If you do not want to host your own SVN-Server you can also use a free source code hosting service as listed at <a href="http://en.wikipedia.org/wiki/Apache_Subversion#Source_code_hosting">this wikipedia article</a>. It&#8217;s also possible to create your own repository without the use of a SVN-Server. This can be done using e.g. <a href="http://tortoisesvn.net/downloads.html">TortoiseSVN</a>; for a step-by-step description see <a href="http://invalidlogic.com/2006/12/06/using-subversion-without-a-subversion-server/">this blog post</a>.</em></p>
<p>After making sure that you have  access to the repository for your Ranorex test solutions, first of all you have to check out the repository to a local folder (called &#8220;working copy&#8221;) on your hard drive to put your solutions into it.</p>
<div id="attachment_2058" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Check-Out-Repository.png"><img class="size-medium wp-image-2058" title="Open the Subversion Checkout dialog…" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Check-Out-Repository-546x106.png" alt="Open the Subversion Checkout dialog…" width="546" height="106" /></a><p class="wp-caption-text">Open the Subversion Checkout dialog…</p></div>
<div id="attachment_2059" class="wp-caption aligncenter" style="width: 478px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Check-Out-Dialog.png"><img class="size-full wp-image-2059" title="… and check out your repository to a local directory" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Check-Out-Dialog.png" alt="… and check out your repository to a local directory" width="468" height="363" /></a><p class="wp-caption-text">… and check out your repository to a local directory</p></div>
<p><a id="commit"></a></p>
<h2>Commit a project to your repository</h2>
<p>After doing so, generate a new solution into the working copy directory you’ve just made a checkout to.</p>
<p>The generated files have automatically been added to your repository, since you have set the option “Automatically add new files” before.</p>
<div id="attachment_2061" class="wp-caption aligncenter" style="width: 292px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Projects-View-Add.png"><img class="size-full wp-image-2061" title="Project View " src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Projects-View-Add.png" alt="Project View " width="282" height="191" /></a><p class="wp-caption-text">Project View </p></div>
<p>To commit the changes to your repository simply right-click on your solution file and choose “Commit…” from the context menu.</p>
<div id="attachment_2062" class="wp-caption aligncenter" style="width: 293px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Projects-View-Commit.png"><img class="size-full wp-image-2062" title="Commit changes" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Projects-View-Commit.png" alt="Commit changes" width="283" height="318" /></a><p class="wp-caption-text">Commit changes</p></div>
<p><a id="models"></a></p>
<h2>Versioning models</h2>
<p>The basic problem of sharing files is that changes made by one team member might be accidentally overwritten by another as sketched in following figure:</p>
<div id="attachment_2114" class="wp-caption aligncenter" style="width: 512px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Overwrite-Problem1.png"><img class="size-medium wp-image-2114" title="The modified version File’ of File is overwritten by the modified version File’’" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Overwrite-Problem1-502x500.png" alt="The modified version File’ of File is overwritten by the modified version File’’" width="502" height="500" /></a><p class="wp-caption-text">The modified version File’ of File is overwritten by the modified version File’’</p></div>
<p>To overcome this issue you can follow two different approaches:</p>
<p><strong>The &#8220;Lock-Modify-Unlock&#8221;-approach:</strong></p>
<div id="attachment_2111" class="wp-caption aligncenter" style="width: 512px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Lock-Modify-Unlock.png"><img class="size-medium wp-image-2111" title="Tester2 will not overwrite changes of Tester 1 as the file is locked" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Lock-Modify-Unlock-502x500.png" alt="Tester2 will not overwrite changes of Tester 1 as the file is locked" width="502" height="500" /></a><p class="wp-caption-text">Tester2 will not overwrite changes of Tester 1 as the file is locked</p></div>
<p><strong>The &#8220;Copy-Modify-Merge&#8221;-approach:</strong></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Copy-Modify-Merge-11.png"><img class="aligncenter size-medium wp-image-2112" title="Copy-Modify-Merge-1" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Copy-Modify-Merge-11-502x500.png" alt="Copy-Modify-Merge-1" width="502" height="500" /></a></p>
<div id="attachment_2113" class="wp-caption aligncenter" style="width: 512px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Copy-Modify-Merge-21.png"><img class="size-medium wp-image-2113" title="Tester1 merges his changes with the changes of Tester2" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Copy-Modify-Merge-21-502x500.png" alt="Tester1 merges his changes with the changes of Tester2" width="502" height="500" /></a><p class="wp-caption-text">Tester1 merges his changes with the changes of Tester2</p></div>
<p>The &#8220;Copy-Modify-Merge&#8221; approach is the default used by Subversion. As all checked in files are text based files there should be no problems with using the “Copy-Modify-Merge” method. Even the XML-files should be understandable easily. So, in case of a conflict you should be able to determine which differences to accept or to decline.</p>
<div id="attachment_2071" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Merge-Dialog.png"><img class="size-medium wp-image-2071" title="Merging Test Suite file" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Merge-Dialog-546x198.png" alt="Merging Test Suite file" width="546" height="198" /></a><p class="wp-caption-text">Merging Test Suite file</p></div>
<p>Of course you can also use the Lock-Modify-Unlock model, if you do not want to merge the files manually.</p>
<div id="attachment_2072" class="wp-caption aligncenter" style="width: 413px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Get-Lock.png"><img class="size-medium wp-image-2072" title="Locking Test Suite file" src="http://www.ranorex.com/blog/wp-content/uploads/2012/02/Get-Lock-403x500.png" alt="Locking Test Suite file" width="403" height="500" /></a><p class="wp-caption-text">Locking Test Suite file</p></div>
<p>By following the mentioned steps and looking up unclear topics in the book <a href="http://svnbook.red-bean.com/index.en.html">Version Control with Subversion</a> there should nothing stand in your way using version control with your Ranorex projects.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fsubversion-and-ranorex&amp;title=Using%20Subversion%20with%20Ranorex%20projects" id="wpa2a_2"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/l3uOyAxFRgM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/subversion-and-ranorex/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/subversion-and-ranorex</feedburner:origLink></item>
		<item>
		<title>Cross-Browser Test Automation with Ranorex</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/dnWeYmmVrNs/cross-browser-test-automation</link>
		<comments>http://www.ranorex.com/blog/cross-browser-test-automation#comments</comments>
		<pubDate>Mon, 30 Jan 2012 17:32:24 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1941</guid>
		<description><![CDATA[If you&#8217;re testing a web application, it would naturally be best to test it with not only one but with all of the most popular browsers (cross-browser testing). This blog post will show you how to record your automated tests using a browser and then automatically execute the recorded tests with different browsers. With Ranorex [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re testing a web application, it would naturally be best to test it with not only one but with all of the most popular browsers (cross-browser testing).</p>
<p>This blog post will show you how to record your automated tests using a browser and then automatically execute the recorded tests with different browsers. With Ranorex v3.2 (and higher) you can run your tests in Internet Explorer, Mozilla Firefox, Google Chrome and Apple Safari.</p>
<div id="attachment_1987" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Run-Ranorex-Test-In-Different-Browser.png"><img class="size-medium wp-image-1987" title="Run one Ranorex Test Script in different Browser" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Run-Ranorex-Test-In-Different-Browser-546x317.png" alt="Run one Ranorex Test Script in different Browser" width="546" height="317" /></a><p class="wp-caption-text">Run one Ranorex Test Script in different Browser (Cross-Browser Testing)</p></div>
<ul>
<li><a href="http://www.ranorex.com/blog/cross-browser-test-automation#sample">Sample Test Suite Project</a></li>
<li><a href="http://www.ranorex.com/blog/cross-browser-test-automation#multi">Cross-Browser Test</a></li>
</ul>
<p><span id="more-1941"></span></p>
<p><a id="sample"></a></p>
<h2>Sample Test Suite Project</h2>
<p>To demonstrate how to perform a multiple browser test, we will generate a small sample which enters data in our <a href="http://www.ranorex.com/web-testing-examples/vip/">VIP Database Test Web Application</a>, a small web application having the same functionality as the VIP Database you might know from our user guide.</p>
<p>First of all we’ll create a Test Case holding two Recordings, one for opening and one for closing the browser as setup and teardown modules.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Ranorex-Sample-Project-1.png"><img class="aligncenter size-full wp-image-1989" title="Ranorex Sample Project" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Ranorex-Sample-Project-1.png" alt="Ranorex Sample Project" width="259" height="136" /></a></p>
<p>Now we add a “OpenBrowser” action to the OpenBrowser Module with “http://www.ranorex.com/web-testing-examples/vip/” as Url and e.g. “IE” as browser.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Open-Browser-Module.png"><img class="aligncenter size-medium wp-image-1990" title="Open Browser Module" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Open-Browser-Module-546x33.png" alt="Open Browser Module" width="546" height="33" /></a></p>
<p>As next step we add a recording module validating the status String on connecting and disconnecting.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Ranorex-Sample-Project-2.png"><img class="aligncenter size-full wp-image-1992" title="Ranorex Sample Project 2" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Ranorex-Sample-Project-2.png" alt="Ranorex Sample Project 2" width="245" height="158" /></a></p>
<p>The recording module simply</p>
<ul>
<li>validates, that the status text equals “Online”,</li>
<li>disconnects,</li>
<li>validates, that the status text equals “Offline”,</li>
<li>connects again,</li>
<li>confirms to connect in the pop up window</li>
<li>and validates, that the status text equals “Online” again.</li>
</ul>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Test-Connection.png"><img class="aligncenter size-medium wp-image-1994" title="Test Connection Recording Module" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Test-Connection-546x232.png" alt="Test Connection Recording Module" width="546" height="232" /></a></p>
<p>Make sure that the RanoreXPath of your App Folder does not include any browser specific equation like &#8220;browsername=&#8230;&#8221;.</p>
<p>Make also sure to have two repository items representing the connection status text, one for “Online” and one for “Offline”. This allows you to overcome issues with delaying validation steps. In our application it takes some time that the status text changes from “connecting…” to “Online”. To make the Validation work, we can simply add the actual validation into the RanoreXPath and only validate the existence of the status text in our web page. By doing so, we are using the search timeout of the repository item to wait for the status text to change.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Test-Connection-2.png"><img class="aligncenter size-medium wp-image-1995" title="Test Connection Recording Module RanoreXPaths" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Test-Connection-2-546x29.png" alt="Test Connection Recording Module RanoreXPaths" width="546" height="29" /></a></p>
<p>Additionally to the TestConnection recording, we will generate a recording for adding VIP’s to the database. This recording will be added to a new Test Case as we want to data driven add VIP’s and do not want to open and close the browser and testing the connection with each iteration of adding a new VIP.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Ranorex-Sample-Project-3.png"><img class="aligncenter size-full wp-image-1996" title="Ranorex Sample Project 3" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Ranorex-Sample-Project-3.png" alt="Ranorex Sample Project 3" width="241" height="204" /></a></p>
<p>The recording might look something like this:</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-VIP.png"><img class="aligncenter size-medium wp-image-1998" title="Add VIPRecording Module" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-VIP-546x284.png" alt="Add VIPRecording Module" width="546" height="284" /></a></p>
<p>As we want to make our test data driven, we have to add variables which can be bound with the data from our data source.</p>
<p>The key sequences for first and last name contain the variables $FirstName and $LastName.</p>
<p>To select the category, we have to add a SetValue action and set the TagValue to the variable $Category.</p>
<p>The gender can be set by adding a variable to the RanoreXPath of the corresponding repository item.</p>
<p>Additionally, we validate the VIP count against a variable $VIP_Count.</p>
<p>After generating the recording, we create a data source for the Test Case Add_VIP’s and bind the data tables to the variables of the recording AddVIP.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-to-AddVIP1.png"><img class="aligncenter size-full wp-image-2001" title="Add Data Source to AddVIP 1" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-to-AddVIP1.png" alt="Add Data Source to AddVIP 1" width="501" height="490" /></a></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-to-AddVIP2.png"><img class="aligncenter size-medium wp-image-2002" title="Add Data Source to AddVIP2" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-to-AddVIP2-546x479.png" alt="Add Data Source to AddVIP2" width="546" height="479" /></a></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-to-AddVIP3.png"><img class="aligncenter size-medium wp-image-2003" title="Add Data Binding to AddVIP" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-to-AddVIP3-546x464.png" alt="Add Data Binding to AddVIP" width="546" height="464" /></a></p>
<p>As last step we add a Close Application action to the CloseBrowser Module with the application folder of the web application as repository item.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Close-Browser-Module.png"><img class="aligncenter size-medium wp-image-2006" title="Close Browser Recording Module" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Close-Browser-Module-546x15.png" alt="Close Browser Recording Module" width="546" height="15" /></a></p>
<p>Now we can execute our Test Suite Project, which:</p>
<ul>
<li>opens the web application in Internet Explorer  in the setup region,</li>
<li>performs connection tests,</li>
<li>adds 3 VIPs following the data driven approach  (the data for the 3 VIPs are stored in a simple data table),</li>
<li>validates the count of the VIPs stored in the web application</li>
<li>and closes the browser in the tear down region.</li>
</ul>
<p><a id="multi"></a></p>
<h2>Cross-Browser Test</h2>
<p>To perform these steps not only for IE but also for the other 3 browser which are supported, we first make the browser which will be started in the Recording “OpenBrowser” variable.</p>
<p>Therefore open the recording “OpenBrowser” and edit the browser which should be started. Now choose “As new Variable…” instead of “IE” and add a new Variable called BrowserName.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/add_browser_variable.png"><img class="size-medium wp-image-1949" title="Make Browser selection variable..." src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/add_browser_variable-546x124.png" alt="Make Browser selection variable..." width="546" height="124" /></a></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/add_browser_variable2.png"><img class="size-full wp-image-1950" title="...by adding a variable &quot;BrowserName&quot;" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/add_browser_variable2.png" alt="...by adding a variable &quot;BrowserName&quot;" width="334" height="151" /></a></p>
<p>After that, add a new simple data table to the Test Case “Add_VIP_and_Validate”, holding the names of the different browsers and bind the data connector to the variable “BrowserName”.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-1.png"><img class="aligncenter size-full wp-image-2012" title="Add Data Source 1" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-1.png" alt="Add Data Source 1" width="492" height="392" /></a></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-2.png"><img class="aligncenter size-medium wp-image-2013" title="Add Data Source 2" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-2-546x474.png" alt="Add Data Source 2" width="546" height="474" /></a></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-3.png"><img class="aligncenter size-medium wp-image-2014" title="Add Data Binding" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Add-Data-Source-3-546x473.png" alt="Add Data Binding" width="546" height="473" /></a></p>
<p>After making the browser variable that way and binding this variable to a table holding all supported browser names, you can execute your test script for all supported browser.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Reporting.png"><img class="aligncenter size-medium wp-image-2025" title="Ranorex Reporting" src="http://www.ranorex.com/blog/wp-content/uploads/2012/01/Reporting-406x500.png" alt="Ranorex Reporting" width="406" height="500" /></a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fcross-browser-test-automation&amp;title=Cross-Browser%20Test%20Automation%20with%20Ranorex" id="wpa2a_4"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/dnWeYmmVrNs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/cross-browser-test-automation/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/cross-browser-test-automation</feedburner:origLink></item>
		<item>
		<title>Did you know… that you can manually generate a recording?</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/YHsy1XewQ_s/manually-generate-a-test-recording</link>
		<comments>http://www.ranorex.com/blog/manually-generate-a-test-recording#comments</comments>
		<pubDate>Wed, 30 Nov 2011 09:20:18 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1874</guid>
		<description><![CDATA[It’s possible to manually perform all of your recording actions without pressing the record button at any time. This can be accomplished by doing the following. First, you have to generate a Repository holding the UI elements you want to address in your recording. Then, you simply need to associate this repository with your recording [...]]]></description>
			<content:encoded><![CDATA[<p>It’s possible to manually perform all of your recording actions without pressing the record button at any time. This can be accomplished by doing the following. First, you have to generate a Repository holding the UI elements you want to address in your recording. Then, you simply need to associate this repository with your recording and add actions to your recording referring to the UI elements stored in your repository.</p>
<p>The VIP database application, which is included in your Ranorex installation, is taken as a sample application in this blog to illustrate how to generate a recording and the associated repository without the use of the record button.</p>
<div id="attachment_1931" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/01_v2.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/01_v2-546x297.png" alt="Manually generate a Ranorex Recording" title="Manually generate a Ranorex Recording" width="546" height="297" class="size-medium wp-image-1931" /></a><p class="wp-caption-text">Manually generate a Ranorex Recording</p></div>
<ul>
<li><a href="http://www.ranorex.com/blog/manually-generate-a-test-recording#TheRepository">The Repository</a></li>
<li><a href="http://www.ranorex.com/blog/manually-generate-a-test-recording#TheRecording">The Recording</a></li>
</ul>
<p><span id="more-1874"></span><br />
<a id="TheRepository"></a></p>
<h2>The Repository</h2>
<p>First of all you have to add a repository to your project (Project-&gt;Add-&gt;New Item-&gt;Repository).</p>
<p>To analyze your application and determine which UI elements are necessary for the recording, open Ranorex Spy.</p>
<p>Let’s have a look at text boxes within the application. By tracking the “first name” text box you will get following RanoreXPath:<br />
<a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/02.png"><img class="aligncenter size-full wp-image-1885" title="RanoreXPath" src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/02.png" alt="RanoreXPath" width="471" height="17" /></a></p>
<p>You can now simply add this control to your repository by right clicking on it and choosing “Add to repository”.</p>
<p>If you’d like to directly add all available text boxes to your repository, you have to add a filter to your RanoreXPath. Therefore, open the Advanced RanoreXPath Editor by clicking on the magic wand which is placed next to the RanoreXPath and uncheck the check box for “controlname” to make the RanoreXPath not only fit to this particular text box with the control name “tbFirstName”.</p>
<p>By verifying your altered RanoreXPath, you will see that 5 elements have been found. To see which controls have been found, click on “Highlight”. As you can see, not only all text boxes, but also all labels fit this RanoreXPath as all of these elements are represented with the text adapter. To filter out only the text boxes – as you do not need the labels within our recording – just check the check box “controltypename” and choose “TextBox”. By verifying this RanoreXPath, you will see that only 2 elements have been found – the 2 available text boxes.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/03.png"><img class="aligncenter size-medium wp-image-1884" title="Advanced RanoreXPath Editor" src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/03-546x388.png" alt="Advanced RanoreXPath Editor" width="546" height="388" /></a></p>
<p>After filtering the needed controls (click OK to close the Advanced RanoreXPath Editor), you can add these controls to your repository by right clicking on the parent folder of the two fitting elements in Spy and choosing “Add Matching Children to Repository”.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/04.png"><img class="aligncenter size-medium wp-image-1883" title="Add Matching Children to Repository" src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/04-506x500.png" alt="Add Matching Children to Repository" width="506" height="500" /></a></p>
<p>To learn more about the RanoreXPath and the Advanced RanoreXPath Editor please have a look at following chapters of our user guide:</p>
<ul>
<li><a href="http://www.ranorex.com/support/user-guide-20/ranorexpath.html">RanoreXPath</a></li>
<li><a href="http://www.ranorex.com/support/user-guide-20/lesson-10-ranorexpath-editor.html">RanoreXPath Editor</a></li>
</ul>
<p>After adding the relevant text boxes, let’s add the list items stored in the category list box to the repository. Therefore, track a list item, select the parent list node, right click and choose “Add to Repository (incl. children).</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/05.png"><img class="aligncenter size-medium wp-image-1882" title="Add to Repository (incl. Children)" src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/05-546x470.png" alt="Add to Repository (incl. Children)" width="546" height="470" /></a></p>
<p>Now that you have the text boxes for first and last name and the list items for the different categories stored in our repository, let’s add the radio buttons for the gender and the add button to your repository.</p>
<p>After doing so, the repository should look something like this:</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/06.png"><img class="aligncenter size-medium wp-image-1881" title="Ranorex Repository" src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/06-546x198.png" alt="Ranorex Repository" width="546" height="198" /></a></p>
<p>To make your repository hierarchy cleaner, you can add corresponding folders for each type of control (Add New Item -&gt; Simple Folder):</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/07.png"><img class="aligncenter size-medium wp-image-1880" title="Tidy Repository" src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/07-546x240.png" alt="Tidy Repository" width="546" height="240" /></a></p>
<p><a id="TheRecording"></a></p>
<h2>The Recording</h2>
<p>After adding the necessary controls to the repository, it’s time for creating a recording file (Project-&gt;Add-&gt;New Item-&gt;Recording).</p>
<p>Now you have to connect the newly created recording with the repository created before. This can be done by choosing the repository from the repository list:</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/08.png"><img class="aligncenter size-medium wp-image-1879" title="Choose Repository for Recording" src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/08-546x111.png" alt="Choose Repository for Recording" width="546" height="111" /></a></p>
<p>After connecting the repository to the recording, you can start with adding actions to your recording table.</p>
<p>The first step which should be done is to start the application under test. Therefore add a “Run Application” action (Add New Action -&gt; Run Application) and choose the executable of the VIP database application.</p>
<p>After that, set the first and last name of the VIP. To do so, you can simply drag &amp; drop the wanted repository item from the repository to your recording. From the context menu that pops up choose “Key Sequence” to use the keyboard to set the value of the text box.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/091.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/091-546x413.png" alt="Add Action from Repository to Recording" title="Add Action from Repository to Recording" width="546" height="413" class="aligncenter size-medium wp-image-1922" /></a></p>
<p>To select a category drag &amp; drop the specific list item from your repository to your recording and choose “Invoke Action” as action type. As action name choose “Select” to select the given list item.</p>
<p>Choosing the gender can be handled the same way as choosing the category.</p>
<p>Pressing the add button can be performed by dragging &amp; dropping the button from the repository to the recording and choosing “Mouse” as action type.</p>
<p>Finally, you can close the application by dragging &amp; dropping the application folder from the repository to the recording and choosing “Close Application” as action type.</p>
<p>Voilà… a recording manually generated without using the record button.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/101.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/101-546x128.png" alt="Ranorex Recording" title="Ranorex Recording" width="546" height="128" class="aligncenter size-medium wp-image-1923" /></a></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/11/11.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/11/11-546x338.png" alt="Ranorex Report" title="Ranorex Report" width="546" height="338" class="aligncenter size-medium wp-image-1928" /></a></p>
<p>As you can see, you can manually generate a recording from a repository which might be useful</p>
<ul>
<li>if you are working in teams and you are sharing one repository to keep the shared repository tidy.</li>
<li>if your application under test is based on special technologies (e.g. using GDI plug-in to identify elements) and the RanoreXPaths of automatically generated repository items often need to be adjusted in order to make them work reliably.</li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fmanually-generate-a-test-recording&amp;title=Did%20you%20know%E2%80%A6%20that%20you%20can%20manually%20generate%20a%20recording%3F" id="wpa2a_6"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/YHsy1XewQ_s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/manually-generate-a-test-recording/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/manually-generate-a-test-recording</feedburner:origLink></item>
		<item>
		<title>Organizing a Test Automation Project with Ranorex Test Suites</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/CawSVJ0wW_w/organizing-a-test-automation-project-with-ranorex-test-suite</link>
		<comments>http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite#comments</comments>
		<pubDate>Mon, 31 Oct 2011 09:53:03 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1793</guid>
		<description><![CDATA[The Ranorex test suite enables you to easily manage your test cases, as well as build robust data-driven tests. Your test automation modules can be shared, adopted, and used within your team. Learn why Ranorex module projects are the best way to group your test modules and reuse them in different test suite projects within [...]]]></description>
			<content:encoded><![CDATA[<p>The Ranorex test suite enables you to easily manage your test cases, as well as build robust data-driven tests. Your test automation modules can be shared, adopted, and used within your team. Learn why Ranorex module projects are the best way to group your test modules and reuse them in different test suite projects within your teams.</p>
<div id="attachment_1794" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic0.jpg"><img class="size-medium wp-image-1794 " src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic0-546x282.jpg" alt="Organizing a Test Automation Project with Ranorex Test Suite" width="546" height="282" /></a><p class="wp-caption-text">Organizing a Test Automation Project with Ranorex Test Suite</p></div>
<ul>
<li><a href="http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite#DifferentViews">Different Views</a></li>
<li><a href="http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite#SeparationOfModules">Separation of Modules</a></li>
<li><a href="http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite#MultipleProjectsOneSolution">Multiple Projects, One Solution</a></li>
<li><a href="http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite#ExecutionOnRuntimeMachines">Execution on Runtime Machines</a></li>
<li><a href="http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite#SameSolutionSifferentUsers">Working on the same solution with different users</a></li>
</ul>
<p><span id="more-1793"></span><br />
<a id="DifferentViews"></a></p>
<h2>Different Views</h2>
<p>In order to perform professional testing of an extensive software product, it can be beneficial to separate the views of the testing process.</p>
<p>On the one hand there might be a team consisting of e.g. a Test Automation Engineer and some testers. This team is responsible for covering all conceivable work flows and dividing these workflows into small, reusable modules.</p>
<p>On the other hand there might be a tester. The tester, for his part, is responsible for testing specific work flows processed by the software under test. As the team already has provided all necessary modules, the tester only has to put the desired modules together, to fulfill the required work flow.</p>
<div id="attachment_1795" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic1.jpg"><img class="size-medium wp-image-1795" title="Different Views" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic1-546x362.jpg" alt="Different Views" width="546" height="362" /></a><p class="wp-caption-text">Different Views</p></div>
<p><a id="SeparationOfModules"></a></p>
<h2>Separation of Modules</h2>
<p>As mentioned before, it is useful to separate specific work flows in small self-contained modules in order for them to be reused in different scenarios.</p>
<p>These modules can either be recordings or user code modules which will be prepared by a team to allow the tester a rapid generation of different workflows.</p>
<p>To allow a more general approach the team can add variables to the particular modules. The tester only has to provide values by parameters or a data source and to bind the specific columns of this data source to the specific variables.</p>
<p>For more details about data driven testing and parameter usage please have a look at following chapter in our user guide: <a href="http://www.ranorex.com/support/user-guide-20/lesson-3-data-driven-testing.html">Data-Driven Test Automation</a></p>
<div id="attachment_1796" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic2.jpg"><img class="size-medium wp-image-1796" title="Separation of Modules" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic2-546x362.jpg" alt="Separation of Modules" width="546" height="362" /></a><p class="wp-caption-text">Separation of Modules</p></div>
<p><a id="MultipleProjectsOneSolution"></a></p>
<h2>Multiple Projects, One Solution</h2>
<h3>DLL Type Projects</h3>
<p>To allow collaboration of a team and the tester, the team has to provide the generated modules to the tester.</p>
<p>This can be established by providing Ranorex Test Suite libraries holding specific test modules.</p>
<p>These libraries can be referenced in the Test Suite project of the tester and all modules held by these libraries will be available for the tester to add to his specific test cases.</p>
<p style="text-align: center;"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic3.jpg"><img class="size-medium wp-image-1797 aligncenter" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic3-546x394.jpg" alt="Test Suite Library" width="546" height="394" /></a></p>
<p>These libraries include all recording and user code modules generated by the team as well as the repository holding the elements the modules are accessing.</p>
<p>Let’s have a look at Ranorex Studio and how such a test project with several Test Suite libraries would look like.</p>
<p>First of all the Test Suite libraries have to be referenced to make them reusable for the tester.</p>
<p>This can be done by opening the .Net Assembly Browser“  tab at the Add Reference” dialog (Project-&gt;Add Reference) and simply adding the generated DLL files. After this step the DLLs should be viewable in the reference list in the project view pad.</p>
<div id="attachment_1800" class="wp-caption aligncenter" style="width: 241px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen1.jpg"><img class="size-full wp-image-1800" title="Reference list in Project View" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen1.jpg" alt="Reference list in Project View" width="231" height="371" /></a><p class="wp-caption-text">Reference list in Project View</p></div>
<p>The referenced Test Suite libraries are also viewable in the Ranorex Module pad with all their modules and variables.</p>
<div id="attachment_1801" class="wp-caption aligncenter" style="width: 211px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen2.jpg"><img class="size-full wp-image-1801" title="Module Browser View" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen2.jpg" alt="Module Browser View" width="201" height="356" /></a><p class="wp-caption-text">Module Browser View</p></div>
<p>The tester can now simply drag and drop the individual modules from the module browser to his Test Suite to construct the specific test cases.</p>
<div id="attachment_1802" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen3.jpg"><img class="size-medium wp-image-1802" title="Drag/Drop Modules form Module Browser to Test Suite" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen3-546x447.jpg" alt="Drag/Drop Modules form Module Browser to Test Suite" width="546" height="447" /></a><p class="wp-caption-text">Drag/Drop Modules form Module Browser to Test Suite</p></div>
<h3>EXE Type Projects</h3>
<p>To handle different test scenarios you can add several Test Suite configurations for your Test Suite.</p>
<p>By modifying the Test Suite configurations, different test cases or folders in your Test Suite can be selected to be executed.</p>
<p>Have a look at following chapter of our user guide to learn more about Test Suite configurations: <a href="http://www.ranorex.com/support/user-guide-20/lesson-4-ranorex-test-suite.html#c3019">Running a Test Suite</a></p>
<p>If modifying the Test Suite configurations does not fulfill the requirements, it’s also possible to add several Test Suite projects to one solution.</p>
<p>Each of these Test Suite projects in a solution will then generate an executable.</p>
<div id="attachment_1798" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic4.jpg"><img class="size-medium wp-image-1798" title="Exe Type Projects" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic4-546x364.jpg" alt="Exe Type Projects" width="546" height="364" /></a><p class="wp-caption-text">Exe Type Projects</p></div>
<div id="attachment_1803" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen4.jpg"><img class="size-medium wp-image-1803" title="Ranorex Solution with several Test Suite Projects" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/screen4-546x362.jpg" alt="Ranorex Solution with several Test Suite Projects" width="546" height="362" /></a><p class="wp-caption-text">Ranorex Solution with several Test Suite Projects</p></div>
<p>Additional to the automatically generated ones you can add other project relevant files to your projects, like your application under test or files holding the test data provided by your data connectors.</p>
<p>To ensure that these files will be available within the test project by distributing it on other machines &#8211; as described in the next chapter &#8211; you have to open the properties tab of the added file and set the &#8220;Copy to output directory&#8221; option to &#8220;Always&#8221;.</p>
<h2>Execution on Runtime Machines</h2>
<p>The generated test projects can be distributed to every machine, which has at least the Ranorex Runtime License installed.</p>
<p>To execute a test project on a runtime machine, you have to copy the executable (*.exe), the Test Suite file (*.rxtst) and the used libraries (*.dll) to a folder on the machine.</p>
<p>These files are by default already in the output folder of your project.</p>
<p>There are two different methods of executing a test project on a runtime machine:</p>
<ul>
<li>Executing the test project via command line as described in following chapter in our user guide: <a href="http://www.ranorex.com/support/user-guide-20/lesson-4-ranorex-test-suite.html#c3581">Running Test via Command Line</a></li>
<li>Executing the test project via the Ranorex Test Suite Runner as described in following chapter in our user guide: <a href="http://www.ranorex.com/support/user-guide-20/lesson-4-ranorex-test-suite.html#c3579">Ranorex Test Suite Runner</a></li>
</ul>
<div id="attachment_1799" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic5.jpg"><img class="size-medium wp-image-1799" title="Execution on Runtime Machines" src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/graphic5-546x364.jpg" alt="Execution on Runtime Machines" width="546" height="364" /></a><p class="wp-caption-text">Execution on Runtime Machines</p></div>
<p><a id="SameSolutionSifferentUsers"></a></p>
<h2>Working on the same solution with different users</h2>
<p>As illustrated in this article, using libraries it is possible to share a whole Ranorex Solution between the team and several testers. The team provides libraries in form of DLLs which are referenced by the tester in the Test Suite project.<br />
That means everybody (testers and team) is working on the same Ranorex Solution.</p>
<div id="attachment_1870" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/RanorexWithSVN1.jpg"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/RanorexWithSVN1-546x478.jpg" alt="Working on same Ranorex Solution with different user" title="Working on same Ranorex Solution with different user" width="342" height="300" class="size-medium wp-image-1870" /></a><p class="wp-caption-text">Working on same Ranorex Solution with different user</p></div>
<p>To make this scenario work comfortable, it’s recommended to use a source versioning system like SVN (which integrates in Ranorex Studio), having the advantages of</p>
<ul>
<li>making the history of all changes made on your project visible</li>
<li>providing backup functionality</li>
<li>preventing security issues on network shares (source code checked out locally)</li>
</ul>
<p>to name some of them.</p>
<p>You can find some hints regarding Ranorex and SVN settings at <a href="http://noam.kfir.cc/blog/2011/08/30/better-ranorex-studio-settings-for-subversion">this blog post</a>.</p>
<div id="attachment_1871" class="wp-caption aligncenter" style="width: 556px"><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/10/RanorexWithSVN2.jpg"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/10/RanorexWithSVN2-546x364.jpg" alt="Using source versioning system" title="Using source versioning system" width="546" height="364" class="size-medium wp-image-1871" /></a><p class="wp-caption-text">Using source versioning system</p></div>
<p>By following the mentioned approaches it will be easy for you to organize a professional testing environment for your extensive software project.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Forganizing-a-test-automation-project-with-ranorex-test-suite&amp;title=Organizing%20a%20Test%20Automation%20Project%20with%20Ranorex%20Test%20Suites" id="wpa2a_8"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/CawSVJ0wW_w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/organizing-a-test-automation-project-with-ranorex-test-suite</feedburner:origLink></item>
		<item>
		<title>Flash/Flex Automation with the New Ranorex Preloader</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/l6z0KG06OCU/flashflex-automation-with-the-new-ranorex-preloader</link>
		<comments>http://www.ranorex.com/blog/flashflex-automation-with-the-new-ranorex-preloader#comments</comments>
		<pubDate>Mon, 30 May 2011 14:59:02 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1641</guid>
		<description><![CDATA[Ranorex has developed a new, more comfortable way of Flash/Flex instrumentation. This alternative way makes it possible to automate Flash/Flex based applications without modifying the application itself. To automate your application this way, you have to install the Adobe Debug Flash Player and use the new Ranorex Preloader for all Flash/Flex applications. Set up Preloader [...]]]></description>
			<content:encoded><![CDATA[<p>Ranorex has developed a <strong>new, more comfortable way of Flash/Flex instrumentation</strong>. This alternative way makes it possible to automate Flash/Flex based applications <strong>without modifying the application</strong> itself.</p>
<p>To automate your application this way, you have to install the Adobe <strong>Debug Flash Player</strong> and use the new <strong>Ranorex Preloader</strong> for all Flash/Flex applications.</p>
<p><img class="alignnone size-full wp-image-1697" title="Flash-Flex-preloader" src="http://www.ranorex.com/blog/wp-content/uploads/2011/05/Flash-Flex-preloader.jpg" alt="Flash/Flex Automation" width="546" height="360" /></p>
<ul>
<li><a href="http://www.ranorex.com/blog/flashflex-automation-with-the-new-ranorex-preloader#setup">Set up Preloader</a></li>
</ul>
<p><span id="more-1641"></span></p>
<div style="margin: 15px 0pt; padding: 10px 20px; background-color: rgb(255, 255, 140);" class="download-form">
	  <b>Ranorex 3.1 comes with an instrumentation wizard which will setup the needed files and configurations for you.</b></p>
<p><a href="http://www.ranorex.com/support/user-guide-20/instrumentation-wizard/adobe-flash-flex.html">Please see the Adobe Flash/Flex instrumentation wizard documentation page</a></p>
</p></div>
<p><a id="setup"></a></p>
<h3><a id="setup">Setting up the Ranorex Preloader:</a></h3>
<p>&nbsp;</p>
<ol>
<li><strong>Install the Adobe Debug Flash Player</strong> on the machine on which you would  like to record and execute Ranorex test scripts and for all browsers you  would like to test with. The installers are available on <a href="http://www.adobe.com/support/flashplayer/downloads.html">Adobe&#8217;s download page</a>; the following are the links to the Debug Player 10 for <a href="http://www.ranorex.com/flashplayer10-debug-IE">Internet Explorer</a> and <a href="http://www.ranorex.com/flashplayer10-debug-FF">Firefox</a>.</li>
<li><strong>Download the Ranorex preloader package<a href="http://www.ranorex.com/blog/wp-content/uploads/2011/05/RxPreloader.zip">“RxPreloader.zip” (containing RanorexAutomation.swf and RanorexAutomation.swc&#8221;)</a></strong>, save it to your local drive and extract it (in the following referred to as <em>preloader location</em>); in this example I will use “C:\FlashFlex\RanorexAutomation.swf” for the preloader location. Remember the location you placed the RanorexAutomation.swf file to, you will need it in the next steps!</li>
<li><strong>Open your user profile directory %UserProfile%</strong>, e.g. by opening Windows Explorer and copying the string <em>%UserProfile%</em> into the address bar.</li>
<li><strong>Create a new file called „mm.cfg” in your user profile directory</strong> and insert the following line of code, where “C:\FlashFlex\RanorexAutomation.swf” needs to be replaced by the preloader location from step 2:
<pre name="code">PreloadSwf= C:\FlashFlex\RanorexAutomation.swf</pre>
<p>Additional to this configuration entry you can enable the logging mechanisms of the Adobe Debug Flash Player, which might be helpful if you have any problems with this kind of instrumentation. In such a case you can then simply provide this logging information to our support team. To enable logging you have to add the following line of code to your “mm.cfg” file:</p>
<pre name="code">TraceOutputFileEnable=1</pre>
<p>This additional configuration entry forces the Debug Player to create a log file at following location:<br />
C:\Users\username\AppData\Roaming\Macromedia\Flash Player\Logs</li>
<li><strong>Open the following link and add the preloader location folder</strong> (from step 2), which contains the RanorexAutomation.swf file, to the trusted locations, for my example that is “C:\FlashFlex”:<br />
<a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065">http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065</a></li>
</ol>
<p>After performing these steps you should be able to automate any Flash/Flex based application without any modification to the application. To verify that everything went right, you can use Ranorex Spy and track some controls within a Flash/Flex application (e.g. <a href="http://www.adobe.com/devnet/actionscript/samples/interactivity_1.html">this Flash example</a>).</p>
<p>The new Ranorex Preloader can also be used as “Automation Lib” or as “Module” the same way as described in our Flash/Flex Technology instrumentation chapter within the Ranorex User Guide (use the .swf or .swc file stored in <a href="http://www.ranorex.com/blog/wp-content/uploads/2011/05/RxPreloader.zip">“RxPreloader.zip”</a> instead of the files located in the Bin directory of your Ranorex installation):</p>
<ul>
<li><a href="http://www.ranorex.com/support/user-guide-20/flash-flex-testing.html#c2245">Automation Lib</a></li>
<li><a href="http://www.ranorex.com/support/user-guide-20/flash-flex-testing.html#c2739">Module</a></li>
</ul>
<p><strong>Please note</strong> when using the Adobe Debug Flash Player you might get some error messages that are not shown by the normal Flash Player. These error messages are based on the fact that the Debug Player is more verbose regarding error handling than the normal Flash Player. The shown error messages are caused by the Flash application and are usually not referable to the Ranorex instrumentation.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fflashflex-automation-with-the-new-ranorex-preloader&amp;title=Flash%2FFlex%20Automation%20with%20the%20New%20Ranorex%20Preloader" id="wpa2a_10"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/l6z0KG06OCU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/flashflex-automation-with-the-new-ranorex-preloader/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/flashflex-automation-with-the-new-ranorex-preloader</feedburner:origLink></item>
		<item>
		<title>Working with Ranorex and Team Foundation Server</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/qT8gihMt_KM/working-with-ranorex-and-team-foundation-server</link>
		<comments>http://www.ranorex.com/blog/working-with-ranorex-and-team-foundation-server#comments</comments>
		<pubDate>Wed, 11 May 2011 13:07:16 +0000</pubDate>
		<dc:creator>rpuntaier</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1497</guid>
		<description><![CDATA[As Ranorex projects only consist of text files, which facilitates merging and comparing changes within files, basically any kind of software configuration management (SCM) tool can be used with Ranorex. Regarding Team Foundation Server Ranorex has the advantage that its project format is the same as that of Visual Studio 2008. The important in advance: [...]]]></description>
			<content:encoded><![CDATA[<p>As Ranorex projects only consist of text files, which facilitates merging and comparing changes within files, basically any kind of <strong>software configuration management (SCM) </strong>tool can be used with Ranorex. Regarding Team Foundation Server Ranorex has the advantage that its project format is the same as that of Visual Studio 2008.</p>
<div><strong>The important in advance:</strong> You must check out a complete project before you can open and change it in Ranorex Studio.</div>
<p class="topic-title first"><strong>Contents</strong></p>
<ul class="simple">
<li><a id="id1" class="reference internal" href="http://www.ranorex.com/blog/working-with-ranorex-and-team-foundation-server#walkthrough">Walkthrough</a></li>
<li><a id="id2" class="reference internal" href="http://www.ranorex.com/blog/working-with-ranorex-and-team-foundation-server#summary">Summary</a><span id="more-1497"></span></li>
</ul>
<h3><a class="toc-backref" href="#walkthrough" id="walkthrough">Walkthrough</a></h3>
<p>The following is a walkthrough about how to keep Ranorex projects in TFS.</p>
<p>There are the following <strong>Team Foundation Server </strong>clients: the standalone Team Foundation Explorer and Visual Studio. I use Visual Studio 2010 in this blog.</p>
<p>In Visual Studio open the Team Explorer, right click, make a <cite>New Team Project</cite> and fill in the dialog that will pop up. I will add the Ranorex 3.0 samples to the new team project later.</p>
<p>After having made a new team project you will find <cite>Source Control</cite> underneath the new entry. Double-click on it to open the source control explorer. Instead of the Solution Explorer you can also use this view to work with TFS.</p>
<p>In Visual Studio make a blank solution by doing</p>
<blockquote>
<ul class="simple">
<li>File / New / Project / Other Project Types / Visual Studio Solutions / Blank Solution</li>
</ul>
</blockquote>
<p>Then add Ranorex projects. I add the sample projects that come with Ranorex 3.0.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/add_existing_project.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/add_existing_project-546x263.png" alt="image2" /></a></p>
<p>For example <cite>VIPTestSuite.csproj</cite>.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/choose_project.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/choose_project.png" alt="image3" /></a></p>
<p>The Ranorex Project Format is still that of Visual Studio 2008. So there will be a conversion dialog. <strong>After conversion you will still be able to open it in Ranorex Studio 3.0.</strong></p>
<p>You can add as many projects to the solution as you like. I have added four projects.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/projects_in_vs.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/projects_in_vs.png" alt="image5" /></a></p>
<p>Right-click on the solution and choose <cite>Add Solution to Source Control &#8230;</cite> to add all projects to TFS.</p>
<p>The projects are added, but not yet checked in. You can right-click on the solution and choose <cite>Check In &#8230;</cite> from the context menu.<br />
Or you can open the View / Other Windows / <cite>Pending Changes</cite> tool window.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/checkin_pendingchanges.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/checkin_pendingchanges-546x169.png" alt="image9" /></a></p>
<p>Before you open and edit a project in Ranorex Studio you must <strong>check out the whole project</strong>. To do that right click on the project in the solution explorer and choose <cite>Check Out for Edit</cite>.</p>
<p>You can now make changes in Ranorex Studio. Check in using Visual Studio Solution Explorer or Source Control Explorer when you are done with them.</p>
<p>In Visual Studio you can look at the history of your changes.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/view_history.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/view_history.png" alt="image10" /></a></p>
<p>Changesets will be listed in the history view.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/history_in_vs.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/history_in_vs-546x123.png" alt="image11" /></a></p>
<p>Go to <cite>Changeset Details &#8230;</cite> to see individual files.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/rxrec_history.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/rxrec_history-546x139.png" alt="image12" /></a></p>
<p>Compare <cite>with previous version</cite> to see the changes in a file.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/changeset_details.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/changeset_details-546x387.png" alt="image13" /></a></p>
<p>Here is my change in the <tt class="docutils literal">rxrec</tt> file.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/compare_rxrec.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/compare_rxrec-546x129.png" alt="image14" /></a></p>
<h3><a class="toc-backref" href="#summary" id="summary">Summary</a></h3>
<p>This walkthrough showed how to use TFS with Ranorex Studio Projects. In a similar manner any other SCM tool can be used for Ranorex Studio projects:</p>
<ul>
<li>Add the project to SCM using an SCM specific client</li>
<li>Before editing in Ranorex Studio, check out all files using the SCM specific client (or keep checked-out, i.e. writable, making this step unnecessary)</li>
<li>Make changes to the Ranorex Studio projects</li>
<li>Check in changes using the SCM specific client again</li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fworking-with-ranorex-and-team-foundation-server&amp;title=Working%20with%20Ranorex%20and%20Team%20Foundation%20Server" id="wpa2a_12"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/qT8gihMt_KM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/working-with-ranorex-and-team-foundation-server/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/working-with-ranorex-and-team-foundation-server</feedburner:origLink></item>
		<item>
		<title>Combining Ranorex 3.0 and Visual Studio 2010 for UI Unit Testing</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/LYvqDO1Jbsg/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing</link>
		<comments>http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#comments</comments>
		<pubDate>Mon, 28 Mar 2011 13:02:55 +0000</pubDate>
		<dc:creator>rpuntaier</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1453</guid>
		<description><![CDATA[Ranorex Studio and Visual Studio are working together very well. The Ranorex Studio Project and Solution format is that of Visual Studio. You might want to open a Ranorex Project in VS to commit it to Team Foundation Server (TFS) of which VS is a natural client. You can also use MSBuild to build the [...]]]></description>
			<content:encoded><![CDATA[<p>Ranorex Studio and Visual Studio are working together very well.</p>
<ol>
<li>The Ranorex Studio Project and Solution format is that of Visual Studio. You might want to open a Ranorex Project in VS to commit it to Team Foundation Server (TFS) of which VS is a natural client. You can also use MSBuild to build the Ranorex Project.</li>
<li>The EXE or DLL that Ranorex produces is a .NET Assembly, which can be used in VS.</li>
<li>An EXE or DLL that Visual Studio produces can be referenced in Ranorex Studio.</li>
</ol>
<p>In this blog I want to take advantage of the second point in this list. I show work flows to do unit testing in Visual Studio by referencing .NET Assemblies produced with Ranorex Studio.</p>
<div id="contents" class="contents topic">
<p class="topic-title first"><strong>Contents</strong></p>
<ul class="simple">
<li><a id="id1" class="reference internal" href="http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#sample-project">Sample Project</a></li>
<li><a id="id2" class="reference internal" href="http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#the-ranorex-studio-project">The Ranorex Studio Project</a></li>
<li><a id="id3" class="reference internal" href="http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#visual-studio-and-nunit-attribute-based-test-assemblies">Visual Studio and NUnit Attribute-based Test Assemblies</a></li>
<li><a id="id4" class="reference internal" href="http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#ranorex-assemblies-in-visual-studio-projects">Ranorex Tests in Visual Studio Projects</a>
<ul>
<li><a id="id5" class="reference internal" href="http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#recordings-or-user-code-modules">Recordings or User Code Modules</a></li>
<li><a id="id6" class="reference internal" href="http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#ranorex-test-suite">Ranorex Test Suite</a></li>
</ul>
</li>
<li><a id="id7" class="reference internal" href="http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing#links">Links</a><span id="more-1453"></span></li>
</ul>
</div>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/03/Ranorex_in_vs_with_comments.png"><img class="aligncenter size-medium wp-image-1568" src="http://www.ranorex.com/blog/wp-content/uploads/2011/03/Ranorex_in_vs_with_comments-546x472.png" alt="Ranorex_in_vs_with_comments" height="472" /></a></p>
<h3><a class="toc-backref" href="#id1">Sample Project</a></h3>
<div id="sample-project" class="section">
<p>For the purpose of this blog I use the VIPTestSuite Sample that comes with Ranorex 3.0.</p>
<p><a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/sample.png"><img src="http://www.ranorex.com/blog/wp-content/uploads/2011/02/sample-546x288.png" alt="VIPTestSuiteSample" /></a></p>
<p>This Ranorex sample project&#8217;s assembly is used in this Visual Studio 2010 project: <a class="reference external" href="http://www.ranorex.com/blog/wp-content/uploads/2011/02/VIP_VS_Test.zip">VIP_VS_Test</a></p>
<p>To run the project you need Visual Studio 2010 and Ranorex 3.0.</p>
<ul>
<li>
<p class="first">Open Ranorex 3.0</p>
</li>
<li>
<p class="first">In the start page choose the sample as shown in the above screenshot</p>
</li>
<li>
<p class="first">Build the Ranorex VIPTestSuite Sample (Menu: Build/Build Solution)</p>
</li>
<li>
<p class="first">Open the downloaded and unzipped Visual Studio 2010 project</p>
</li>
<li>
<p class="first">Build the Visual Studio Test Project (Menu: Build/Build Solution)</p>
</li>
<li>
<p class="first">Run a test from within Visual Studio 2010</p>
</li>
<li>
<p class="first">Or run a test with MSTest :</p>
<pre name="code" class="csharp">mstest /testcontainer:VIP_VS_Test.dll /test:Test_AddAndDeleteSingleVIP</pre>
</li>
</ul>
</div>
<div id="the-ranorex-studio-project" class="section">
<h3><a class="toc-backref" href="#id2">The Ranorex Studio Project</a></h3>
<p>Let&#8217;s look at a Ranorex Studio Project. It contains:</p>
<ul>
<li>
<p class="first">XML files</p>
<blockquote>
<ul>
<li>
<p class="first">Repositories (<tt>rxrep</tt> files)</p>
</li>
<li>
<p class="first">Recordings (<tt>rxrec</tt> files)</p>
<p>Recording files have a reference to a repository file.</li>
<li>
<p class="first">Reports</p>
</li>
</ul>
</blockquote>
</li>
<li>
<p class="first">.NET source code files (cs or vb files), generated code and user code</p>
</li>
<li>
<p class="first">.NET assemblies as output files</p>
</li>
</ul>
<p>What in such a project is usable from outside Ranorex Studio?</p>
<ul>
<li>
<p class="first"><strong>XML files: no.</strong></p>
<p>The XML format is only of importance within Ranorex Studio, for the Recorder, the Spy and the Editors.</p>
<p><strong>Note:</strong> With Ranorex Studio 3.0 the <strong>test suite file</strong> (<tt>.rxtst</tt>) was added. This is special in the sense that no .NET code is generated for it. It stays a XML file. Its purpose is Test Case Management and t is thus an alternative to NUnit&#8217;s and Visual Studio&#8217;s Test Case Management. It is very good to organize data driven test cases.</li>
<li>
<p class="first"><strong>.NET source code: yes, but &#8230;</strong></p>
<p>The .NET Source Code files can be used in Visual Studio. Actually some people do program in VS using the Ranorex API. But by doing so one looses the advantages of the integrated test development that Ranorex Studio provides, the automatic synchronization between the XML files (repository or recording) and the code, the test suite, &#8230;</li>
<li>
<p class="first"><strong>.NET assemblies: yes</strong></p>
<p>The .NET assemblies produced by Ranorex Studio are well confined entities in a standardized format, that can be referenced by other .NET projects, be it from Ranorex Studio or Visual Studio. The assembly contains all the classes for the recordings and the repository and can be used from C# or Visual Basic or any other .NET language.</li>
</ul>
</div>
<div id="visual-studio-and-nunit-attribute-based-test-assemblies" class="section">
<h3><a class="toc-backref" href="#id3">Visual Studio and NUnit Attribute-based Test Assemblies</a></h3>
<p>Given the new Test Management in Ranorex Studio, what could induce a tester to use Ranorex Assemblies in Visual Studio or NUnit?</p>
<ul class="simple">
<li>Better integration with other tools, open source or proprietary, for continuous integration (<a class="reference external" href="http://cruisecontrol.sourceforge.net/">CruiseControl</a>, <a class="reference external" href="http://hudson-ci.org/">Hudson</a>, &#8230;) or test management (<a class="reference external" href="http://msdn.microsoft.com/en-us/library/bb385901.aspx">MS Test Manager</a>, <a class="reference external" href="http://www8.hp.com/us/en/software/software-solution.html?compURI=tcm:245-937026">HP Lifecycle Management</a>, <a class="reference external" href="http://blog.testlink.org/">TestLink</a> , &#8230;)</li>
<li>Unit Testing</li>
</ul>
<p>In VS 2008 there is unit test support and this got some more attention in VS 2010. VS 2010 Ultimate provides full coverage of life cycle management and testing tools. The NUnit Test Framework also uses .NET and has wide acceptance. What they don&#8217;t provide is a support for all the technologies that Ranorex provides. In NUnit and Visual Studio test assemblies tests are methods with attributes that mark them as test methods. Visual Studio test assemblies use these attributes</p>
<ul class="simple">
<li>[TestClass()] for the containing class</li>
<li>[TestMethod()] for the test method</li>
<li>[TestInitialize()] for a method that does initializations</li>
<li>[TestCleanup()] for a method that restores the previous state</li>
</ul>
<p>Tests from such assemblies can then be started with<a class="reference external" href="http://msdn.microsoft.com/en-us/library/ms182489(v=VS.100).aspx"> MSTest</a>.exe. To start tests using the <a class="reference external" href="http://www.nunit.org/">NUnit</a> framework (via console or GUI) the following attributes must be used:</p>
<ul class="simple">
<li>[TestFixture()]</li>
<li>[Test]</li>
<li>[SetUp()]</li>
<li>[TearDown()]</li>
</ul>
<p>The test drivers (MsTest.exe or nunit-console.exe) execute the tests and make a report file. That is a .trx file for MsTest.exe and a NUnit XML file for NUnit. Both of these formats, but more so the latter, can be recognized by popular Continuous Integration Frameworks, like CruiseControl and Hudson.</p>
</div>
<div id="ranorex-assemblies-in-visual-studio-projects" class="section">
<h3><a class="toc-backref" href="#id4">Ranorex Tests in Visual Studio Projects</a></h3>
<p>When working with both, Ranorex Studio and Visual Studio, I would recommend the following workflow:</p>
<ol class="arabic">
<li>
<p class="first">Create a test solution with Ranorex Studio.</p>
</li>
<li>
<p class="first">Edit and extend tests in Ranorex Studio.</p>
</li>
<li>
<p class="first">Compile</p>
</li>
<li>
<p class="first">Create a Test Project in Visual Studio</p>
<blockquote>
<ul class="simple">
<li>Add the ranorex assembly as reference (exe or dll)</li>
<li>Add Ranorex.Core.dll as reference</li>
<li>&#8230;</li>
<li>For test suite projects: make a text resource referencing your Ranorex Studio&#8217;s rxtst file</li>
</ul>
</blockquote>
</li>
<li>
<p class="first">Edit and extend tests in Ranorex Studio.</p>
</li>
<li>
<p class="first">Compile</p>
</li>
<li>
<p class="first">Adapt Visual Studio projects to the changes in Ranorex Studio</p>
</li>
<li>
<p class="first">Repeat the last three steps</p>
</li>
</ol>
<p><strong>Note:</strong> When you run a test from within Visual Studio the file handle is not released. In order to compile again you need to restart Visual Studio.</p>
<p>In order to have an abort key, you need to set it in the constructor of the test class. This requires a reference to the System.Windows.Forms assembly.</p>
<pre name="code" class="csharp">public VIPUnitTest()
{
    Ranorex.Keyboard.AbortKey = System.Windows.Forms.Keys.Pause;
}</pre>
<div id="recordings-or-user-code-modules" class="section">
<h4><a class="toc-backref" href="#id5">Recordings or User Code Modules</a></h4>
<p>The generated class for a recording implements the <tt>ITestModule</tt> interface:</p>
<pre name="code" class="csharp">public interface ITestModule
{
    void Run();
}</pre>
<p>Per default the <tt>Run()</tt> method is private, therefore for a recording the following public function is generated:</p>
<pre name="code" class="csharp">public static void Start()
{
    TestModuleRunner.Run(Instance);
}</pre>
<p>To play a recording from Visual Studio do something like this.</p>
<pre name="code" class="csharp">[TestMethod]
public void PlayRecordingModules()
{
    try
    {
        VIPTestSuite.RecorderModules.StartSystemUnderTest.Instance.SutPath
            = SutPath;
        VIPTestSuite.RecorderModules.StartSystemUnderTest.Start();
        VIPTestSuite.RecorderModules.AddVIP.Start();
        VIPTestSuite.RecorderModules.CloseApplication.Start();
    }
    catch (Ranorex.ValidationException)
    {
        Assert.Fail();
    }
}</pre>
<p>A Ranorex User Code Module must also implement the <tt>ITestModule</tt> interface. If no <tt>Start()</tt> method is provided, the code equivalent to the one above would be:</p>
<pre name="code" class="csharp">[TestMethod]
public void PlayUserCodeModules()
{
    VIPTestSuite.RecorderModules.StartSystemUnderTest.Instance.SutPath
        = SutPath;
    Ranorex.Core.Testing.TestModuleRunner.Run(
        VIPTestSuite.RecorderModules.StartSystemUnderTest.Instance);
    Ranorex.Core.Testing.TestModuleRunner.Run(
        VIPTestSuite.RecorderModules.AddVIP.Instance);
    Ranorex.Core.Testing.TestModuleRunner.Run(
        VIPTestSuite.RecorderModules.CloseApplication.Instance);
}</pre>
<p>If the Ranorex Test Module test fails an exception will be thrown. If you don&#8217;t catch the exception, Visual Studio or MSTest will do so for you.</p>
</div>
<div id="ranorex-test-suite" class="section">
<h4><a class="toc-backref" href="#id6">Ranorex Test Suite</a></h4>
<p>There is no .NET API to access the test cases of a test suite. But one can access them using the <a class="reference external" href="http://www.ranorex.com/support/user-guide-20/lesson-4-ranorex-test-suite.html#c3022">command line parameters</a> of the produced executable assembly. Test cases of a test suite are stored in the rxtst file, which is a separate XML file that needs to be deployed with the assembly.</p>
<p><a class="reference external" href="http://msdn.microsoft.com/en-us/library/ms182489(v=VS.100).aspx">MSTest</a> per default copies test assemblies, but no additional files. This<a class="reference external" href="http://msdn.microsoft.com/en-us/library/ee256991.aspx"> article from MSDN</a> explains how to deploy additional files with MSTest. In short: Double Click on <tt>Local.testsettings</tt> and go to <tt>deployment</tt>.</p>
<blockquote><p>Another alternative could be to provide a full path to the rxtst file:</p>
<pre name="code" class="csharp">Ranorex.Core.Testing.TestSuiteRunner.Run(
    typeof(VIPTestSuite.VIPTestSuiteRepository),
    @"/testsuite:C:\tests\VipTestSuite.rxtst");</pre>
<p>But when deploying to different machines one has to care for an absolute path that is valid on all of them.</p></blockquote>
<p>The <strong>alternative to deploying the rxtst file</strong> separately I use here is to integrate it as text resource into the VS test assembly. This way there is no need to separately deploy the rxtst file.</p>
<ol class="arabic">
<li>
<p class="first">Right-click on the project and select properties from the context menu</p>
</li>
<li>
<p class="first">In the resources tab click on the blue line in the center to create a resource file</p>
</li>
<li>
<p class="first">From the drop-down &#8220;Add Resource&#8221; choose &#8220;Add New Text File&#8221; and give it a name like <tt>VipTestSuite</tt></p>
</li>
<li>
<p class="first">Find all occurences of <tt>VipTestSuite</tt> in the project</p>
</li>
<li>
<p class="first">In the <tt>.resx</tt> change the file path to<br />
<tt><span class="pre">..\..\..\..\..\Ranorex\RanorexStudio</span> Projects\Samples\VIPTestSuite\VIPTestSuite.rxtst</tt></p>
<p><strong>Note:</strong> This is the relative path into the Ranorex solution folder. The same file is used for Ranorex and Visual Studio. Take care to use the rxtst file that fits to the referenced VIPTestSuite.exe. They are linked via GUIDs.</li>
<li>
<p class="first">In the solution explorer remove <tt>VipTestSuite.txt</tt> that was generated when adding the text resource</p>
</li>
</ol>
<p>Test methods accessing the ranorex test suite file (rxtst) would look like this:</p>
<pre name="code" class="csharp">[TestMethod]
public void Test_AddAndDeleteSingleVIP()
{
    int res = Ranorex.Core.Testing.TestSuiteRunner.Run(
        typeof(VIPTestSuite.VIPTestSuiteRepository),
        "/testcase:AddAndDeleteSingleVIP  /param:\"StartPath="
        +SutPath+"\"", Resources.VipTestSuite);
    Assert.AreEqual(res,0);//-1 is return on failure
}</pre>
<p><strong>Note:</strong> <tt>Resources.VipTestSuite</tt> is provided as an additional parameter</p>
<div class="important">
<p><strong>Important:</strong></p>
<p class="last">The first parameter of <tt>Ranorex.Core.Testing.TestSuiteRunner.Run</tt> is a type of the referenced Ranorex assembly (VipTestSuite.exe in our case).</p>
</div>
<p>This <strong>conversion</strong> can be automated with a script. I have added this as a custom build step in the sample project. Remove it if you don&#8217;t have Python installed.</p>
<pre name="code" class="python">import sys

def rxtst_to_cs(rxtst_file,cs_file):
    """collects all root testcases and
    creates a C# file with a partial class
    containing the corresponding test methods"""
    from xml.etree.ElementTree import ElementTree
    rxtst = ElementTree()
    rxtst.parse(rxtst_file);
    method_template = """

            [TestMethod]
            public void Test_{0}()
            {{
                int res = Ranorex.Core.Testing.TestSuiteRunner.Run(
                    typeof(VIPTestSuite.VIPTestSuiteRepository),
                    "/testcase:{0}  /param:\\"StartPath="
                    +SutPath+"\\"", Resources.VipTestSuite);
                Assert.AreEqual(res,0);//-1 is return on failure
            }}
    """
    methods = ""
    tests = rxtst.findall("content/testcase")
    methods += '\n'.join(
        [method_template.format(t.get("name")) for t in tests])
    tests = rxtst.findall("content/folder/testcase")
    methods += '\n'.join(
        [method_template.format(t.get("name")) for t in tests])
    tests = rxtst.findall("content/folder/folder/testcase")
    methods += '\n'.join(
        [method_template.format(t.get("name")) for t in tests])
    code_wrapping = """

    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using VIP_VS_Test.Properties;

    namespace VIP_VS_Test
    {{
        public partial class VIPUnitTest
        {{
            {0}
        }}
    }}
    """
    with open(cs_file,'w') as f:
        f.write(code_wrapping.format(methods))

if __name__ == "__main__":
    rxtst_to_cs(sys.argv[1],sys.argv[2])</pre>
<p>If you open the Microsoft Report file (<tt>trx</tt> file) you can also see the details about test failure, because the output of the Ranorex executable is recorded by the Microsoft test driver. In addition those details are also in the Ranorex <tt>rxlog</tt> file. This file can be rendered with the Internet Explorer, if you rename the extension to <tt>xml</tt>.</p>
</div>
</div>
<div id="links" class="section">
<h3><a class="toc-backref" href="#id7">Links</a></h3>
<ul class="simple">
<li>A partly overlapping blog on <a class="reference external" href="http://www.ranorex.com/support/user-guide-20/visual-studio-integration.html">Visual Studio Integration</a></li>
<li><a class="reference external" href="http://www.ranorex.com/blog/using-nunit-for-test-execution">Using NUnit for Test Execution</a></li>
</ul>
</div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fcombining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing&amp;title=Combining%20Ranorex%203.0%20and%20Visual%20Studio%202010%20for%20UI%20Unit%20Testing" id="wpa2a_14"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/LYvqDO1Jbsg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/combining-ranorex-3-0-and-visual-studio-2010-for-ui-unit-testing</feedburner:origLink></item>
		<item>
		<title>Automation of Java AWT/Swing Applications with the Java Plug-In</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/O67adozMCsk/automation-of-java-awtswing-applications</link>
		<comments>http://www.ranorex.com/blog/automation-of-java-awtswing-applications#comments</comments>
		<pubDate>Thu, 20 Jan 2011 16:07:27 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1365</guid>
		<description><![CDATA[To make automation available for Java AWT/Swing applications and applets in Ranorex, there is a new and currently experimental Java Plug-In available for download. Set up Java Plug-In Java Plug-In Example Project Ranorex 3.1 comes with an instrumentation wizard which will setup the needed files and configurations for you. Please see the Java instrumentation wizard [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-medium wp-image-1369  aligncenter" src="http://www.ranorex.com/blog/wp-content/uploads/2011/01/overview-546x307.jpg" alt="Ranorex Test Automation for Java AWT/Swing Application with Java Plugin" width="546" height="307" /></p>
<p>To make automation available for Java AWT/Swing applications and applets in Ranorex, there is a new and currently experimental Java Plug-In available for download.</p>
<ul>
<li><a href="http://www.ranorex.com/blog/automation-of-java-awtswing-applications#setup">Set up Java Plug-In</a></li>
<li><a href="http://www.ranorex.com/blog/automation-of-java-awtswing-applications#sample">Java Plug-In Example Project</a></li>
</ul>
<p><span id="more-1365"></span></p>
<div style="margin: 15px 0pt; padding: 10px 20px; background-color: rgb(255, 255, 140);" class="download-form">
	  <b>Ranorex 3.1 comes with an instrumentation wizard which will setup the needed files and configurations for you.</b></p>
<p><a href="http://www.ranorex.com/support/user-guide-20/instrumentation-wizard/java-awt-swing.html">Please see the Java instrumentation wizard documentation page</a></p>
</p></div>
<p><a id="setup"></a></p>
<h3>Setting up the Java Plug-In</h3>
<ol>
<li>First of all close all Ranorex Tools, download the <a href="http://www.ranorex.com/blog/wp-content/uploads/2011/01/Ranorex_JavaPlugin235_Preview5.zip">Ranorex 2.3.5 Java Plug-In (zip)</a> (this requires Ranorex 2.3.5 or later) or the <a href="http://www.ranorex.com/blog/wp-content/uploads/2011/01/JavaPlugin_Ranorex3Release_Preview7.zip">Ranorex 3.0 Java Plug-In (zip)</a> and extract it.</li>
<li>Now you have to<strong> determine the path of your active Java runtime Environment</strong> to know where to copy the necessary files to. Open the Java Runtime Environment Settings which can be found in “Java Control Panel” (<strong>Control-Panel -&gt; Java</strong>). There you can see the path of your Java Runtime Environment. If you have more than one Java Runtime Environment installed on your machine, check which one will be used to execute your Java applications by determining which one is activated. If you are using Windows XP SP2, please install <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=17D997D2-5034-4BBB-B74D-AD8430A1F7C8">Windows Update KB884020.</a></li>
<li>After identifying the path you have to copy each of the following files to its corresponding directory based on the root folder of your java runtime installation (e.g. &#8220;C:\Program Files (x86)\Java\jre6\&#8221;):
<ul>
<li><strong>“accessibility.properties” to \lib</strong></li>
<li><strong>“RanorexAutomation.jar” to \lib\ext</strong></li>
<li><strong>“JavaHelper32/64.dll” to \bin</strong></li>
</ul>
</li>
<li>After that, copy the file “<strong>Ranorex.Plugin.Java.dll</strong>” into the Ranorex Plugin directory (“C:\Documents and Settings\All Users\Application Data\Ranorex2\Plugins” for Windows XP or “C:\ProgramData\Ranorex2\Plugins” for Vista, 7 for Ranorex 2.3. For Ranorex 3.0 choose the Ranorex3 folder instead of the Ranorex2 folder).</li>
<li>Start Ranorex Spy and check if the Java Plug-In was successfully loaded. Therefore, please open the About Dialog by clicking the Ranorex Logo and check if the Java Plug-In is loaded.</li>
<p style="text-align: center;"><img class="size-full wp-image-1366  aligncenter" src="http://www.ranorex.com/blog/wp-content/uploads/2011/01/about.jpg" alt="Correctly installes Ranorex Java Plugin" width="409" height="440" /></p>
<li>Start your Java application and Spy. Now you should be able to track the controls of your application under test.</li>
</ol>
<p><a id="sample"></a></p>
<h3>Java Plug-In Example Project</h3>
<p>After assuring that the Java plug-In is working as expected it’s now time to start with a simple test project on a Java application.</p>
<p>As application under test we will take a small unit converter test application which can be found here: <a href="http://download.oracle.com/javase/tutorialJWS/uiswing/components/ex6/Converter.jnlp">Converter.jnlp</a>.</p>
<p>Create a new Project in Ranorex Studio and start the application under test by adding following line of code in Program.cs before your recording will be started.</p>
<pre name="code" class="csharp">System.Diagnostics.Process.Start("..\\..\\Converter.jnlp");</pre>
<p>After that copy the application to your project folder and  manually start it.</p>
<p>Start a recording on the Application and:</p>
<ul>
<li>Slide the “Metric System” slider (marked in red) down.</li>
<li>Validate the text held by the text field in the “U.S. System” area (marked in orange).</li>
<li>Validate the slider value of the “U.S. System” slider (marked in green).</li>
<li>Enter the “Metric System”, remove the given value and replace it with the value 100 (marked in yellow).</li>
<li>Change the Unit held by the combo box in “Metric System” area from Centimeters to Meters (marked in blue).</li>
<li>Validate that the text held by the text field in the “U.S. System” area equals to 3.937,01.</li>
<li>Validate that the slider value of the “U.S. System” slider equals to 3.937.</li>
</ul>
<p style="text-align: center;"><img class="size-full wp-image-1367  aligncenter" src="http://www.ranorex.com/blog/wp-content/uploads/2011/01/converter.jpg" alt="Java AWT/Swing Application Under Test with Ranorex Java plugin" width="296" height="203" /></p>
<p>After recording close the application under test, compile your project and start you compiled project.<br />
Ranorex should be able to automate and validate this Java Swing Application and the generated Ranorex Test Report should look something like this:</p>
<p style="text-align: center;"><img class="size-medium wp-image-1370  aligncenter" src="http://www.ranorex.com/blog/wp-content/uploads/2011/01/report-546x264.jpg" alt="Ranorex Test Report for Java AWT/Swing Test Automation" width="546" height="264" /></p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2011/01/JavaPluginExample.zip">Download the Java Plug-In Example Solution (JavaPluginExample.zip)</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fautomation-of-java-awtswing-applications&amp;title=Automation%20of%20Java%20AWT%2FSwing%20Applications%20with%20the%20Java%20Plug-In" id="wpa2a_16"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/O67adozMCsk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/automation-of-java-awtswing-applications/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/automation-of-java-awtswing-applications</feedburner:origLink></item>
		<item>
		<title>Enabling automation for custom QT widgets by adding Accessibility</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/ieRE_ZpVZZY/enabling-automation-for-custom-qt-widgets-by-adding-accessibility</link>
		<comments>http://www.ranorex.com/blog/enabling-automation-for-custom-qt-widgets-by-adding-accessibility#comments</comments>
		<pubDate>Thu, 09 Dec 2010 12:31:02 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1283</guid>
		<description><![CDATA[To make automation available for QT applications, an accessibility interface is provided by QT, which is based on different technologies for each platform QT is available on. In our case MSAA (Microsoft Active Accessibility) is used when working on a Microsoft Windows platform. QT implements accessibility for most of its built-in widgets, but if you [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-medium wp-image-1294" src="http://www.ranorex.com/blog/wp-content/uploads/2010/12/image1-546x325.jpg" alt="Make automation available for QT applications" width="546" height="325" /></p>
<p>To make automation available for QT applications, an accessibility interface is provided by QT, which is based on different technologies for each platform QT is available on. In our case MSAA (Microsoft Active Accessibility) is used when working on a Microsoft Windows platform.</p>
<p>QT implements accessibility for most of its built-in widgets, but if you want to add this feature to your own widgets, you have to implement it yourself.</p>
<p>To illustrate the steps that have to be implemented to make a custom widget ready for automation, we want to extend an example widget which shows an analog clock. To provide accessibility for our clock widget, we need to implement an accessible interface for it and send accessible events from the widget when the time changes.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2010/12/analogclock.zip">The sample project can be found at &#8220;AnalogClock.zip</a>&#8220; (contains a Microsoft Visual Studio project).</p>
<ul>
<li><a href="http://www.ranorex.com/blog/enabling-automation-for-custom-qt-widgets-by-adding-accessibility#architecture">QT Accessibility Architecture</a></li>
<li><a href="http://www.ranorex.com/blog/enabling-automation-for-custom-qt-widgets-by-adding-accessibility#implementing">Implementing Accessibility</a></li>
<li><a href="http://www.ranorex.com/blog/enabling-automation-for-custom-qt-widgets-by-adding-accessibility#connecting">Connecting Accessibility to our Custom Widget</a></li>
<li><a href="http://www.ranorex.com/blog/enabling-automation-for-custom-qt-widgets-by-adding-accessibility#trying">Let’s spy it out</a></li>
</ul>
<p><span id="more-1283"></span><br />
<a id="architecture"></a></p>
<h3>QT Accessibility Architecture</h3>
<p>The whole structure of the user interface you want to make accessible (&#8220;automatable&#8221;) is represented by a tree of accessible objects. All of these objects are derived from the class QAccesibleInterface which provides a wide range of predefined information (role, action and relation) that can be defined for these objects. (See  <a href="http://doc.trolltech.com/4.7/qaccessible.html">QAccessible Class Reference</a>)</p>
<p>So in our example the sub-tree architecture should look something like this:</p>
<p style="text-align: center;"><img class="aligncenter size-medium wp-image-1295" src="http://www.ranorex.com/blog/wp-content/uploads/2010/12/image2-546x258.jpg" alt="Tree structure and the relationship between the tree items" width="546" height="258" /></p>
<p>Let’s have a look at this tree structure and the relationship between those tree items. We have the clock itself which is mapped as &#8220;clock&#8221;. And as child elements of the clock we have both the minute hand and the hour hand mapped as &#8220;slider&#8221;.</p>
<p>As you can see above, our clock consists of three accessible objects: the clock itself, as well as the hour and minute hands. We use an enum ClockElements to identify them. The code for this enumeration is shown later when we start to implement our accessibility interface for the clock widget.</p>
<p><a id="implementing"></a></p>
<h3>Implementing Accessibility</h3>
<p>To provide accessibility for our clock widget, we need to implement an accessible interface for it and send accessible events from the widget when the time changes. We will first take a look at the implementation of the interface.</p>
<p>Let’s start with the header file:</p>
<pre name="code" class="cpp">class AccessibleClock : public QAccessibleWidget
{
public:

	enum ClockElements {
		ClockSelf = 0,
		HourHand,
		MinuteHand
	};

	AccessibleClock(QWidget *widget, Role role = Client,
		const QString &amp; name = QString());

	int childCount() const;
	QRect rect(int child) const;
	QString text(Text text, int child) const;
	Role role(int child) const;

private:
	AnalogClock *clock() const
	{ return qobject_cast(widget()); }

};</pre>
<p>We extend the QAccessibleWidget class which inherits from QAccessibleInterface and helps us handling relationships and keeps track of events, roles, texts and bounding rectangles. Accessible interfaces for all subclasses of QWidget should use QAccessibleWidget as their base class.</p>
<p>Custom interfaces must implement states and give appropriate strings for the Text enum. This is implemented by the text and state functions. Our clock consists of three accessible objects: the clock itself, as well as the hour and minute hands. As described above we use the enum ClockElements to identify them. We also have to define the number of children held by our clock. That can be done with the function childCount. To define the bounding rects of our accessibility objects the function rect is used.</p>
<p>So let’s have a look at the implementation of all of those functions mentioned above, starting with the function which returns the number children our clock element has:</p>
<pre name="code" class="cpp">int AccessibleClock::childCount() const
{
	return 2;
}</pre>
<p>We return &#8220;2&#8243;, one for the hour hand and one for the minute hand.</p>
<p>The next function provides the bounding rectangles of our widget:</p>
<pre name="code" class="cpp">QRect AccessibleClock::rect(int child) const
{
	QRect rect;
	QPoint topLeft = clock()-&gt;mapToGlobal(QPoint(0,0));
	switch (child) {
		  case ClockSelf:
			  rect = clock()-&gt;rect();
			  break;
		  case HourHand:
			  rect = clock()-&gt;hourHandRect();
			  break;
		  case MinuteHand:
			  rect = clock()-&gt;minuteHandRect();
			  break;
		  default:
			  return QAccessibleWidget::rect(child);
	}
	return QRect(topLeft.x() + rect.x(), topLeft.y()
		+ rect.y(), rect.width(), rect.height());
}</pre>
<p>As you can see, the child enumeration (or index) is an argument of  the rect() function, so we have to decide which rectangle to return. The rects of the clock and their hands are provided by our analog clock implementation. We only have to calculate the screen coordinates of our rectangles before returning them.</p>
<p>After that we want to define role and text of our analog clock and its child objects:</p>
<pre name="code" class="cpp">QAccessible::Role AccessibleClock::role(int child) const
{
	switch (child) {
		case ClockSelf:
			return Clock;
		case HourHand:
		case MinuteHand:
			return Slider;
		default:
			;
	}
	return QAccessibleWidget::role(child);
}</pre>
<p>We have decided to use the role clock for our analog clock and the role slider for the clocks hands. You can find the specific roles at <a href="http://doc.trolltech.com/4.7/qaccessible.html#Role-enum">QAccessible::Role</a>.</p>
<p>Now we have to define the values for description, name and value for each of our accessibility objects:</p>
<pre name="code" class="cpp">QString AccessibleClock::text(Text text, int child) const
{
	if (!widget()-&gt;isVisible())
		return QString();

	switch (text) {
		case Description:
			switch (child)
			{
				case ClockSelf:
					return "an Analog Clock";
				case HourHand:
					return "a Hour Hand";
				case MinuteHand:
					return "a Minute Hand";
			}
		case Name:
			switch (child)
			{
				case ClockSelf:
					return "Analog Clock";
				case HourHand:
					return "Hour Hand";
				case MinuteHand:
					return "Minute Hand";
			}
		case Value:
			switch (child)
			{
				case ClockSelf:
					return clock()-&gt;currentTime.toString();
				case HourHand:
					return QString("%1").arg(clock()-&gt;currentTime.hour());
				case MinuteHand:
					return QString("%1").arg(clock()-&gt;currentTime.minute());
			}

		default:
			return QString();
	}
	return QString();
}</pre>
<p>After implementing an accessibility interface for our analog clock, we have to somehow inform the accessibility object about changes of state (in our case, when time passes). Therefore we have to hook in the timeout function of our analog clock which is connected to a timer which fires every minute. Here we have to call updateAccesibility to inform our accessibility objects about the new values:</p>
<pre name="code" class="cpp">void AnalogClock::timeout()
{
	currentTime = QTime::currentTime();
	QAccessible::updateAccessibility(this, 0, QAccessible::ValueChanged);
	update();
}</pre>
<p><a id="connecting"></a></p>
<h3>Connecting Accessibility to our Custom Widget</h3>
<p>At this point we have implemented our accessibility interface and we update our state whenever the minute or hour hands move. The next step is to connect the accessibility implementation with the widget itself. This can be done by either implementing an accessibility plug-in or by implementing an interface factory. A plug-in is a class stored in a shared library that can be loaded at run-time.  In our example, we choose to implement the interface factory. An explanation of how to implement the plug-in can be found at <a href="http://doc.qt.nokia.com/4.7/accessible.html">Accessibility in Qt</a>.</p>
<p>To implement the factory we extend our main.cpp for the factory implementation and in the main function we are installing this factory:</p>
<pre name="code" class="cpp">QAccessibleInterface *clockFactory(const QString &amp;classname, QObject *object)
{
	QAccessibleInterface *interface = 0;

	if (classname == "AnalogClock" &amp;&amp; object &amp;&amp; object-&gt;isWidgetType())
		interface = new AccessibleClock(static_cast(object));
	return interface;
}

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QAccessible::installFactory(clockFactory);
	AnalogClock analogClock;
	analogClock.show();
	return a.exec();
}</pre>
<p>Our factory is a function pointer for a function that takes two parameters, a QString and a QObject. We check whether the widget an accessible interface is requested for is actually an AnalogClock. If it is, we create and return our custom interface for it.</p>
<p><a id="trying"></a></p>
<h3>Let’s spy it out</h3>
<p>Now we have done everything needed to make our clock accessible. Let’s give it a try. Just compile your project and use Ranorex Spy on the application. You will see that our clock now will have a name, description, role and of course a value. The same applies to the two hands.</p>
<p style="text-align: center;"><img class="aligncenter size-medium wp-image-1296" src="http://www.ranorex.com/blog/wp-content/uploads/2010/12/image3-546x328.jpg" alt="Custom QT widgets with Ranorex Spy" width="546" height="328" /></p>
<p>As you can see from our example, your custom QT widgets will no longer be an unautomatable black blox if you spend some time implementing basic accessibility. For more information on QT Accessibility, visit <a href="http://doc.qt.nokia.com/4.7/accessible.html">Accessibility in Qt</a>.</p>
<p><a href="http://www.ranorex.com/blog/wp-content/uploads/2010/12/analogclock.zip">Download the Sample Project &#8220;AnalogClock.zip</a>&#8220; (contains a Microsoft Visual Studio project).</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Fenabling-automation-for-custom-qt-widgets-by-adding-accessibility&amp;title=Enabling%20automation%20for%20custom%20QT%20widgets%20by%20adding%20Accessibility" id="wpa2a_18"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/ieRE_ZpVZZY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/enabling-automation-for-custom-qt-widgets-by-adding-accessibility/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/enabling-automation-for-custom-qt-widgets-by-adding-accessibility</feedburner:origLink></item>
		<item>
		<title>RanoreXPath – Tips and Tricks</title>
		<link>http://feedproxy.google.com/~r/ranorex-blog/~3/CHV7PDiwNqM/ranorexpath-tips-and-tricks</link>
		<comments>http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#comments</comments>
		<pubDate>Mon, 11 Oct 2010 07:52:16 +0000</pubDate>
		<dc:creator>twalter</dc:creator>
				<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.ranorex.com/blog/?p=1139</guid>
		<description><![CDATA[As you might know, the RanoreXPath expression is a powerful identifier of UI elements for desktop and web applications. In this example we would like to show you some RanoreXPath tips and tricks for your everyday life. As application under test we choose the “Ranorex Flex Example Page” which can be found under FlexExamplePage. Element [...]]]></description>
			<content:encoded><![CDATA[<p>As you might know, the RanoreXPath expression is a powerful identifier of UI elements for desktop and web applications. In this example we would like to show you some RanoreXPath tips and tricks for your everyday life. As application under test we choose the “Ranorex Flex Example Page” which can be found under <a href="http://www.ranorex.com/web-testing-examples/flex/FlexExample.html" target="_self">FlexExamplePage</a>.</p>
<ul>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#Element_Browser">Element Browser</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#General_Layout">General Layout of RanoreXPath</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#Modify">Search for multiple button elements</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#Modify_Equalities">Identify a checkbox by its &#8220;checked&#8221; state</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#Modify_Equality_Combinations">Identify checkboxes by combining attributes</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#Modify_Parent_Attributes">Recognize related elements by using parent-operator</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#Modify_Sibling">Recognize elements by using preceding- and following-sibling</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#Modify_RegExp">Identify e-mail address fields using regular expressions</a></li>
<li><a href="http://www.ranorex.com/blog/ranorexpath-tips-and-tricks#User_Code">Use RanoreXPath in user code items</a></li>
</ul>
<p><span id="more-1139"></span><br />
<a id="Element_Browser"></a></p>
<h3>Element Browser</h3>
<p>Let’s have a look at the Element Browser to get a summary of RanoreXPath&#8217;s functionality before we get to the test automation code. Just start with browsing through the Element Browser identifying our AUT (application under test) and making the FlexObject located on the webpage our new root node (via context menu -&gt; Set Element as Root):</p>
<p><img class="alignnone size-full wp-image-1148" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/1.jpg" alt="Ranorex Element Browser" width="436" height="529" /></p>
<p>Only the FlexObject and its underlying elements are now visible and all other elements are filtered out.</p>
<p><a id="General_Layout"></a></p>
<h3>General Layout of RanoreXPath</h3>
<p>So let’s take a closer look at the RanoreXPaths in our AUT. The absolute RanoreXPath of our FlexObject should look something like this:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1161" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p1.jpg" alt="RanoreXPath" width="355" height="18" /></p>
<p>where dom, body and flexobject are adapters which specify the type or classification of the UI element followed by their attribute value comparison to identify the requested element. Basically a path consists of the following elements:</p>
<p style="text-align: center;"><img class="size-full wp-image-1171  aligncenter" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p0.jpg" alt="General Layout of RanoreXPath" width="213" height="17" /></p>
<p>whereas the comparison operator can be more complex than a simple equality.</p>
<p><a id="Modify"></a></p>
<h3>Search for multiple button elements</h3>
<p>Assuming we want to show all of the buttons which are direct children of our earlier defined root node, just type</p>
<p><img class="aligncenter size-full wp-image-1162" title="p2" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p2.jpg" alt="p2" width="52" height="15" /></p>
<p>into the RanoreXPath edit field. What we have done is creating a relative path to all child nodes of our actual node which are buttons.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1149" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/2.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="204" height="66" /></p>
<p>But what if we want to show all buttons contained in our flex object?</p>
<p>The solution is as follows:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1163" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p3.jpg" alt="RanoreXPath" width="60" height="16" /></p>
<p>What we now have done is creating a relative path to all descendant nodes of our actual nodes which are buttons, thus all buttons in all levels of the sub tree of the current element.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1150" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/3.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="263" height="544" /></p>
<p><a id="Modify_Equalities"></a></p>
<h3>Identify a checkbox by its &#8220;checked&#8221; state</h3>
<p>Another thing we can do is creating a path to a “checkbox “. To accomplish that we have to enable the checked attribute of a checkbox item in our AUT, so check “milk” (and uncheck the &#8220;send me coupons item&#8221;) in the Checkbox Control Example area. Now we have to validate which item of the checkbox control has its attribute &#8220;checked&#8221; set to true:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1164" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p4.jpg" alt="RanoreXPath" width="413" height="17" /></p>
<p>The only element now visible in our Element Browser should be the &#8220;milk&#8221; checkbox element:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1151" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/4.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="255" height="64" /></p>
<p><a id="Modify_Equality_Combinations"></a></p>
<h3>Identify checkboxes by combining attributes</h3>
<p>You can extend this example to e.g. not search for &#8220;eggs&#8221; but to find all other checked checkboxes in the container using the equality operator:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1165" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p5.jpg" alt="RanoreXPath" width="510" height="16" /><br />
<img class="aligncenter size-full wp-image-1152" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/5.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="254" height="83" /></p>
<p>or  only search for &#8220;milk&#8221; and &#8220;eggs&#8221; using the “or” instead of the “and” operator:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1166" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p6.jpg" alt="RanoreXPath" width="467" height="16" /><br />
<img class="aligncenter size-full wp-image-1153" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/6.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="255" height="79" /></p>
<p><a id="Modify_Parent_Attributes"></a></p>
<h3>Recognize related elements by using parent-operator</h3>
<p>Now let’s see if we can get the telephone number of Maurice Smith:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1224" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/p10.jpg" alt="RanoreXPath" width="200" height="16" /><br />
<img class="aligncenter size-full wp-image-1223" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/10.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="206" height="81" /></p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1222" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/101.jpg" alt="Parent operator example (RanoreXPath)" width="405" height="256" /></p>
<p>So the characters “..” reference the parent of the current result element. In our example that is the parent of the cell holding the text &#8220;Maurice Smith&#8221; (framed red), which is the 3rd row (framed blue). As we know that the second column of our table stores the telephone numbers, we can retrieve the desired cell by using its index &#8220;[2]&#8221; (framed green).</p>
<p><a id="Modify_Sibling"></a></p>
<h3>Recognize related elements by using preceding- and following-sibling</h3>
<p>What if we have a telephone number and want to get the corresponding name and e-mail address? Therefore, we need to get the preceding cell:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1248" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/p11.jpg" alt="RanoreXPath" width="568" height="14" /><br />
<img class="aligncenter size-full wp-image-1246" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/11.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="203" height="83" /></p>
<p>The &#8220;preceding-sibling::cell&#8221; command delivers all preceding cells. In our case the result is the name (framed blue) corresponding to the given telephone number (framed red).</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1249" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/p12.jpg" alt="RanoreXPath" width="564" height="15" /><br />
<img class="aligncenter size-full wp-image-1246" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/11.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="203" height="83" /></p>
<p>In contrast the &#8220;following-sibling::cell&#8221; command delivers all following cells. In our case that is the e-mail address (framed green) corresponding to the given telephone number (framed red).</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1247" src="http://www.ranorex.com/blog/wp-content/uploads/2010/10/12.jpg" alt="Preceding- and following-sibling operator example (RanoreXPath)" width="405" height="256" /></p>
<p><a id="Modify_RegExp"></a></p>
<h3>Identify e-mail address fields using regular expressions</h3>
<p>Additional to simple equality comparison, you can use regular expressions in attribute conditions.  Assume we want to search for all cell adapters containing an email address in their text attribute. There are several ways how a regular expression which matches an email address could look like, for example &#8220;.+q.+\..+&#8221;. Now we can use this regular expression in our RanoreXPath:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1168" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/p8.jpg" alt="RanoreXPath" width="157" height="15" /><br />
<img class="aligncenter size-full wp-image-1155" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/8.jpg" alt="Ranorex Element Browser (RanoreXPath)" width="205" height="178" /></p>
<p>The &#8220;~&#8221; operator instructs Ranorex to perform comparison using regular expressions.  The “.” in our expression matches to every single character and the “+” defines that the character on its left should match one or more times. To escape special characters (like &#8220;.&#8221;), you need to precede the character with a backslash “\”. In our example every expression will match that contains the character “@” with one or more characters before and after it, followed by a “.” which in turn is followed by one or more characters. Have a look at <a href="http://www.ranorex.com/support/user-guide-20/ranorexpath.html#c2463" target="_self">RanoreXPath with regular expression</a> for more examples of using regular expressions in RanoreXPath.</p>
<p><a id="User_Code"></a></p>
<h3>Use RanoreXPath in user code items</h3>
<p>Now as we all know how powerful RanoreXPath is, let’s start applying our knowledge to a Ranorex project. First of all add our newly defined root &#8211; the flex object &#8211; to the repository of the project via drag and drop and rename it to “flex_object”. After that add a new user code item – let’s call it &#8220;moveToButtons&#8221; &#8211; to the recording and switch to code. Add following code to the just created method:</p>
<pre name="code" class="csharp">foreach(Ranorex.Button my_button in repo.flex_object.Find("./button"))
{
    my_button.MoveTo();
    Delay.Milliseconds(300);
}</pre>
<p>Then build and run your project. As expected, the mouse cursor moves to all buttons which are direct child nodes of our root. In order to move to all visible buttons in the flex object, not only to direct child nodes, alter your code as follows:</p>
<pre name="code" class="csharp">foreach(Ranorex.Button my_button in repo.flex_object.Find(".//button[@visible=’True’]"))
{
    my_button.MoveTo();
    Delay.Milliseconds(300);
}</pre>
<p>In our user code example we’ve only used relative paths till now, but of course it’s possible to use absolute paths, too. So let’s try  to find out the e-mail address of Maurice Smith via an absolute path. The following code searches for Maurice&#8217; email address (using the regular expression from our previous example) and writes the email address to the Ranorex Test Report:</p>
<pre name="code" class="csharp">Ranorex.Cell cell = "/dom[@page='FlexExample.html']/body/flexobject/container[@caption='DataGrid Control']/table/row/cell[@text='Maurice Smith']/../cell[@text~'.+@.+\..+']";
Report.Info("Info: ", cell.Text.ToString());</pre>
<p>After building and executing the test, you should see the expected email address in your Ranorex Test Report.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1180" src="http://www.ranorex.com/blog/wp-content/uploads/2010/09/91.jpg" alt="Ranorex Test Report (RanoreXPath)" width="456" height="163" /></p>
<p>So as you can see the RanoreXPath is very powerful at searching UI elements in your AUT without the use of programming skills. You can find every single UI element just by having knowledge about RanoreXPath modification and regular expressions. If you use the Ranorex Repository and the Ranorex Recorder you don&#8217;t even have to modify any code . For an overview of all relevant modifications of RanoreXPath visit the <a href="http://www.ranorex.com/support/user-guide-20/ranorexpath.html">RanoreXPath User Guide</a>.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ranorex.com%2Fblog%2Franorexpath-tips-and-tricks&amp;title=RanoreXPath%20%E2%80%93%20Tips%20and%20Tricks" id="wpa2a_20"><img src="http://www.ranorex.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p><img src="http://feeds.feedburner.com/~r/ranorex-blog/~4/CHV7PDiwNqM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ranorex.com/blog/ranorexpath-tips-and-tricks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ranorex.com/blog/ranorexpath-tips-and-tricks</feedburner:origLink></item>
	</channel>
</rss>

