tag:blogger.com,1999:blog-14142706137022895592024-03-08T06:59:51.201-06:00ArtOfTest, Inc. BlogSoftware Testing Made Easy - Ajax, Web Automation using .NETUnknownnoreply@blogger.comBlogger23125tag:blogger.com,1999:blog-1414270613702289559.post-33842150136936126632009-04-03T13:59:00.003-06:002009-04-03T14:01:59.982-06:00Blog moving to www.artoftest.comFew days ago we launched our new website at <a href="http://www.artoftest.com/">www.artoftest.com</a>.<br /><br />The website is a single sign-on that integrates our blogs, forums, downloads and all ArtOfTest, Inc users under one profile.<br /><br />We are moving this blog to our site blog here:<br /><a href="http://www.artoftest.com/community/blogs.aspx">http://www.artoftest.com/community/blogs.aspx</a><br /><br />If you have an RSS feed for this blog, please update your feed to:<br /><a href="http://www.artoftest.com/community/blogs.rss">http://www.artoftest.com/community/blogs.rss</a><br /><br />We will soon be adding more blogs on our main site discussing our products and features.<br /><br />Enjoy!<br />ArtOfTest, Inc.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-43085524150305402892009-03-12T12:10:00.001-06:002009-03-12T12:15:38.291-06:00Automation Design Canvas 1.1 Released!We are happy to announce the availability of Automation Design Canvas Version 1.1! This release incorporates tons of customer feedback that we have gathered since 1.0. We want to thank all our customers that have helped us refine our feature set and make 1.1 a robust testing platform for modern application.<br /><br />Automation Design Canvas is not your average testing tool. It has many innovations specifically designed for testing rich internet applications and handle the dynamic nature and complexities of these applications. Automation Design Canvas which is built on top of our popular <a href="http://www.artoftest.com/webaiifxproduct.aspx">WebAii Automation Framework</a> is not only a tool but also a testing platform for anyone to build on top of!<br /><br />This release also signals a new era of innovations in automated testing with the release of <a href="http://www.telerik.com/products/web-ui-test-studio.aspx">Telerik’s WebUI Test Studio</a> which is powered by Automation Design Canvas and WebAii Framework. Our partnership with Telerik highlights our commitment to customizable and contemporary testing solutions that are not only geared to help end users but also development vendors! It is one step forward in our mission of making software testing easier.<br />If you have not given Automation Design Canvas a good look then this is the time to do so. Here are some of the key features that Automation Design Canvas can offer:<br /><br />1. <strong>Simple point and click recording</strong>. The designer offers an integrated <a href="http://www.artoftest.com/ViewImage.aspx?img=vsd_full.png">overlay surface</a> that intelligently detects HTML page elements and offers common verification and action tags. There is no code to write or external tools to use. To update your tests, simply select a step and update its properties.<br /><br />2. <strong>Integrated in Visual Studio</strong>. If you are developing a .NET application, you are most probably using VS. Why not have your QA team also work in the same environment? Eradicate the need for managing different tools and eliminate the silos between your development and QA teams. Integrating both teams in one environment is one of the most effective ways to enhance your team’s productivity and cut your cost. Not to mention, Automation Design Canvas offers a very compelling price point.<br /><br />3. <strong>Sentence Verification Builder</strong>. Your test is a good as its verification! Without solid verification in each test, an automation test is useless. With Automation Design Canvas we offer an integrated and innovative designer that helps you build verification just like <a href="http://www.artoftest.com/ViewImage.aspx?img=sentence_full.png">writing a sentence</a>.<br /><br />4. <strong>Code Generation</strong>. For those of you that want <a href="http://www.artoftest.com/ViewImage.aspx?img=unit_full.png">full control</a> of your test case or simply want to customize a test using code, no problem! Automation Design Canvas allows you to generate code at a test or <a href="http://www.artoftest.com/ViewImage.aspx?img=codegen_full.png">step level</a> and add any set of custom steps using your favorite .NET language.<br /><br /><strong>So what’s next?<br /></strong><br />Well… many things. This year we hope to fully cover the web application matrix for testing by<br />1. Adding support for Silverlight. WebAii 2.0 will feature our runtime support and future Automation Design Canvas releases will feature our record/playback support.<br />2. Expanding our browser support matrix to include Chrome and Safari.<br />3. New website. This will be unveiled in the next few weeks.<br />4. Updated documentation and samples<br /><a href="http://www.artoftest.com/webaiidcproduct.aspx">Download</a> Automation Design Canvas today!<br /><br />Thanks,<br />ArtOfTest, Inc. Team.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1414270613702289559.post-32018475974702358142009-02-16T11:00:00.000-06:002009-02-16T11:05:09.593-06:00ArtOfTest forges a strategic alliance with Telerik, Inc.Austin, TX – February 2, 2009 – ArtOfTest, Inc. the experts in software quality assurance technologies and automated software testing has forged a strategic alliance with Telerik, Inc., the leading vendor of developer tools and UI components for .NET. This alliance is a first of its kind and reinforces ArtOfTest’s position as a thought leader and innovator in the software testing tools market.<br /><br />Telerik’s WebUI Test Studio™ announced today is the first tangible result of this alliance. Telerik’s WebUI Test Studio™ is an automated testing solution featuring the innovative ArtOfTest Automation Design Canvas™ and WebAii™Automation Framework and is specifically tailored for Telerik RadControls™ for ASP.NET AJAX; thanks to the integrated control translators which leverage ArtOfTest’s patented extensibility architecture of Automation Design Canvas.<br /><br />“We are very excited about partnering with Telerik and offering a specialized version of Automation Design Canvas™ to their customers,” said Faris Sweis & Christopher Eyhorn, Co-Founders of ArtOfTest. “This partnership and its offerings is a first of its kind between a UI component vendor and a testing tools company. We believe it is time to bring a new generation of cutting-edge technologies and innovative processes to software testing that will assist software quality professionals in building better software easier.”<br /><br />“With the new WebUI Test Studio, we are happy to present a new era in automated web testing,” said Svetozar Georgiev, Telerik Co-CEO. “Historically, testing tools have been complex and expensive, and as a result—out of reach for most small and medium-sized companies. We believe WebUI Test Studio will bring automated testing to the masses, finally making superior and cost-effective testing possible and facilitating team collaboration between developers and QAs. And there is an added value to Telerik customers—thanks to the integrated control translators, they can easily build tests against Telerik controls without having to understand their structure.”<br /><br /><strong>About Telerik</strong><br />Telerik is a leading vendor of development tools and components for Microsoft .NET. Developers from most of the Fortune 2000 companies, many of the world’s leading educational and non-profit organizations and thousands of consultants rely on Telerik products to build applications with unparalleled richness, responsiveness and interactivity. For more info on Telerik and its products, please visit <a href="http://www.telerik.com/">http://www.telerik.com/</a> .<br /><br /><strong>About ArtOfTest</strong><br />ArtOfTest, Inc. is building the next generation of software testing tools. Their mission is to evolve the software quality assurance industry through the advancement of cutting-edge technologies used in software testing and software quality assurance. For more info on ArtOfTest and its products, please visit <a href="http://www.artoftest.com/">http://www.artoftest.com/</a> .Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-64029821249415196522009-02-01T20:17:00.002-06:002009-02-01T20:30:13.613-06:00WebAii Automation Design Canvas 1.1 Preview now availableArtOfTest is happy to announce the availability of <strong>Automation Design Canvas 1.1 - Preview</strong>! The most productive and innovative tool for testing Web 2.0 applications! The official release of 1.1 will be available at the end of this month.<br /><br />WebAii Automation Design Canvas 1.1 incorporates tons of customer feedback that we have gathered over the last 6 months from customers using our 1.0 version. The 1.1 version includes vast enhancements in the following areas:<br /><br />1. <strong>Simplified Project Model</strong>: Your tests are now self-contained and have no dependency on other files in the solution. No more .WebAiiElements file or WebAiiProj files. Makes deployment scenarios a breeze and allows for tests to be easily portable across machines, users and projects. Simply copy, paste and include in any test project.<br /><br />2. <strong>Strongly-typed Project Elements</strong>: As you record tests, strongly typed elements are being generated on the fly and are automatically accessible from your NUnit or VS Unit tests or any other unit testing framework that you like. If you are one of those customers that wants to simply use our design canvas to quickly generate code, then this feature is for you! Other key benefits to this feature is the ability to discover project element changes at compile time vs. execution time which is a huge time saver!<br /><br />3. <strong>Record directly from Internet Explorer</strong>: You are no longer limited to our hosted browser instance inside Visual Studio. Launch IE in record mode and get the entire recording functionality including our Automation Overlay Surface and DOM Explorer attached to your IE instance. This setup is ideal for multi-monitor environments since you can have an IE instance on one screen to record from and Visual Studio on the second screen to manage the tests and execute them.<br /><br />4. <strong>Test case Reusability</strong>: This has been a constant customer request. If you have repetitive test steps that you need to execute in multiple tests (i.e. login), then record them as one test and then add that test as a step to whatever test that requires it.<br /><br />5. <strong>Enhanced Test Maintenance Support</strong>: Have your storyboard images gone out of date due to the churn in your application? With a simple click of a button, you can update these storyboard images automatically as your test is executing. You can even choose the browser type you want the images to be captured from.<br /><br />6. <strong>Tons of performance and reliability fixes.</strong><br /><br />For more details, please check out our expanded How-To Videos <a href="http://www.artoftest.com/webaiidcproduct.aspx?QS">here</a>, which expand on our existing feature set and cover the new 1.1 features.<br /><br />Thanks,<br /><br />ArtOfTest, Inc. Team.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-2260638683128946652009-01-10T22:25:00.002-06:002009-01-10T22:29:54.257-06:00WebAii 2.0 – Automate more than you expect!<span xmlns=""><p>In the last few months, we've been working really hard on refining our WebAii 2.0 feature set and polishing our first beta that we hope to release in Q1 of 2009. The goal for WebAii 2.0 is to enable a broader list of automation scenarios that were not possible in previous versions, address customer pain-points and expand our support to span the latest advancements in web development technologies. This has always been our promise to our customers and we believe WebAii 2.0 will delight our existing customers and will spur many to give WebAii a serious look. Let me outline some of our major features that we hope to preview in WebAii 2.0 beta:<br /></p><ol><li><div><strong>Safari/Chrome support:</strong> Yes, I have said it. WebAii 2.0 will support Safari (on Windows) and Google Chrome browsers. Our Beta support most probably will only contain the Safari support but future updates will incorporate Chrome support too. The great thing about this support is that you don't need to make any changes to your existing testcases if you are already using WebAii. Simply change the BrowserType setting to Safari or Chrome and watch your existing tests execute against that browser. WebAii's browser abstraction architecture is the key enabler to seamless browser integration. By adding this support we are enabling existing customers to expand their browser /compatibility testing.<strong><br /></strong></div><p><br /> </p></li><li><div><strong>Silverlight Automation Support:</strong> WebAii 2.0 will incorporate our Silverlight Extension that we have been previewing in the last few months. Whether you are automating HTML or Silverlight or both, you will have a one-stop-shop library that enables you to automate any of these technologies<strong><br /></strong></div><p><br /> </p></li><li><div><strong>Exposing the HTTP stack:</strong> In WebAii 2.0 in addition to having access to the browser DOM and the ability to manipulate it, we will also enable you to access/intercept and change the raw http requests between the browser and your web server. The HTTP stack will be wrapped in a clean object model that will enable you to intercept requests, modify requests/responses and measure raw http data for your test automation. This support will enable you to automate web scenarios within your test bed that were not possible before. You will be able to build synchronization points against specific http requests, test your page sizes for performance regression testing and potentially do some security testing by doing request/response tampering<span style="font-size:12;">.</span><strong><br /></strong></div><p><br /> </p></li><li><div><strong>Enhanced JavaScript support. </strong>We are taking JavaScript support in WebAii to new levels unheard of before <span style="font-family:Wingdings;">J</span>. Our HtmlControl suite will expand to contain a highly advanced architecture for JavaScript access. You will be able to access strongly typed JavaScript objects from your testcases, attach to native JavaScript events from .NET, pass JavaScript eventargs and map HtmlControls to pure JavaScript object instances. With such support, you should be able to fully automate and control your JavaScript with a clean object model. <strong><br /></strong></div><p><br /> </p></li></ol><p><strong>In addition to the above features WebAii 2.0 will contain tons of feature requests that customers have been asking for in addition to tons of bug fixes. Our goal is to also release a 1.1 update by end of Feb 09 that will service many of the bug reported by customers directly or on the forums.<br /></strong></p><p><strong>HAPPY NEW YEAR!<br /></strong></p><p style="MARGIN-LEFT: 36pt"><br /> </p><p style="MARGIN-LEFT: 36pt"><strong><br /></strong> </p></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-84215693560824427502008-11-03T21:08:00.002-06:002008-11-03T21:11:20.416-06:00WebAii Silverlight Extension CTP2 Released!<p>We are happy to announce the release of CTP2. You can download it from our downloads pages <a href="http://community.artoftest.com/files/">http://community.artoftest.com/files/</a> .<br /><br />This CTP is tested against Microsoft's official Silverlight 2 Release. CTP2 fixes all issues reported in CTP1. The dowload entry description contains all the major fixes. I will list them again in this post:<br /><br />1. <u>Connecting to Silverlight Apps</u>. If you were using CTP1, you might have noticed that our extension stopped being able to connect to Silverlight apps once Microsoft released RC0. In RC0 Microsoft disabled one feature that we were relying on to plug into the app (Security reasons). Instead of trying to hack around this, we simple leverged our built-in http proxy (a new WebAii 2.0 feature that will be fully exposed using an OM but currently marked internal in this release) to connect to the app. This made our execution much cleaner and faster. No more reloading of the app or anything. It should be seamless. The only limitation we have right now is HTTPS.<br /><br /><strong>>> NOTE: In CTP2 there is a new Setting.EnableSilverlight flag that needs to be set to enable WebAii to connect to Silverlight applications. By default this setting is not on. Setting this flag will activate the built-in proxy that we use to detect Silverlight applications.<br /></strong><br />2. <u>Silverlight UI Controls</u>. All our Silverlight controls that we ship in the box are now extensible. We removed the sealing of these classes. So anyone that wanted to extend them to build their own classes can do so.<br /><br />3. <u>Silverlight Test Template</u>. As part of the installation, you now have a Silverlight test template that you can use to get you started. The template has one sample test that automates a simple silverlight app.<br /><br />4. Bug Fixes/Additional Features worth noting: </p><p></p><ol><li>Finding child elements bug: <a href="http://community.artoftest.com/forums/p/453/1748.aspx#1748">http://community.artoftest.com/forums/p/453/1748.aspx#1748</a> </li><li>Application duplication: <a href="http://community.artoftest.com/forums/p/450/1643.aspx#1643">http://community.artoftest.com/forums/p/450/1643.aspx#1643</a> </li><li>Ability to move the mouse in a certain path: <a href="http://community.artoftest.com/forums/p/442/1598.aspx#1598">http://community.artoftest.com/forums/p/442/1598.aspx#1598</a><br /></li></ol><p>This is going to be the last standalone CTP2 for silverlight and the silverlight automation functionality you see in thie extension will be rolled into WebAii 2.0 next many other cool new features. Keep an eye on our blogs in the next few weeks where we will preview the roadmap for WebAii 2.0.<br /><br />Have fun automating.....<br /></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-81222531746166893412008-08-08T14:01:00.006-06:002008-08-19T09:14:36.447-06:00Automated Testing of Silverlight Applications – PART II – WebAii’s Support Preview<span xmlns=''><p>It's been over a year now since we <a href='http://artoftestinc.blogspot.com/2007/05/automated-testing-of-silverlight.html'>outlined</a> our vision for supporting Silverlight test automation. We have looked into Silverlight automation from every angle and considered all approaches including <a href='http://msdn.microsoft.com/en-us/library/ms747327.aspx'>UIAutomation</a>. Our automation support for Silverlight doesn't really rely on UIAutomation but at the same time doesn't exclude it 100%. We will probably dedicate a full blog post about this topic and discuss how we are integrating UIAutomation and our reasoning for not relying on it 100%. But for now, let's just dig into our first preview release that will include Silverlight Test Automation support. Officially we are calling this release <strong>: WebAii's Silverlight Extension (CTP1)</strong> and the <span style='text-decoration:underline'>release will be available early next week</span>. We are hoping this will be the first extension in a series of WebAii extensions that customers can pick and choose from that cater to specialized technology areas. (i.e. extensions for WebServices, WCF, Data …etc). <br /></p><p><span style='font-size:14pt; text-decoration:underline'><strong>Getting started with Silverlight Automation in WebAii<br /></strong></span></p><p>To get started, let's first use a simple application and demo some basic automation scenarios like button click and set text. We will then expand into more advanced topics and scenarios. <br /></p><p>Let's take the following simple Silverlight application that contains a button and a text box. When you click the button, it simply displays hello in a textblock on the canvas. The application looks like this:<br /></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe1.png" mce_src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe1.png"> </P><br /><p>To automate the application above to set the text, click the button and then verify the hello text in WebAii, we can simply write the following code using WebAii's Silverlight Extension (which currently resides under <strong>ArtOfTest.WebAii.Silverlight</strong>). Eventually we will be moving this into its own dll/extension:<br /></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe2.png" mce_src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe2.png"> </P><br /><p>Let's take a closer look at the code above line by line:<br /></p><p><span style='text-decoration:underline'>Line 319-323<br /></span></p><p>This is basic WebAii code that launches the browser and navigates to a specific page.<br /></p><p><span style='text-decoration:underline'>Line 326<br /></span></p><p>As soon as you include the Silverlight extension namespace in your test, (<strong>ArtOfTest.WebAii.Silverlight</strong>), the '<span style='text-decoration:underline'>SilverlightApps()</span>' extension method is added to the ActiveBrowser. The extension method offers you a list of all Silverlight applications found on that page. The extension method returns a list that has two accessors. An <strong>index</strong> accessor that takes an int (as shown above) and an string accessor that takes a <strong>hostid </strong>[The id of the html element that contains the <object> tag for the plug-in]. You can pick and choose what works for you. In this sample, given that we only have one Silverlight plugin on the page, we simply accessed the first and only one.<br /></p><p><span style='text-decoration:underline'>Line 329<br /></span></p><p>As soon as you have an instance of a <strong>SilverlightApp, </strong>you now have full access to the application including the entire <strong>VisualTree</strong>. The app offers a short-cut method '<strong>FindName</strong>', that can be used to search the application using an element name. In the above sample, given that the <strong>TextBox</strong> has a name associated with it, we can use <strong>FindName</strong> to locate it. The <strong>SilverlightApp </strong>object offers two versions of '<strong>FindName</strong>': The first is a generic method that can return a strongly-typed object of the element (As shown above , i.e. a Button, a TextBox, a Grid…etc). The second is simpler and returns the base <strong>FrameworkElement</strong> object. We will discuss the strongly-typed object model offered in WebAii Silverlight Extension later in this post.<br /></p><p>To go back to the line above, we are simply accessing the TextBox that has a name '<strong>myName</strong>' and then setting its <strong>Text</strong> property to "<strong>ArtOfTest</strong>". Note that given we are accessing a property on the element, this is analogous to SetText on a DOM element in web automation. You are not really typing the text in the textbox but rather setting the <strong>Text</strong> property inside the application to that text. Our extension enables you to access and set properties directly against any <strong>FrameworkElement</strong>. If we wanted to simulate real typing of the text we would have written code like this:<br /></p><p><span style='font-family:Consolas; font-size:10pt'>app.FindName<<span style='color:#2b91af'>TextBox</span>>(<span style='color:#a31515'>"myName"</span>).User.TypeText(<span style='color:#a31515'>"ArtOfTest"</span>, 50);</span><br /> </p><p><span style='text-decoration:underline'>Line 332<strong><br /> </strong></span></p><p>Same as above in terms of accessing the button. The difference here is that we are using the '<strong>User</strong>' object to click the button. The <strong>User</strong> object is presented off all elements that inherit from <strong>FrameworkElement </strong>and offers real user interactions with Silverlight elements. So a Click off 'User' will actually move the mouse over that button an click it. That is exactly what this line does.<br /></p><p><span style='text-decoration:underline'>Line 335<br /></span></p><p>Now that the button is clicked, we need to verify that the message is correct. The difference here is that we can't really use <strong>FindName </strong>to locate the <strong>TextBlock</strong> because the <strong>TextBlock</strong> doesn't really have a name. The <strong>SilverlightApp</strong> object offers extensive search support within the <strong>VisualTree</strong> beyond <strong>FindName()</strong> by utilizing similar approach to the Find object off the ActiveBrowser (that is used for HTML DOM searches) but adapted to specific <strong>XAML </strong>search scenarios. <br /></p><p>In our code above, we are searching for a TextBlock (All Find.xxText() routines return TextBlocks) that partially contains '<strong>Hello</strong>', hence '<strong>p:Hello</strong>' (Similar to Find.ByContent in HTML search). Once we find the <strong>TextBlock,</strong> we then verify that the <strong>Text </strong>of that label is actually '<strong>Hello ArtOfTest</strong>' using the <strong>Assert.IsTrue</strong>.<br /></p><p>Now that we understand this sample, let's dig into some of the key objects available in WebAii's Silverlight Extension.<br /></p><p><span style='font-size:14pt; text-decoration:underline'><strong>The SilverlightApp object<br /></strong></span></p><p>The SilverlightApp object is the main object you interact with when automating a silverlight plugin and is the entry point into the silverlight plugin. Below are some of the key properties/methods offered by the <strong>SilverlightApp </strong>object<strong>:<br /></strong></p><div><table border='0' style='border-collapse:collapse'><colgroup><col style='width:257px'/><col style='width:389px'/></colgroup><tbody valign='top'><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: solid black 0.5pt; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border335-right: solid black 0.5pt'><p><strong>SilverlightApp.Bounds</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: solid black 0.5pt; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Returns a <strong>Rectangle</strong> object that is the actual screen coordinates of this Silverlight-plugin.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>SilverlightApp.Content</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Exposes the properties found on <a href='http://msdn.microsoft.com/en-us/library/bb412394.aspx'>plugin.content</a>. (i.e. ActualHeight/ActualWidth/FullScreen)<br /></p><p><br /> </p><p><span style='color:red'>Note: All properties are currently read-only.</span></p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>SilverlightApp.Settings</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Exposes the properties found on <a href='http://msdn.microsoft.com/en-us/library/bb412394.aspx'>plugin.settings</a>. (i.e. Background/EnableHtmlAccess/EnableFramerateCounter…etc)<br /></p><p><br /> </p><p><span style='color:red'> Note: All properties are currently read-only.</span></p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>SilverlightApp.VisualTree</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>The entire VisualTree of this application. The VisualTree can be navigated up and down and the root element can be accessed using <strong>VisualTree.Root</strong>. The elements accessed from the VisualTree are <strong>FrameworkElement</strong> objects.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>SilverlightApp.Plugin</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Returns an <strong>HtmlControl</strong> object that represents the actual HTML object tag of the plugin.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>SilverlightApp.Host</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Returns an <strong>HtmlControl </strong>object that represents the actual html tag that the plugin object tag is contained in. Typically this is a Div tag if you are using Visual Studio's Silverlight designer.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>SilverlightApp.Find</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Exposes a Find object used to search the VisualTree for FrameworkElements. This property is a shortcut to the VisualTree.Find object.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>SilverlightApp.FindName/FindName<T></strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>A shortcut to the Find.ByName & Find.ByName<> methods used to find an element using its xaml set name.</p></td></tr></tbody></table></div><p><br /> </p><p><span style='font-size:14pt; text-decoration:underline'><strong>The VisualTree<br /></strong></span></p><p>The VisualTree object exposed by the SilverlightApp is a hierarchal representation of the actual <a href='http://msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper(VS.95).aspx'>VisualTree</a> of the Silverlight application at a specific point in time. If your Silverlight application changes, you can always refresh this tree by calling <strong>VisualTree.Refresh()</strong>. The VisualTree also exposes the VisualTree.Root property which is a <strong>FrameworkElement</strong> that represents the root element of the VisualTree of the app.<br /></p><p><strong>Note</strong>: To help eliminate any synchronization issues between the <strong>VisualTree</strong> available to the test client and the actual app running in the browser, every time the <strong>Find</strong> object attempts to find an element in the tree, it will always refresh before starting the search to ensure that the tree is up-to-date with the application.<br /></p><p><span style='font-size:14pt; text-decoration:underline'><strong>Locating elements<br /></strong></span></p><p>For complex applications, locating elements is probably going to be one of the more time consuming areas where testers need to spend time understanding how to reliably find an element. Real Silverlight applications that we studied that rely heavily on control templates and databinding produce quite complex visual trees that contain elements that are not easily searchable by <strong>FindName() </strong>given the different <a href='http://msdn.microsoft.com/en-us/library/cc189026(VS.95).aspx'>namescopes</a> created and the duplication of names within these templates. For example, check out the following application built by Telerik (<a href='http://www.telerik.com/demos/silverlight'>http://www.telerik.com/demos/silverlight</a> ) , the VisualTree for this application is quite <a target='_blank' href='http://www.artoftest.com/blogimages/txml.xml'>complex</a>.<br /></p><p>The <strong>SilverlightApp.Find</strong> (Same object as <strong>VisualTree.Find</strong>) offers a rich set of search methods that enable you to not only find elements using their names but also by their text or type. Combined with type filtering, LINQ, FrameworkElement navigation (discussed below) and the Find.Allxxx routines, you get a pretty rich set of routines that enables you to find any framework element in the tree. <span style='text-decoration:underline'>That being said, this area is probably the area where we would really like lots of feedback in terms of additional search routines customers would like to see and scenarios that we need to support better or make easier. </span>Here is a quick listing of the search routines available in this release:<br /></p><div><table border='0' style='border-collapse:collapse'><colgroup><col style='width:319px'/><col style='width:319px'/></colgroup><tbody valign='top'><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: solid black 0.5pt; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>Find.AllByName()/Find.AllByName<T></strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: solid black 0.5pt; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Find all elements that have a specific name. Allows filtering on a specific control type.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>Find.AllByText()</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Find all <strong>TextBlocks</strong> that contain a specific text. Use p:<em>text </em>to search for partial text</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>Find.AllByType()/Find.AllByType<T></strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Find all elements of certain type. i.e Button, Grid..etc. Filtering on type is inherit here.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>Find.ByName()/Find.ByName<T></strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Same as <strong>FindName</strong>(). Search using a specific name.</p></td></tr><tr><td style='background: #f2f2f2; padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 0.5pt; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p><strong>Find.ByText()</strong></p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 0.5pt; border-right: solid black 0.5pt'><p>Returns the first <strong>TextBlock</strong> that matches the text provided.</p></td></tr></tbody></table></div><p><br /> </p><p><span style='text-decoration:underline'><strong>Note: </strong></span>All the generic find methods also have a none generic companion for cases where you are working with control types that are not available in the <strong>ArtOfTest.WebAii.Silverlight.UI</strong> namespace.<br /></p><p><span style='text-decoration:underline'><strong>Find.Strategy<br /></strong></span></p><p>Unlike the ActiveBrowser.Find, the SilverlightApp.Find allows you to configure the FindStrategy that you wish to use when locating elements. By default we use the <span style='font-family:Consolas; font-size:10pt'><strong>AlwaysWaitForElementsVisible </strong></span>which provides the most reliable approach to locating elements and eliminates any timing issues between the application and the test. So by default when we locate an element we will try to find it, if we don't find it, we keep trying until the element is available up to <span style='font-family:Consolas; font-size:10pt'><strong>Find.WaitOnElementsTimeout. </strong></span>You can change this strategy at any point in time. Your options are:<br /></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe3.png" mce_src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe3.png"> </P><br /><p><span style='font-size:14pt; text-decoration:underline'><strong>FrameworkElement object<br /></strong></span></p><p>The <strong>FrameworkElement</strong> available in WebAii's Silverlight Extension is analogous to the <a href='http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement(VS.95).aspx'><strong>FrameworkElement</strong></a> in Silverlight and is the base object that all visual elements and controls inherit from in the <strong>ArtOfTest.WebAii.Silverlight.UI</strong> namespace (discussed later below). For customers interested in our extensibility model, WebAii's Silverlight Extension does not expose a <a href='http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.95).aspx'><strong>UIElement</strong></a> and therefore, our <strong>FrameworkElement</strong> can be viewed as the combination of Silverlight's <strong>UIElement + FrameworkElement.<br /></strong></p><p>The <strong>FrameworkElement</strong> and all objects that inherit from it get the following infrastructure methods and services:<br /></p><ol><li><div><strong><span style='font-size:12pt; text-decoration:underline'>VisualTree navigation</span>: </strong>All FrameworkElements enable you to navigate the visual tree up or down. The object exposes methods and properties like <strong>Parent, Children, NextSibling, PreviousSibling, AnySibling<T>. </strong>The navigation also supports control sensitive navigation. For example, if you would like to find the parent 'Grid' that a certain text is contained in you do the following:<strong><br /> </strong></div><p><br /> </p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:#2b91af'>Grid</span> containerGrid = app.Find.ByText(<span style='color:#a31515'>"SomeText"</span>).Parent<<span style='color:#2b91af'>Grid</span>>();<br /></span></p><p>OR<br /></p><p>If you are working with a custom control that doesn't have a strongly-typed object under <strong>ArtOfTest.WebAii.Silverlight.UI, </strong>the navigation methods all offer a non-generic version that can be used to search for a certain type. For example, let's say you are trying to find the custom control "Bar" that contains some text, then you can do the following:<br /></p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:#2b91af'>FrameworkElement</span> barElement = app.Find.ByText(<span style='color:#a31515'>"SomeText"</span>).Parent(<span style='color:#a31515'>"Bar"</span>);<br /></span></p><p><strong>Parent, NextSibling, PreviousSibling & AnySibling</strong> all offer a non-generic versions in addition to the generic one.<br /></p></li><li><div><span style='font-size:12pt'><strong><span style='text-decoration:underline'>User Interaction object:</span><br /> </strong></span>The FrameworkElement object exposes a user interaction object. The object is exposed as a property named '<strong>User</strong>'. <strong>User</strong> then exposes all the real automation methods like moving the mouse to click an element, type a text, mouseenter, mouseleave…etc. Here is a listing of all the methods exposed in this preview release</div><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe4.png" mce_src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe4.png"><SPAN style="TEXT-DECORATION: underline"><STRONG> </STRONG></SPAN></P><br /><p><span style='text-decoration:underline'><strong>Note</strong>: One of the reasons why we moved these methods into their own object under 'User.xxx' is to help users differentiate between automation that is done by setting/getting properties vs real automation that does use the mouse or keyboard to invoke an action. That is one feedback we got on our design for the HtmlControls suite where customers didn't know which method actually used the real mouse vs direct DOM interaction.<br /></span></p><p><br /> </p></li><li><div><span style='font-size:12pt; text-decoration:underline'><strong>Element coordinates: </strong></span>All FrameworkElements offer the ability to get both the relative coordinates of the element within the silverlight application and the actual coordinates in screen coordinates. The two methods are <span style='font-size:12pt'><strong>GetRectangle()</strong><br /> </span>and <span style='font-size:12pt'><strong>GetScreenRectangle()</strong>. </span><span style='text-decoration:underline'><strong><br /> </strong></span></div><p><br /> </p><p><span style='text-decoration:underline'><strong>Note: </strong>Given that WPF/Silverlight applications allow for rich transforms for visual elements (i.e rotate, zoom….etc) and some elements like ellipses don't really conform to a rectangle per-say, our coordinate calculations will always return the largest rectangle that contains the actual element with its center right at the center of the element. For example, a GetRectangle on an ellipse will return this:<br /></span></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe5.png" mce_src="http://www.artoftest.com/BlogImages/080808_1951_AutomatedTe5.png"><STRONG> </STRONG></P><br /><p>[Note the highlighting above is using the <strong>FrameworkElement.Highlight()</strong> method]<br /></p><p><br /> </p></li><li><div><strong><span style='font-size:12pt; text-decoration:underline'>Scoped search within an element visual children</span><span style='text-decoration:underline'>.</span><br /> </strong>Every single <strong>FrameworkElement</strong> also has a <strong>Find</strong> object associated with it that searches only this element's child visual elements. This object will prove very useful when getting into more complex application automation scenarios. <br /></div><p><br /> </p><p><span style='text-decoration:underline'><strong>Example: </strong></span>Find the first StackPanel in the application that contains a specific text:<br /></p><p><span style='font-family:Consolas; font-size:10pt'><span style='color:#2b91af'>StackPanel</span> panel = app.Find.AllByType<<span style='color:#2b91af'>StackPanel</span>>().Where(sp => sp.Find.AllByText(<span style='color:#a31515'>"SomeText"</span>).Count > 0).First();<br /></span></p></li><li><div><strong><span style='font-size:12pt; text-decoration:underline'>Visual Synchronization</span><span style='text-decoration:underline'>:</span><br /> </strong>Silverlight applications and the richness they offer to developers in terms of scenario building, accentuate<span style='color:#333333; font-family:Lucida Sans Unicode; font-size:9pt'><em><br /> </em></span>the need for rich synchronization support within an automated testing framework. Any testing framework that wants to be considered as a serious and dependable test automation solution within the enterprise for Silverlight needs to offer rich support for synchronization between the application under test and the test being executed. For that reason, all <strong>FrameworkElement </strong>objects also expose a <strong>Wait </strong>object that is used to syncronize that element against specific check points. Currently our support is limited to <strong>Visible</strong>, <strong>VisibleNot</strong>. Future support is planned for event waiting, animation synchronization and much more. <span style='text-decoration:underline'>Again feedback on this feature from customers would be of great help.<strong><br /> </strong></span></div><p><br /> </p></li><li><div><span style='text-decoration:underline'><strong><span style='font-size:12pt'>Xml Representation:</span><br /> </strong></span>Every <strong>FrameworkElement</strong> has a <strong>ToXml() </strong>method on it that returns the VisualTree of that element as an XML formatted string. This is very useful when trying to understand the visual tree at a certain state. [Hint: You can get the entire visual tree of an app by calling <strong>app.VisualTree.Root.ToXml()</strong>]<span style='text-decoration:underline'><strong><br /> </strong></span></div><p><br /> </p></li></ol><p><span style='font-size:14pt; text-decoration:underline'><strong>ArtOfTest.WebAii.Silverlight.UI namespace<br /></strong></span></p><p>The UI namespace includes all the strongly-typed controls like <strong>Button</strong>, <strong>TextBox</strong>…etc including their properties/methods and enums. The namespace also includes types used by these properties like <strong>Brush</strong>, <strong>SolidBrush</strong>…etc. In this preview we are only claiming support for simple primitive property setting/getting and enums. Later on, we will be supporting the ability to retrieve and set complex types like setting a <strong>SolidBrush</strong> on a <strong>Background</strong> or retrieving a specific <strong>Transform</strong> properties from an object. Although setting/getting these types of properties might seem outside the scope of test automation but these properties are going to be much needed to help with test case synchronization with that application and will make it much easier to craft verification points within an automated test. [i.e. Enabling scenarios where a test will need to wait until a specific storyboard has finished a specific animation or waiting/verifying that a specific trigger has been triggered or a certain DependencyProperty has changed…etc.]<br /></p><p><span style='font-size:14pt; text-decoration:underline'><strong>Current limitations with this release:<br /></strong></span></p><ol><li>On Vista, if you are automating an external website, then make sure to add the url to your Trusted WebSites list in IE.<span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li>Our automation targets Silverlight 2.0 (Beta2) and doesn't support any previous versions. <span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li>The automation supports only .XAP deployment method.<span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li>EnableHtmlAccess needs to be set to 'True' on your application.<span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li><strong>ArtOfTest.WebAii.Silverlight.UI</strong> does not contain controls in the <strong>System.Windows.Controls.Extended</strong> namespace. This will be available in future releases.<span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li>There are known issues with Silverlight applications that attempt to perform webservice calls within the application. This issue will be resolved in future versions.<span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li>This release does not support side-by-side installation with any previous versions of WebAii or Design Canvas. <span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li>The application needs to be running off http:// not C:\...<span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li><li>VS Debugging. Currently the experience of inspecting objects while broken in the debugger is a bit rough. You get lots of timeouts. This will be resolve in future versions.<span style='color:red; font-size:18pt; text-decoration:underline'><strong><br /> </strong></span></li></ol><p><span style='font-size:14pt; text-decoration:underline'><strong>What's next?<br /></strong></span></p><p>This is our first CTP preview for Silverlight automation. One of the goals of this release is to gather feedback from customers on our design and get specific feature requests that customers want to see implemented. That being said, we still have a set of features that will be implemented in future previews and beta releases of this extension to WebAii, specifically:<br /></p><ol><li>More synchronization support within the Wait object for animation and events.<br /></li><li>Ability to trigger specific events on an element.<br /></li><li>Extended support for setting/getting complex types.<br /></li><li>Rich support for interacting with custom Scriptable objects.<br /></li><li>Debugging and Tracing support.<br /></li></ol><p>That's pretty much it for now. We are very excited about this release and look forward to your feedback. Feel free to send feedback directly to us: <a href='http://www.artoftest.com/contact.aspx'>http://www.artoftest.com/contact.aspx</a><br /><br /><P>You can download CTP1 build from <a href="http://community.artoftest.com/files/folders/rc/entry1514.aspx">here.</a></p><br /> </p><p>Enjoy,<br /></p><p>ArtOfTest Team</p></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-59042640699558121302008-07-29T21:58:00.004-06:002008-07-29T22:09:34.096-06:00Browser-agnostic color verification using WebAii & Automation Design Canvas<span xmlns=''><p>Color style verification in WebAii and Automation Design Canvas is one of those nice-to-have features that saves testers some cycles especially when trying to make an automated test run cross browser (specifically in IE and Firefox). If the application you are testing uses style sheets - which most of today's rich web applications do – there is a good chance you might have to verify a style on a specific tag or that a specific tag has changed color based on its cascaded style sheet. WebAii and Automation Design Canvas offer specific functionality to help address the color formatting for computed styles.<br /></p><p><span style='text-decoration:underline'>Let's first take at look at why computed styles for color verification causes problems for testers:<br /></span></p><p>The issue is related to how IE and Firefox return colors when it comes to computed styles:<br /></p><p>In IE, computed styles accessed using (element.currentStyle) return color (i.e. backgroundColor, foreColor) using the following format : <strong><span style='color:red'>#xxyyzz</span><br /> </strong></p><p>FireFox on the other hand always returns the color in the following format: <span style='color:red'><strong>rgb(x,y,x)</strong></span><br /> </p><p>Typically , when writing automated tests for such a scenario (that you wish to run on both IE and Firefox), you end-up having to fork your code based on each browser type and do the validation using the specified format. <br /></p><p>Well not anymore…., let's take a look at what WebAii 1.1 offers in terms of support in this scenario:<br /></p><p><span style='font-size:14pt'><strong><span style='text-decoration:underline'>WebAii 1.1 Framework</span><br /> </strong></span></p><p>There are several built-in features in WebAii framework that address this scenario:<br /></p><ol><li><div><a href='http://www.artoftest.com/Resources/WebAii/APIReference/T_ArtOfTest_WebAii_Controls_HtmlControls_HtmlStyle.htm'><span style='font-size:12pt'><strong>HtmlStyle</strong></span></a><span style='font-size:12pt'><strong> object:<br /></strong></span></div><p>If you notice, our HtmlControl.<a href='http://www.artoftest.com/Resources/WebAii/APIReference/M_ArtOfTest_WebAii_Controls_HtmlControls_HtmlControl_GetComputedStyle_1_72eac341.htm'>GetComputedStyle()</a> returns an HtmlStyle object, not a string value. The GetComputedStyle() function retrieves the style from the browser DOM and places it in the HtmlStyle object for further processing. If you wish to get the value immediately, you always call the HtmlControl.<a href='http://www.artoftest.com/Resources/WebAii/APIReference/M_ArtOfTest_WebAii_Controls_HtmlControls_HtmlControl_GetComputedStyleValue_1_72eac341.htm'>GetComputedStyleValue()</a> which gets the actual style value as a string.<br /></p><p>The HtmlStyle object offers the following facilities to make style validation simple and more straigh-forward for colors:<br /></p></li></ol><ul style='margin-left: 72pt'><li>HtmlStyle.<a href='http://www.artoftest.com/Resources/WebAii/APIReference/M_ArtOfTest_WebAii_Controls_HtmlControls_HtmlStyle_IsColor.htm'>IsColor</a>(): This call checks to see if the style returned is a color or not. If for any reason you have code that generically processes styles, you can use this to distinguish between color styles and other styles<br /></li><li>HtmlStyle.<a href='http://www.artoftest.com/Resources/WebAii/APIReference/M_ArtOfTest_WebAii_Controls_HtmlControls_HtmlStyle_ToColor.htm'>ToColor()</a>: This method is very powerful and is where we abstract out the formatting between IE and Firefox. This method simple parses the value out for you and returns a System.Drawing.Color object that you can then use to validate against another System.Drawing.Color you might want to check against.<br /></li></ul><p>For example:<br /></p><p style='margin-left: 36pt'>The following line of code can be used to validate that the background computed style color for a div is red. This line of code works for both IE and Firefox:<br /></p><p style='margin-left: 36pt'><span style='font-family:Consolas; font-size:10pt'><strong><span style='color:#2b91af'>Assert</span>.AreEqual<<span style='color:#2b91af'>Color</span>>(<span style='color:#2b91af'>Color</span>.Red, myDiv.GetComputedStyle(<span style='color:#a31515'>"backgroundColor"</span>).ToColor());<br /></strong></span></p><ol><li><div><span style='font-size:12pt'><strong>AssertStyle() extensions.<br /></strong></span></div><p>In WebAii 1.1, we introduced <a href='http://artoftestinc.blogspot.com/2008/02/webaii-11-and-verification-patterns.html'>verification</a> extensions to help facilitate HTML specific validation. The AssertStyle() class takes advantage of the above functionality to abstract out the browser formatting specifics and make color verification completely seamless. <br /> </p><p>For example:<br /> </p><p>The following validation will assert that the backgroundColor style on the Div tag is red regardless of the browser used.<br /> </p><p><span style='font-family:Consolas; font-size:10pt'><strong>myDiv.AssertStyle().ColorAndBackground(<span style='color:#2b91af'>HtmlStyleColorAndBackground</span>.BackgroundColor, <span style='color:#a31515'>"Red"</span>);<br /></strong></span></p></li></ol><p><span style='font-size:14pt; text-decoration:underline'><strong>Automation Design Canvas 1.0<br /></strong></span></p><p>In <a href='http://www.artoftest.com/webaiidcproduct.aspx'>Automation Design Canvas</a> 1.0 (ADC), we consume the above functionality inside the style <a href='http://www.artoftest.com/ViewImage.aspx?img=sentence_full.png'>verification sentences</a> and we make it completely straight forward to craft and execute color verification. In ADC, we internally persist colors in #XXYYXX format and always covert (named/rgb/#xxyyzz) colors to the #XXYYZZ format. Using that format comparisons are done. Here is how a color style verification looks like in ADC 1.0:<br /></p><p>For example, if you invoke verification to validate the forecolor of the following text on msn.com home page:<br /></p><br /><IMG alt="" src="http://www.artoftest.com/BlogImages/073008_0318_Browseragno1.png" mce_src="http://www.artoftest.com/BlogImages/073008_0318_Browseragno1.png"><br /><p>The verification sentence builder will automatically resolve the color to its #XXYYZZ format as shown below.<br /></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/073008_0318_Browseragno2.png" mce_src="http://www.artoftest.com/BlogImages/073008_0318_Browseragno2.png"><br /></p><br /><p>Definietly a craft and forget color validation. <span style='font-family:Wingdings'>J</span>.<br /></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-16476148622885645702008-07-22T13:30:00.003-06:002008-07-22T20:06:32.537-06:00Automation Design Canvas 1.0 : Test Failure Resolution<span xmlns=""><p>One of the key features that we are proud of in Automation Design Canvas 1.0, is the designer's ability to help testers maintain and fix their automated tests. Automated testing is not only about how fast you can record a test but also how fast you can analyze and resolve a test failure. Some of the key features included in Automation Design Canvas 1.0 are:<br /></p><ol><li><strong>Visual State Capturing:</strong> As you record each step, the designer captures the browser state at that point in time with the target element highlighted on the surface. Each visual step is then added to the story board so that you can visually go back to it. Each visual step is also tied to the actual step, so as you re-order your steps and move them around or delete them, your visual story board of your test is always up to date with your latest changes. The goal of this feature is to help you understand where elements were at the time of recording and what the entire page looks like at that moment in time. In some cases, these visual captures can help you pin-point a failure by simply looking at the captured images.<br /></li><li><strong>DOM State Capturing: </strong>One thing we realized too is that capturing the visual state is not enough. In many cases, the failures are due to issues like ID changes or attribute value changes on HTML elements and such failures rarely exhibit any visual change. You actually need the DOM state at that moment in time to help you understand what changed in that DOM.<br /></li><li><strong>DOM Tree Diff View: </strong>When loading a failure in the Automation Design Canvas, the DOM Tree tool window enables a "DOM Diff" view that you can be use to help understand the differences between Recorded & Executed DOMs. Such a side-by-side view is an enormous help in allowing you to inspect property or DOM structure changes between when the step was recorded vs its execution.<br /></li><li><strong>DOM Element Index View:</strong> Each element in the DOM Tree is prefixed with its TagIndex. Combined with the Diff View discussed about, this gives you a fast path to detected and match two DOM nodes between the recorded and executed DOM trees.<br /></li><li><strong>Live Validation:</strong> For both Element Identification & Verification Rules. As you are investigating your failures, you can easily edit the failing rule for identification or verification and validate it against the executed DOM.<br /></li></ol><p><br /> </p><p>To help us demonstrate these features, lets take a simple example of a common failure for web automation: <span style="TEXT-DECORATION: underline">Element Id Changes</span>. Let's start by taking this HTML Page:<br /></p><br /><p><img alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD1.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD1.png" /> </p><br /><p>As you can see, the input button has a "btn1" id associated with it. Let's load this page in Automation Design Canvas 1.0 and record the button click. The Automation Design Canvas will determine that the best method to identify this element on the page is using its id (btn1) given that the ID is currenly set on the page and is unique. For more information about how Automation Design Canvas builds identifications for elements including how to customize them, check out our help topic <a href="http://help.artoftest.com/AppendixC/AppendixC.htm">here</a>.<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD2.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD2.png"> </P><br /><p>Here is what the FindParam editor looks like:<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD3.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD3.png"> </P><p>If you run the test, obviously everything should pass…<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD4.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD4.png"> </P><p>Let's now say a few weeks later, the developer of this application decides to change the button's ID from "Btn1" to "Btn2". Let's go ahead and make that change in the page and run the test again:<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD5.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD5.png"> </P><p>Now that we are at this stage, let's see how Automation Design Canvas, can help us resolve this issue. To debug a failure in Automation Design Canvas, we will simply double click on the red x right next to the failing step. In design canvas, you get debug capability at the step level. When clicking on the red x, the Automation Design Canvas will open up the Debug UI for you. Let's take a close look at what that UI looks like and all its pieces:<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD6.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD6.png"> </P><p>If you open up the DOM Explorer at this point, you will notice that it also has a drop-down similar to the one listed above in the "Actions" section:<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD7.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD7.png"> </P><br /><p>The first thing that comes to mind when debugging such a failure is what was the state of the DOM when I recorded my test.<br /></p><p><strong>Why can't my test find the "btn1" id</strong>. [As a tester, you might not be aware that this ID has changed]. Let's switch the Target DOM to "Recorded" and then click on the "Validate" button to see if I can still find the element in the DOM when I recorded it.<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD8.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD8.png"> </P><p>As you can see, the designer was able to find this element against the DOM that was captured at the time of recording. If you actually pull up the DOM Explorer and switch it to "Recorded", you will see that element highlighted in the tree:<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD9.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD9.png"> </P><p>We now atleast know that the FindParam used to identify this element is correct and that the failure must be due to a change in the page, not a problem in how we are identifying it. The next question to answer then, what changed and what is the new value for that change. To help identify that, let's switch the "View" of the "Recorded" dom to "TagName" so that we get a flat list of each tag with its index that looks like this:<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD10.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD10.png"> </P><p>Next we are going to compare this element with the actual "Execution" dom that the test failed again. To do so, let's simply switch the "Displayed DOM" to (both). And switch also the "Execution" "View" to "TagName". The DOM Explorer now displays both recorded and executed DOM side by side:<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD11.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD11.png"> </P><p>Now that we have both DOMs side by side, we can easily navigate the Execution DOM to the INPUT tag with index "1".<br /></p><p>Ah!<br /></p><p>Now we see that this element's id is btn2 not btn1. At this point there are two ways to proceed:<br /></p><ol><li>This is a bug in the product and should be reported.<br /></li><li>This is an acceptable change and we simply need to update our automated test.<br /></li></ol><p>To update our automated test, simply go to the editor UI shown above and change the <strong>btn1</strong> to <strong>btn2. </strong>Once you make that change, you might want to validate it against the execution DOM. Simply select "Execution" in the Target DOM drop down in the editor and click on the "Validate" button. The element should validate correctly and you are good to go at this point.<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD12.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD12.png"> </P><p>Click OK on the debug UI and you should be able to run the test again and it should pass.<br /></p><P><IMG alt="" src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD13.png" mce_src="http://www.artoftest.com/BlogImages/072208_1931_AutomationD13.png"> </P><p><br /> </p><p>Note: As soon as you click OK, the old recorded DOM is discarded for the Execution DOM since this is the DOM that the element has validated successfully against.<br /></p><p><br /> </p><p><br /> </p></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-52337017996718870542008-07-10T12:10:00.004-06:002008-07-10T12:23:50.717-06:00Powerful DOM Search & Validation using WebAii 1.1 & LINQ<span xmlns=""><p>One of the most powerful new (and probably least discovered) features of WebAii 1.1, is its expanded search support using <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx">LINQ</a>. LINQ is Microsoft's latest technology introduced in .NET 3.5 that offers a highly rich and integrated query language inside .NET languages like C# or VB.NET.<br /></p><p>It was relatively easy for us to realize how we can leverage the power of LINQ in WebAii. LINQ's most common use is to enable a rich syntax to query structured information and we thought it would serve a great purpose in also querying the DOM. Given that WebAii offers a 100% managed HTML DOM to the testcase, users can harness the full power of LINQ with their DOM Searches.<br /></p><p>We first started by adding support to do LINQ queries on the Element object. So we introduced the Find.AllElements() that allows you to query the entire DOM tree using a LINQ expression.<br /></p><p>For example:<br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM1.png" mce_src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM1.png"> </P><br /></p><p>Such powerful searchs makes it a lot easier and concise to do rich searches. Although this was a great enhancement to our search routine, we felt there is still more to be done. Most users are actually interested in querying a certain type of Html elements and not all of them. For example, if they want to query all tables, they will need to add another clause in the Where() clause that says element.tag == "table". In addition that, we realized that some of these searches might also want to leverage the strongly-typed <a href="http://www.artoftest.com/Resources/WebAii/Documentation/topicsindex.aspx?topic=htmlcontrols">HtmlControls</a> suite that we have in WebAii. The HtmlControls suite offers a lot of rich context specific information regarding a specific Html tag. (i.e. Table's row count or even cell count). So if you are, for example, trying to use the Find.AllELements() to validate that all tables on a page have alteast 5 columns, you might have to write some pretty complex 'where' clause that defeats the purpose of making search easier using LINQ.<br /></p><p><br /> </p><p>With that in mind, we decided that we definietly need to enable html <strong>filtering</strong> as part of our search API. We also thought that it would be great if we can make such filter based on a strongly typed HtmlControl type. For that purpose, we introduced the Find.AllControls<T>() function. This function is very powerful. I will use the rest of this blog post to go over some samples that use it.<br /></p><p><br /> </p><p>Let's start with something simple. Let's say you simply want to get all the Images on a certain web page. With this API, you can simply do:<br /></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM2.png" mce_src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM2.png"/><br /><br /><p>As you can see the Find.AllControls<T> already has all the information you need to get you the right set of images on the page. You can then loop through those images to do any validation or actions on them.<br /></p><p>Let's take another example that leverages the rich API on our HtmlControl. Let's say you want to validate that all images on the <a href="http://www.gettyimages.com/">www.gettyimages.com</a> home page are actually loaded properly. In WebAii 1.1, we introduced the HtmlImage.IsLoaded() function that queries the DOM to validate that the image has actually loaded in the browser and is not a broken image. You can perform this validation in one line of code like this:<br /></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM3.png" mce_src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM3.png" /></P><br /><br /><p>Very Nice, eh? Let's have some more fun with this API. Given that we are in elections season, let's say we want to go to Google's Elections News website and highlight all links that contain "Obama" with blue and "McCain" with Red. [Sounds like a CNN application to see who is getting more press <span style="font-family:Wingdings;">J</span>]. Here is the code that does this for us using WebAii 1.1:<br /></p><br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM4.png" mce_src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM4.png"><SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: Consolas"> </SPAN></P><br /><br /><p>If you have WebAii running, place the above code in a TestMethod and run it, looks pretty cool.<br /></p><p><br /> </p><p>Ok, last, let's take a bit more complex validation scenario. Let's say we have a testcase that wants to validate that an ASP.NET DataGrid when put in edit mode, changes all the cells in Column 1 from labels to actual TextBox. How can we validate that?<br /></p><p><br /> </p><p>We basically need to validate that:<br /></p><ol><li>All column 1 cells have one TextBox.<br /></li><li>All column1 cells have only that textbox in that cell.<br /></li></ol><p><br /> </p><p>Here is the code using LINQ and Find.AllControls<> that does this for us:<br /><P><IMG alt="" src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM5.png" mce_src="http://www.artoftest.com/BlogImages/071008_1738_PowerfulDOM5.png"> </P><br /></p><p>That's it for now. We would love to hear your feedback about this feature or any other features in WebAii. We are in the process of revamping our online documentation to be more up to date with the WebAii 1.1 release. We are also starting an new effort to start blogging more about WebAii features and our Automation Design Canvas!!<br /></p><p><br /> </p><p>Enjoy </p></span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-5853386399591256812008-06-27T14:04:00.002-06:002008-06-27T14:09:42.769-06:00Automation Design Canvas 1.0 Released!<span xmlns=""><p><span style="font-family:Verdana;font-size:10;color:black;">Greetings!<br /></span></p><p><span style="font-family:Verdana;font-size:10;"><span style="color:black;">ArtOfTest, Inc. is happy to announce the release of </span>Automation Design Canvas 1.0!<span style="color:black;"> Automation Design Canvas is the test automation answer to today's rich web experiences and Ajax applications. It is available as a plug-in right inside Visual Studio Professional or Team Suite.<br /></span></span></p><p><span style="font-family:Verdana;font-size:10;color:black;">Since the release of RC0 we have focused solely on the quality and stability of the product to offer you a solid V1.0! We think we have an award winning product with lots of innovations.<br /></span></p><p><br /></p><p><a href="http://www.artoftest.com/VideoPlayer.aspx?video/QuickStart-CreateTest.swf"><span style="font-family:Verdana;font-size:10;">Watch Quick Demo</span></a><span style="font-family:Verdana;font-size:10;color:black;"><br /></span></p><p><span style="font-family:Verdana;font-size:10;color:black;">Automation Design Canvas enables you to:<br /></span></p><p><span style="font-family:Verdana;font-size:10;color:black;"><strong>Build test automation in minutes vs hours<br /></strong></span></p><p><span style="font-family:Verdana;font-size:10;color:black;">Shave weeks off your release schedules. No code to write or script to craft! Automation Design Canvas is built from the ground up to support rich Web 2.0 applications. It utilizes an advanced designer surface that makes test automation as easy as point and click, allowing for seamless crafting of verifications and syncrhonization for AJAX Pages.</span><span style="font-family:Times New Roman;font-size:12;"><br /></span></p><p><span style="font-family:Verdana;font-size:10;color:black;"><strong>Simple but powerful</strong><br /></span></p><p><span style="font-family:Verdana;font-size:10;"><span style="color:black;">A </span>quick start guide<span style="color:black;"> is all you need to get started building test automation like a pro. The designer is highly customizable to allow advanced users to alter how recording is done. Recorded scripts are also extendible using an optional code behind model that allows developers to fully customize recorded tests whenever needed using WebAii Framework's rich .NET API. Using C# or VB.NET!<br /></span></span></p><p><span style="font-family:Verdana;font-size:10;color:black;"><strong>Built with maintenance in mind</strong><br /></span></p><p><span style="font-family:Verdana;font-size:10;"><span style="color:black;">Test automation needs to be constantly updated as the product being tested or the test environment changes. We have built-in features that give you the ability to rapidly resolve test failures and easily update your tests as well as track product changes through out the life time of the script using a DOM state archiving </span>feature <span style="color:black;">that can offer you DOM diffs.<br /></span></span></p><p><strong><span style="font-family:Verdana;font-size:10;color:black;">Visual Studio Team System Integration </span><span style="font-family:Times New Roman;font-size:12;"><br /></span></strong></p><p><span style="font-family:Verdana;font-size:10;"><span style="color:black;">Design Canvas™ 1.0 is fully </span>integrated<span style="color:black;"> in Visual Studio 2008 Professional & Team Suite. We add one additional test type to what Visual Studio offers. It integrates fully into the life cycle management of tests that VS offers including test case management, test execution, source control, remote execution and reporting using team foundation server. Futhermore, Design Canvas enables you to convert recorded scripts to VS Stress/Load tests.</span></span><br /></p><p><a href="http://www.artoftest.com/trialregistration.aspx"><span style="font-family:Verdana;font-size:10;">Download Trial</span></a><span style="font-family:Verdana;font-size:10;color:black;"><br /></span></p><p><span style="font-family:Verdana;font-size:10;"><span style="color:black;">Full features listing: http://www.artoftest.com/webaiidcproduct.aspx</p><p><span style="font-family:Verdana;font-size:10;"><span style="color:black;">How-To Videos: </span>http://www.artoftest.com/webaiidcproduct.aspx?QS<span style="color:black;"><br /></span></span></p><p><span style="font-family:Verdana;font-size:10;color:black;"><strong>WebAii 1.1 Released!</strong><br /></span></p><p><span style="font-family:Verdana;font-size:10;color:black;">In conjunction with this release, WebAii 1.1 has also been released. Our next version of WebAii will be our 2.0 community preview which will include our Silverlight support that we have been working hard on.<br /></span></p><p><br /></p><p><br /></p><div><table style="BORDER-COLLAPSE: collapse" border="0"><colgroup><col style="WIDTH: 634px"></colgroup><tbody valign="top"><tr><td style="PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px" valign="center"><p><span style="font-family:Verdana;font-size:10;color:black;">ArtOfTest Inc. </span></p></td></tr></tbody></table></div></span><br /><a href="http://www.artoftest.com/webaiidcproduct.aspx?QS" target="_blank"></a><br /><br /></span></span><span xmlns=""><span style="font-family:Verdana;font-size:10;"></span></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1414270613702289559.post-14446578743568100272008-06-02T23:18:00.002-06:002008-06-02T23:25:37.141-06:00Automation Design Canvas 1.0 (RC0) Released!<p mce_keep="true">We are happy to unveil our RC0 of design canvas. RC0 represents the full feature set that we are planning for V1.0 release. RC0 also incorporates tons of feedback from our customers that have downloaded and used our beta. From this point on, we will only be taking bug fixes or major/adoption blocker features. We believe we have a very compelling and complete solution for dynamic web automation in this release. If you downloaded our beta we encourage you to upgrade to RC0. RC0 contains tons of bug fixes and additional features here are some of the major ones:</p><ol><li><b>Dialogs Support</b>: This includes both Html Pop-ups and Win32 Dialogs like alerts, logons or Download dialogs (For both IE/Firefox). We also included a "Generic" dialog handler for custom Win32 dialogs that enable you to define your own dialog titles, content search and how you want it handled.</li><br /><li><b>Visual Studio Integration:</b></li><ol><li><b>MSTest Execution: </b>Execution using MSTest is now supported.</li><li><b>Create TestLists: </b>We had a bug in that space. Now you can create TestLists, save them and execute them.</li></ol><li><b>Data:</b></li><ol><li><b>VS Data Sources: </b>You can now drive your test using one of Visual Studio's supported data source like CSV files, XML Files and any DataBase. Select the test in "Test View", and click on "Data Connection String" in the properties window.</li><li><b>Data Range Constraints: </b>Once your data is bound to a data source (Regardless if it is the built in data grid or a VS external source), you can define an iteration range to execute against. (i.e. 1:4, runs iteration 1 through 4)</li><li><span style="FONT-WEIGHT: bold">Per Iteration Test Results: </span>The Test Explorer now allows you to view test results on a per iteration. Pick an iteration from the drop down and the Test Explorer will be populated with the results for that specific iteration.</li></ol><li><span style="FONT-WEIGHT: bold">XML Based Elements Storage: </span>In Beta our elements storage (i.e Elements.WebAiiElements file) was binary based. Now it is XML based and human readable. </li><li><b>Editing Elements in the Element's Explorer: </b>In Beta that was restricted. Now you can easily update the names of Pages/Frames/TestRegions or specific elements with a Friendly Name that can be used to easily identify the element. These names will be used for code generation when you choose to convert tests to code.</li><li><b>Enhanced Element Search Alogrithm: </b>We now use a more robust element search mechanism that tries to identify elements using single attributes then attribute combinations (included text content) before defaulting to tag index. Our testing showed how our algorithm produces highly reliable test automation. The algorithm is completely customizable using the UserSettings->Element Identification tab.</li><li><b>Page Url Configuration:</b> The Page's Urls captured can now be configured/changed to customize how these pages are identified. For example, you can change a page to be identified by its Title vs its full url. Or maybe you want the page to be identified using the Base Url only or the Relative path + the query string. All of that is easily customizable per page.</li><li><b>SetText:</b></li><ol><li><b>Automatic Password Detection: </b>Automatically detects passwords and masks them.</li><li><b>SimulateRealTyping: </b>You can optionally turn that on for that step and the text will be typed one letter at a time using a settable speed. This is great for automating scenarios like auto-complete text boxes.</li></ol><li><b>WaitOnElements: </b>All steps now have the option to wait on their elements to exist before executing the test. This is turned on by default. With this feature many of your dynamic applications no longer need an explicit Wait for Exists. You can optionally turn that feature off on a per step basis if needed. Each step also has a WaitOnElementsTimout that can be set.</li><li><b>Annotation Step Type: </b>You can now add custom annotation messages within your steps with a configurable display time.</li><li><b>Capture Step Type: </b>Add browser captures or desktop captures as part of your test to visually capture browser or desktop states during your test execution.</li><li><b>Simulate Real Click: </b>You can now optionally use DOM Click (Default) or SimulateRealClick which will move the mouse to that element and click it like a real user.</li><li><b>Browser Constraints: </b>You can now configure specific steps to run only on specific browser types. (i.e. Run this step only on Firefox or IE or both)</li><li><b>Pause: </b>You can optionally pause your execution right before or after a specific step. This will show modal dialog that halts execution and allows you to inspect the state of the test right at that point. This is configurable on each step.</li><li><b>Browser agnostic Style-Color Validation: </b>The designer now uses a browser agnostic style validation mechanism that abstracts out the different color persisting formats between IE and Firefox (i.e. rgb(r,g,b) vs #xxxxxx or named colors)</li><li><b>Tons of bugs fixes specifically the IE Blank Page issue: </b>We fixed the IE extension to work seamlessly now. Keep in mind that if you are running:</li><ol><li><u>Vista </u>: You still need to disable "Protection Mode"</li><li><u>Windows 2003/2008 Server</u>: Uninstall the "Internet Explorer Enhanced Security Configuration"<br /><br /></li></ol></ol><p>We really encourage you to try this updated build. If you have any feedback please don't hesitate to email us at CONTACT _AT_ ARTOFTEST.COM.</p><p><b>Note to WebAii Framework Users:</b> The designers install RC2 of the WebAii Framework. This build includes tons of bug fixes and feature enhancements described <a href="http://community.artoftest.com/blogs/artoftest/archive/2008/05/30/webaii-1-1-rc2-is-now-available.aspx">here</a>: </p><p>Enjoy!</p><p>ArtOfTest Team. </p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1414270613702289559.post-69952334272617771012008-04-16T14:37:00.001-06:002008-04-16T14:39:11.263-06:00WebAii Design Canvas 1.0 Beta - Now supported on all VS Team System SKUs + VS ProWe've had several customers raise the issue of our setup blocking if "VS 2008 Team System - Test Edition" is not installed. Many were using the Developer Edition or even VS Pro.<br /><br />After reviewing all the VS 2008 APIs that Pro and the rest of the VS Team System editions expose, we confirmed that eveything we need for the designer is supported unlike VS 2005. With that in mind, we simply removed all the setup restrictions and the designer now works in full functionality on VS Professional and any of the VS Team System SKUs. The only feature that requires the Test Edition is the "WebAii Test to VS WebTest" conversion since only VS Test Edition has the WebTest type.<br /><br />If you are an existing customer that already registered and downloaded the designer and wish to get the setup without the Test Edition block, simply re-download the designer setup from the link you got from us. It should be updated with a new setup without that block.<br /><br />Enjoy!<br /><br />Please let us know if you have any questions or concerns.<br /><br />ArtOfTest, Inc.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-68297637387406285012008-04-12T00:51:00.000-06:002008-04-12T00:52:48.371-06:00Announcing WebAii Automation Design Canvas 1.0 (Beta)!!We are very happy to announce the availability of our longly awaited designer\recorder. The WebAii Automation Design Canvas is the solution to many of today's tough automation challenges faced by testers and developers trying to automate web 2.0 apps. <br /><br />The designer features have been meticulously designed and built after listening and learning from the industry and our WebAii customers. We've talked to many customers and we've heard their biggest pain points when it comes to web automation. We've also analyzed many webaii hand crafted unit tests to see where the repetitiveness is and what causes the tests to be fragile and prone to failures. We've also look at the most common time consuming tasks for test failure resolution and tried to address these scenarios directly in our designer. We not only wanted the designer to help you build automation faster but also help build better automation.We don't claim we have solved every problem but we believe the designer is a giant leap in advancing the test automation technologies in the market. Say farewell to the dark ages of web automation tools and say hello to the future. We really believe this tool will make software testing easier! Hopefully you will appreciate it as much as we do....<br /><br />More info can be found here: <br /><br />You can register and download the product from here: http://www.artoftest.com/betaregistration.aspx <br />Designer features in details: http://www.artoftest.com/webaiidcproduct.aspx<br />See our quick start videos here: http://www.artoftest.com/WebAiidcProduct.aspx?QS <br /><br />We really want to hear your feedback regarding our beta. If you feel there is a missing feature or an enhancement you would like to see in the designer, please don’t hesitate to contact us. http://www.artoftest.com/contact.aspx <br /><br />Thanks,<br />ArtOfTest TeamUnknownnoreply@blogger.com4tag:blogger.com,1999:blog-1414270613702289559.post-18065735967104420862008-03-24T21:44:00.001-06:002008-03-24T21:47:33.426-06:00Changes/Fixes in V1.1Changes/Fixed in V1.1. Post: http://artoftest.com/CommunitySite/blogs/artoftest/archive/2008/03/24/changes-fixes-in-webaii-1-1.aspxUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-1414270613702289559.post-16251087617518801212008-02-28T22:37:00.005-06:002008-02-29T00:34:26.312-06:00WebAii 1.1 and Verification PatternsGiven that we are approaching V1.1 release, we wanted to give a quick preview of what to expect in V1.1. V1.1 is going to be all about bug fixes and performance enhancements in addition to few small feature sets that we think will make writing automated web tests a bit simpler. Mostly around writing verifications. Oh, V1.1 will also be natively compiled against .NET 3.5 and plugs in VS2008.<br /><br /><strong>Performance: </strong>We have enhancements that span the entire framework. All our threading is now pooled to enhance machine resource utilization. We also have optimized both the Find logic and DomRefresh algorithms.<br /><br /><strong>Verification: </strong>Anyone who has written automated tests knows that an automated test is only as good as its verification. Many current automated test frameworks brag about their ability to automate tests and perform actions but give very little focus to verification, us included :). BUT we have recognized that and in V1.1 we are taking steps to build facilities to enhance verification.<br /><br />Let's take a look at what we have started building in V1.1:<br /><br />Take for example a select drop down element on a page. Let's first assume you want to validate that a certain attribute exists on the element. In WebAii 1.0 you might have code that looks like this:<br /><br /><div style="BORDER-RIGHT: white 2px ridge; PADDING-RIGHT: 10px; BORDER-TOP: white 2px ridge; PADDING-LEFT: 10px; FONT-SIZE: 8pt; PADDING-BOTTOM: 10px; BORDER-LEFT: white 2px ridge; LINE-HEIGHT: 8px; PADDING-TOP: 10px; BORDER-BOTTOM: white 2px ridge; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><br /><br /><br /><span style="color:darkgreen;">// Get my select drop down<br /><br /></span><span style="color:black;">HtmlSelect select </span><span style="color:blue;">= </span><span style="color:black;">Find.ById<HtmlSelect>(</span><span style="color:#808080;">"myDropDown"</span><span style="color:black;">)</span><span style="color:blue;">;<br /><br /><br /><br /></span><span style="color:darkgreen;">// Assert that it contains an attribute 'attr'<br /><br /></span><span style="color:black;">Assert.IsTrue(</span><span style="color:blue;">string</span><span style="color:black;">.IsNullOrEmpty(<br /><br />select.BaseElement.GetAttributeValueOrEmpty(</span><span style="color:#808080;">"attr"</span><span style="color:black;">)),<br /><br /></span><span style="color:blue;">string</span><span style="color:black;">.Format(</span><span style="color:#808080;">"Attribut does '{0}' not exist"</span><span style="color:black;">, </span><span style="color:#808080;">"attr"</span><span style="color:black;">))</span><span style="color:blue;">;<br /><br /><br /><br /></span><br /></div><br /><br />Wouldn't be better if I can do:<br /><div style="BORDER-RIGHT: white 2px ridge; PADDING-RIGHT: 10px; BORDER-TOP: white 2px ridge; PADDING-LEFT: 10px; FONT-SIZE: 8pt; PADDING-BOTTOM: 10px; BORDER-LEFT: white 2px ridge; LINE-HEIGHT: 8px; PADDING-TOP: 10px; BORDER-BOTTOM: white 2px ridge; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><br /><span style="color:darkgreen;">// Assert an attribute exists<br /><br /></span><span style="color:black;">select.AssertAttribute().Exists(</span><span style="color:#808080;">"attr"</span><span style="color:black;">)</span><span style="color:blue;">;<br /><br /></span><br /></div><br />Now, we're talking... Much nicer... It is:<br /><br /><ol><li>Less code to write. </li><li>By just glancing at this piece of code I know that the intent is to validate an attribute hence "AssertAttribute" </li><li>I don't have to worry about putting in the expected/actual since the assert itself is specialized and will automatically include that information in the assert exception.<br /></li></ol><p>In V1.1, we have provided three rich assert classes that are extensions (using C# 3.0 extension methods) to the HtmlControl base class so that all the HtmlControls will get them.</p><br />Here are some examples:<br /><div style="BORDER-RIGHT: white 2px ridge; PADDING-RIGHT: 10px; BORDER-TOP: white 2px ridge; PADDING-LEFT: 10px; FONT-SIZE: 8pt; PADDING-BOTTOM: 10px; BORDER-LEFT: white 2px ridge; LINE-HEIGHT: 10px; PADDING-TOP: 10px; BORDER-BOTTOM: white 2px ridge; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><br /><span style="color:darkgreen;">// Verify a style<br /><br /></span><span style="color:black;">select.AssertStyle().Font(HtmlStyleFont.Family, </span><span style="color:#808080;">"Tahoma"</span><span style="color:black;">, HtmlStyleType.Computed)</span><span style="color:blue;">;<br /><br /><br /><br /></span><span style="color:darkgreen;">// Verify context<br /><br /></span><span style="color:black;">select.AssertContent().TextContent(StringCompareType.NotContain, </span><span style="color:#808080;">"foo"</span><span style="color:black;">)</span><span style="color:blue;">;</span><br /></div><br /><br />There are also specialized Asserts on HtmlSelect and HtmlTable that do specialized table and select validations for example:<br /><br /><div style="BORDER-RIGHT: white 2px ridge; PADDING-RIGHT: 10px; BORDER-TOP: white 2px ridge; PADDING-LEFT: 10px; FONT-SIZE: 8pt; PADDING-BOTTOM: 10px; BORDER-LEFT: white 2px ridge; LINE-HEIGHT: 8px; PADDING-TOP: 10px; BORDER-BOTTOM: white 2px ridge; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><br /><span style="color:darkgreen;">// Select: Validate the selected index<br /><br /></span><span style="color:black;">select.AssertSelect().SelectedIndex(NumberCompareType.GreaterThan, </span><span style="color:maroon;">3</span><span style="color:black;">)</span><span style="color:blue;">;</span><br /></div><br /><br />Or...<br /><br /><div style="BORDER-RIGHT: white 2px ridge; PADDING-RIGHT: 10px; BORDER-TOP: white 2px ridge; PADDING-LEFT: 10px; FONT-SIZE: 8pt; PADDING-BOTTOM: 10px; BORDER-LEFT: white 2px ridge; LINE-HEIGHT: 8px; PADDING-TOP: 10px; BORDER-BOTTOM: white 2px ridge; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #eeeeee"><br /><span style="color:darkgreen;">// Table : Validate column count<br /><br /></span><span style="color:black;">table.AssertTable().ColumnCount(NumberCompareType.LessThanOrEqual, </span><span style="color:maroon;">3</span><span style="color:black;">)</span><span style="color:blue;">;</span><br /></div><br /><br />The other cool aspect of this is that we have built an extensible framework for asserts that you can use to extend some of these existing asserts or build your own asserts for your custom controls. We will dedicate another post to go over that.Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-1414270613702289559.post-47282134623071686502007-11-28T22:57:00.000-06:002007-11-28T23:02:44.868-06:00WebAii 1.0 Released!!<p><strong>We are happy to announce the release of WebAii 1.0. </strong></p><p>The most significant change between RC2 and WebAii 1.0 is the update in documentation and samples. Each sample solution that ships with WebAii now has over 80 unit tests that demonstrate the power of WebAii. If you are a current user of WebAii, we appreciate your feedback through out the beta and RC periods. You helped us provide a solid 1.0!!<br /></p><p>WebAii is currently being adopted by many customers including some of the most noted UI component providers like Infragistics, Inc, Autodesk, Inc as well as well known websites like GettyImages.com, Payscale.com and much more!! We are planning to have some case studies available on our website soon.<br /></p><p><strong><span style="font-size:130%;">So What's Next?</span> </strong></p><ul><li><strong>Automation Designer\Recorder</strong>: This is being polished for a public beta early next year. We are currently conducting a set of preview demos with customers that expressed interest in the designer. If you are currently using WebAii and are interested in a designer\recorder, please do contact us at contact_at_artoftest.com. We can setup a demo for you to give us your direct feedback. We are pretty confident that the feature set we built in the recorder will impress you!</li><li><strong>Silverlight Automation Technology Preview</strong>: We plan to provide a WebAii version to preview the automation support we have built for Silverlight! Our goal is seamless automation across HTML and Silverlight within one test case.</li><li><strong>WebAii VNext</strong>: We are prioritizing the current wish list to start working on for V1.* </li><li><strong>WebSite</strong>: A new website look is coming soon.... </li></ul><p> </p><p>ArtOfTest, Inc.</p>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-1414270613702289559.post-21117183612596969662007-08-14T23:48:00.000-06:002007-08-15T00:18:41.287-06:00New in RC0 - The AnnotatorIn RC0 we also built a cool little feature that was not really planned. Although this feature is not critical to performing automated testing, it can help many automators follow their test execution visually and figure out what their test code is doing step-by-step.<br /><br />The Annotator can easily be enabled by setting the <strong>AnnotateExecution </strong>flag to true. This flag is part of WebAii's Settings object so it can be set both in app.config or programmatically using the Settings object. Once this flag is set, each automation action will be annotated on your browser surface. For example, the following two lines:<br /><!--<br />{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Lucida Console;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20 \cf11 // Set Google's search text to 'ArtOfTest'\par ??\cf0 Find.ByName<\cf10 HtmlInputText\cf0 >(\cf13 "q"\cf0 ).Text = \cf13 "ArtOfTest"\cf0 ;\par ??\par ?? \cf11 // Click Google's search button\par ??\cf0 Find.ByName<\cf10 HtmlInputSubmit\cf0 >(\cf13 "btnG"\cf0 ).Click();\par ??}<br />--><br /><div style="font-family: Lucida Console; font-size: 8pt; color: black; background: white; background:whitesmoke; line-height:7px;"><br /><p style="margin: 0px;"> <span style="color: green;">// Set Google's search text to 'ArtOfTest'</span></p><br /><p style="margin: 0px;"> Find.ByName<<span style="color: teal;">HtmlInputText</span>>(<span style="color: maroon;">"q"</span>).Text = <span style="color: maroon;">"ArtOfTest"</span>;</p><br /><p style="margin: 0px;"> </p><br /><p style="margin: 0px;"> <span style="color: green;">// Click Google's search button</span></p><br /><p style="margin: 0px;"> Find.ByName<<span style="color: teal;">HtmlInputSubmit</span>>(<span style="color: maroon;">"btnG"</span>).Click();</p><br /></div><br />Will annotate as follows:<br /><br /><a href="http://2.bp.blogspot.com/_JZHgcPm-EEM/RsKWLcu4irI/AAAAAAAAABo/6r57dQI8a2E/s1600-h/An1.PNG"><img id="BLOGGER_PHOTO_ID_5098802851572386482" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_JZHgcPm-EEM/RsKWLcu4irI/AAAAAAAAABo/6r57dQI8a2E/s400/An1.PNG" border="0" /></a><br /><br />If you wish to output your own annotations per Html element or simply output messages to the browser you can easily do that using the Actions object. The following lines:<br /><!--<br />{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Lucida Console;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20 \cf11 // Output a custom message by the search textbox.\par ??\cf0 Actions.AnnotateElement(Find.ByName(\cf13 "q"\cf0 ), \cf13 "This is the google search text box"\cf0 );\par ??\par ?? \cf11 // Output a general message to the browser window.\par ??\cf0 Actions.AnnotateMessage(\cf13 "Now running Find.Byxx tests"\cf0 );\par ??}<br />--><br /><div style="font-family: Lucida Console; font-size: 8pt; color: black; background: white; background:whitesmoke; line-height:7px;"><br /><p style="margin: 0px;"> <span style="color: green;">// Output a custom message by the search textbox.</span></p><br /><p style="margin: 0px;"> Actions.AnnotateElement(Find.ByName(<span style="color: maroon;">"q"</span>), <span style="color: maroon;">"This is the google search text box"</span>);</p><br /><p style="margin: 0px;"> </p><br /><p style="margin: 0px;"> <span style="color: green;">// Output a general message to the browser window.</span></p><br /><p style="margin: 0px;"> Actions.AnnotateMessage(<span style="color: maroon;">"Now running Find.Byxx tests"</span>);</p><br /></div><br />Output annotations as follows:<br /><br /><a href="http://4.bp.blogspot.com/_JZHgcPm-EEM/RsKXk8u4isI/AAAAAAAAABw/FN5P5nkrNNU/s1600-h/An2.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_JZHgcPm-EEM/RsKXk8u4isI/AAAAAAAAABw/FN5P5nkrNNU/s400/An2.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5098804389170678466" /></a><br /><br />And last but not least, this feature won't be complete if the developers didn't get the option to format their own annotation styles and colors :). You can easily customize the colors/fonts to your liking by using the Settings off each annotator object.<br /><br />For example I can customize my message as follows:<br /><!--<br />{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Lucida Console;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20 ActiveBrowser.Annotator.Settings.FontemSize = 12;\par ?? ActiveBrowser.Annotator.Settings.FontStyle = System.Drawing.\cf10 FontStyle\cf0 .Bold;\par ?? ActiveBrowser.Annotator.Settings.BackColor = System.Drawing.\cf10 Color\cf0 .AliceBlue;\par ?? ActiveBrowser.Annotator.Settings.Color = System.Drawing.\cf10 Color\cf0 .DarkKhaki;}<br />--><br /><div style="font-family: Lucida Console; font-size: 8pt; color: black; background: white; background:whitesmoke; line-height:7px;"><br /><p style="margin: 0px;"> ActiveBrowser.Annotator.Settings.FontemSize = 12;</p><br /><p style="margin: 0px;"> ActiveBrowser.Annotator.Settings.FontStyle = System.Drawing.<span style="color: teal;">FontStyle</span>.Bold;</p><br /><p style="margin: 0px;"> ActiveBrowser.Annotator.Settings.BackColor = System.Drawing.<span style="color: teal;">Color</span>.AliceBlue;</p><br /><p style="margin: 0px;"> ActiveBrowser.Annotator.Settings.Color = System.Drawing.<span style="color: teal;">Color</span>.DarkKhaki;</p><br /></div><br /><br />Which will output:<br /><a href="http://1.bp.blogspot.com/_JZHgcPm-EEM/RsKYgMu4itI/AAAAAAAAAB4/eiolHbmhhe4/s1600-h/An3.PNG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_JZHgcPm-EEM/RsKYgMu4itI/AAAAAAAAAB4/eiolHbmhhe4/s400/An3.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5098805407077927634" /></a><br /><br />If anyone has feedback on what else they would like to see added to this feature, feel free to send us a note or leave us a comment on our blog.<br /><br />HINT: You should use this feature while setting the ExecutionDelay off the (Settings) also to some value so that you can slow down the execution of tests and follow the execution easier. Place the following two lines of code at the beginning of your tests to get annotation going.<br /><br /><!--<br />{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Lucida Console;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0??;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;??\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;??\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;??\red192\green192\blue192;}??\fs20 Manager.Settings.AnnotateExecution = \cf2 true\cf0 ;\par ?? Manager.Settings.ExecutionDelay = 500;\par ??}<br />--><br /><div style="font-family: Lucida Console; font-size: 8pt; color: black; background: white; background:whitesmoke; line-height:7px;"><br /><p style="margin: 0px;"> Manager.Settings.AnnotateExecution = <span style="color: blue;">true</span>;</p><br /><p style="margin: 0px;"> Manager.Settings.ExecutionDelay = 500;</p><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-1414270613702289559.post-10563880997783847622007-08-02T20:56:00.002-06:002009-03-12T12:59:35.030-06:00New features in RC0We've been heads down trying to get V1.0 out of the door. We apologize for not being active on the blog...<br /><br />We've had great feedback from customers regarding issues they want to see fixed or improvements in WebAii. We've been trying to address these issues as they come along and we will be updating the RC builds more frequently to get customers these fixes if any are blocking them.<br /><br />With RC0, we introduced few additional features that customers have been asking for. Specifically: HtmlControl suite that abstracts out actions/verifications. So you can do: button.Click() instead of Actions.Click(Element). or Assert.IsTrue(textBox.Text.Equals("foo") instead of Element.GetAttribute("value").Equals(""). In addition to many new features to make the abstraction even more powerful.<br /><br />Here is a taste of what you can do with the HtmlControls suite in RC0:<br /><br /><strong>Finding Controls</strong><br /><br /><div style="BACKGROUND: whitesmoke;font-family:Lucida Console;font-size:8pt;color:black;" ><br /><p style="MARGIN: 0px"><span style="color:green;">// Find an HTML Button with id htmlbutton and click it</span></p><br /><p style="MARGIN: 0px">Find.ById<<span style="color:teal;">HtmlButton</span>>(<span style="color:maroon;">"htmlbutton"</span>).Click();</p><br /><p style="MARGIN: 0px"></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Find the first table on the page.</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlTable</span> outertable = Find.ByTagIndex<<span style="color:teal;">HtmlTable</span>>(<span style="color:maroon;">"table"</span>, 0);</p><br /><p style="MARGIN: 0px"><span style="color:teal;">Assert</span>.IsTrue(outertable.Rows.Count == 3);</p><br /></div><br /><br /><strong>A Find object scoped for searching only within the container html control</strong>.<br /><br /><div style="BACKGROUND: whitesmoke;font-family:Lucida Console;font-size:8pt;color:black;" ><br /><p style="MARGIN: 0px"><span style="color:green;">// Find the first table inside the outer table</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Note: HtmlContainerControls have a Find object </span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// associated with them that scopes all the Find.Byxx searches</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// to elements contained within them only. </span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// So even if you have multiple controls with similar contained</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// elements, this will help avoid any conflicts.</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Also, note how we are referencing the innertable using index 0</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// since it is the first table inside our outer table.</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlTable</span> innerTable = outertable.Find.ByTagIndex<<span style="color:teal;">HtmlTable</span>>(<span style="color:maroon;">"table"</span>, 0);</p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlTableCell</span> cell = innerTable.Find.TableCell(<span style="color:maroon;">"TD21"</span>);</p><br /><p style="MARGIN: 0px"><span style="color:teal;">Assert</span>.IsTrue(cell.Text.Equals(<span style="color:maroon;">"TD21"</span>));</p><br /></div><br /><br /><strong>Navigate up the control tree</strong><br /><br /><div style="BACKGROUND: whitesmoke;font-family:Lucida Console;font-size:8pt;color:black;" ><br /><p style="MARGIN: 0px"><span style="color:green;">// Find the table that contains this cell.</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Navigate up until you find the first html table.</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlTable</span> table = cell.Parent<<span style="color:teal;">HtmlTable</span>>();</p><br /></div><br /><br /><strong>Find all controls that meet certain criteria. Just like the Find.AllByxx</strong><br /><br /><div style="BACKGROUND: whitesmoke;font-family:Lucida Console;font-size:8pt;color:black;" ><br /><p style="MARGIN: 0px"><span style="color:green;">// Find all HtmlInputText control with src containing partial value foo</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">IList</span><<span style="color:teal;">HtmlInputText</span>> txtCtrls = Find.AllByAttributes<<span style="color:teal;">HtmlInputText</span>>(<span style="color:maroon;">"src=~foo"</span>);</p><br /></div><br /><br /><strong>Automate actions on the control</strong><br /><br /><div style="BACKGROUND: whitesmoke;font-family:Lucida Console;font-size:8pt;color:black;" ><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// CLICKING</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Click using the DOM</span></p><br /><p style="MARGIN: 0px">Find.ById<<span style="color:teal;">HtmlInputButton</span>>(<span style="color:maroon;">"button1"</span>).Click();</p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Click using a pure desktop mouse click</span></p><br /><p style="MARGIN: 0px">Find.ById<<span style="color:teal;">HtmlInputButton</span>>(<span style="color:maroon;">"button1"</span>).MouseClick();</p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Check a checkbox and invoke the onclick event.</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlInputCheckBox</span> ck = Find.ById<<span style="color:teal;">HtmlInputCheckBox</span>>(<span style="color:maroon;">"checkbox1"</span>);</p><br /><p style="MARGIN: 0px">ck.Check(<span style="color:blue;">true</span>, <span style="color:blue;">true</span>);</p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Query the checked state</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">Assert</span>.IsTrue(ck.Checked);</p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Invoke event on the control.</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlAnchor</span> link = Find.ByAttributes<<span style="color:teal;">HtmlAnchor</span>>(<span style="color:maroon;">"href=~google"</span>);</p><br /><p style="MARGIN: 0px"><span style="color:green;">// Invoke any events on the control</span></p><br /><p style="MARGIN: 0px">link.InvokeEvent(<span style="color:teal;">ScriptEventType</span>.OnFocus);</p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// You can capture any element on the page using the .Capture()</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Will be stored to the Log.LogLocation</span></p><br /><p style="MARGIN: 0px">Find.ById<<span style="color:teal;">HtmlInputImage</span>>(<span style="color:maroon;">"image1"</span>).Capture(<span style="color:maroon;">"myfile"</span>); </p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// SELECTING</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlSelect</span> select = Find.ById<<span style="color:teal;">HtmlSelect</span>>(<span style="color:maroon;">"select1"</span>);</p><br /><p style="MARGIN: 0px"><span style="color:teal;">Assert</span>.IsTrue(select.SelectedOption.Value.Equals(<span style="color:maroon;">"Option1Text"</span>));</p><br /><p style="MARGIN: 0px"><span style="color:teal;">Assert</span>.IsTrue(select.SelectedOption.Text.Equals(<span style="color:maroon;">"Option1"</span>));</p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">//</span></p><br /><p style="MARGIN: 0px"><span style="color:green;">// and much more...</span></p><br /></div><br /><br /><strong>Get any control property directly from the DOM including Read-Only properties. You can also set any property</strong><br /><br /><div style="BACKGROUND: whitesmoke;font-family:Lucida Console;font-size:8pt;color:black;" ><br /><p style="MARGIN: 0px"><span style="color:green;">// Get whether a checkbox is enabled or disabled.</span></p><br /><p style="MARGIN: 0px"><span style="color:teal;">HtmlInputCheckBox</span> cks = Find.ById<<span style="color:teal;">HtmlInputCheckBox</span>>(<span style="color:maroon;">"checkbox1"</span>);</p><br /><p style="MARGIN: 0px"><span style="color:blue;">bool</span> disabled = cks.GetValue<<span style="color:blue;">bool</span>>(<span style="color:maroon;">"disabled"</span>);</p><br /><p style="MARGIN: 0px"></p><br /><p style="MARGIN: 0px"><span style="color:green;">// Disable it</span></p><br /><p style="MARGIN: 0px">cks.SetValue<<span style="color:blue;">bool</span>>(<span style="color:maroon;">"disabled"</span>, <span style="color:blue;">true</span>);</p><br /><p style="MARGIN: 0px"></p><br /><p style="MARGIN: 0px"><span style="color:teal;">Assert</span>.IsTrue(cks.GetValue<<span style="color:blue;">bool</span>>(<span style="color:maroon;">"disabled"</span>));</p><br /></div><br /><br />Hope you enjoy using these new features. Send us some feedback on what else you would like to see in the framework that would make your testing more productive..<br /><br />BTW - A recorder is in the works...Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-1414270613702289559.post-57883289928722737792007-06-18T16:46:00.000-06:002007-06-18T18:19:18.118-06:00Automating Safari on WindowsApple's recent announcement of <a href="http://www.apple.com/safari/">Safari Beta3 </a>and its support for running on Windows drew a lot of interest and debate regarding Apple's strategy for supporting Windows. For us, we looked at it as an opportunity to extend our WebAii's browser support to Safari. :)<br /><br />Since the announcement we've been working day and night to get a Windows host running the Safari rendering engine (WebKit) to run on Windows. Our goal was to use the same exact WebKit.dll that comes installed on the machine when you install Safari to allow our host to have the same rendering behavior as the Safari browser that Apple ships. <br /><br />I'm happy to say that late last night we resolved our last blocking issue and now are able to host WebKit using purely .NET (with few PInvoke calls ;-)) in a windows form. We are now in the process of building the automation support so users can actually launch the Safari host from WebAii and perform their automation just like IE or Firefox today! <br /><br />This is a Windows Form hosting the <strong>same exact</strong> rendering engine that comes with Safari:<br /><br /><a href="http://2.bp.blogspot.com/_JZHgcPm-EEM/RncUG1rxkNI/AAAAAAAAABM/-x-U8vpRqJM/s1600-h/SafariWindowsHost.PNG"><img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_JZHgcPm-EEM/RncUG1rxkNI/AAAAAAAAABM/-x-U8vpRqJM/s400/SafariWindowsHost.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5077549212605976786" /></a><br /><br />Stay tuned to our blog for future updates.<br />We'll continue the "Automating Silverlight" PART II series next week!Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-1414270613702289559.post-77457030556238697392007-05-30T22:58:00.002-06:002009-11-10T20:14:39.639-06:00Automated Testing of Silverlight Applications – PART I<p><a href="http://artoftestinc.blogspot.com/2008/08/automated-testing-of-silverlight.html">PART II</a></p><div>Update (11/10/09): Record/Playback tool for Silverlight automation <a href="http://www.artoftest.com/community/blogs/09-11-04/Design_Canvas_2_0_Beta_Released.aspx">release</a>.</div><br /><span style="font-family:verdana;font-size:85%;">One of the latest hot web development technologies on the market is Microsoft’s </span><a href="http://silverlight.net/Default.aspx"><span style="font-family:verdana;font-size:85%;">Silverlight</span></a><span style="font-family:verdana;font-size:85%;"> framework. When Microsoft introduced <a href="http://www.microsoft.com/presspass/press/2005/sep05/09-13PDC05Day1PR.mspx">WPF/e</a> (known now as Silverlight Beta), the focus was on building rich media applications - similar to what you can do today with Flash - using a subset of their latest client development technology known as the <a href="http://msdn2.microsoft.com/en-us/netframework/aa663321.aspx">Windows Presentation Foundation (aka WPF)</a>. Earlier this month, Microsoft introduced Silverlight Alpha which expanded the scope of Silverlight by introducing a light-weight CLR that allows developers to write managed code applications and host these applications inside the browser. To allow Silverlight applications to integrate well with current HTML/Ajax applications, Silverlight also enabled easy access to the HTML document DOM hosting these applications. <span style="color:#3333ff;">Pretty cool!</span></span><span style="color:#3333ff;"><br /></span><span style="font-family:verdana;font-size:85%;"><br />As many in the development community ponder the feature set of this technology and how it can be leveraged in future development projects, us and </span><a href="http://weblogs.asp.net/nunitaddin/archive/2007/05/16/test-with-silverlight-coreclr.aspx"><span style="font-family:verdana;font-size:85%;">others</span></a><span style="font-family:verdana;font-size:85%;"> in the software testing community are investigating how automated testing would work in Silverlight world! There are quite </span><a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1609250&SiteID=1"><span style="font-family:verdana;font-size:85%;">a bit of challenges</span></a><span style="font-family:verdana;font-size:85%;"> to overcome especially with it only being an Alpha! But again, it never hurts to get a head start on looking at this technology from a testing prospective and providing Microsoft with feedback on how they can make our lives a bit easier when it comes to automated testing :).</span><br /><span style="font-family:verdana;font-size:85%;"><br /></span><span style="font-family:verdana;font-size:85%;">When thinking about Silverlight applications and automated testing, there are a couple of different approaches that come to mind:<br /><br /><br /><br /></span><span style="font-family:verdana;font-size:85%;"></span><span style="font-family:verdana;font-size:85%;"></span><span style="font-family:verdana;font-size:85%;"></span><p><span style="font-family:verdana;font-size:85%;"><strong>1.</strong> <strong>Isolated API/Unit Testing</strong>: This can be efficiently executed by running test cases inside Silverlight in a light host similar to what </span><a href="http://weblogs.asp.net/nunitaddin/archive/2007/05/16/test-with-silverlight-coreclr.aspx"><span style="font-family:verdana;font-size:85%;">Jamie</span></a><span style="font-family:verdana;font-size:85%;"> did with TestDriven.NET or what Visual Studio Team Test might provide in future versions. [Think of </span><a href="http://msdn2.microsoft.com/en-us/library/ms182526(VS.80).aspx"><span style="font-family:verdana;font-size:85%;">Visual Studio Team Test's ASP.NET testing support</span></a><span style="font-family:verdana;font-size:85%;"> today where they allow tests to have access to the ASP.NET HttpContext. They would simply enable a Silverlight configuration where they provide a light-weight Silverlight host that tests can run in.]<br /><br /><u>This approach works well when:</u></span></p><ul><li><span style="font-family:verdana;font-size:85%;">UnitTesting the business logic of your Silverlight application. </span></li><li><span style="font-family:verdana;font-size:85%;">When you have a pure windowless Silverlight application that standsalone and has very limited interaction with the HTML on the page. </span></li></ul><p><span style="font-family:verdana;font-size:85%;"><u>This approach might not be suiteable for: </u></span></p><span style="font-family:verdana;font-size:85%;"><u></u><ul><u></u><li>Heavy UI applications that perform heavy interactions with other HTML elements on the page. Especially when HTML elements trigger events in Silverlight Apps or when using Ajax on your pages.</li><li><span style="font-family:verdana;font-size:85%;">Automating usage scenarios or end-to-end scenarios that require a browser host. </span></li><span style="font-family:verdana;font-size:85%;"><li>Testing your application in different browsers (IE/Firefox/Safari)<br /></li></span></ul></span><p><span style="font-family:verdana;font-size:85%;"><strong>2. Browser Testing</strong>: Basically automating the browser by accessing the HTML DOM of the page including the XAML DOM of the hosted Silverlight app(s) and being able to execute actions and query states of these two DOM trees in a consistent and interchangeable manner. </span><span style="font-family:verdana;font-size:85%;">This approach is suitable for the scenarios described above that are not fit for Isolated API/UnitTesting. </span></p><p><span style="font-family:verdana;font-size:85%;">Here at </span><a href="http://www.artoftest.com/"><span style="font-family:verdana;font-size:85%;">ArtOfTest</span></a><span style="font-family:verdana;font-size:85%;">, we’ve spent some time prototyping a few solutions that we think can help solve some of the challenges introduced by Silverlight. We are currently focused on approach #2 above since we think the progression of leveraging Silverlight is going to be through integration of small Silverlight apps within existing HTML/Ajax applications. </span></p><p><span style="font-family:verdana;font-size:85%;"><strong>So, how are we going about supporting Silverlight?</strong></span></p><p><span style="font-family:verdana;font-size:85%;">Well, our web automation infrastructure </span><a href="http://www.artoftest.com/Products.aspx"><span style="font-family:verdana;font-size:85%;">WebAii</span></a><span style="font-family:verdana;"><span style="font-size:85%;"> currently provides a rich infrastructure for automating HTML based web applications including rich support for Ajax. One of our goals is to extend WebAii’s rich support to Silverlight. We want to extend our current API to be used interchangeably between HTML elements and XAML elements. This API should allow both action invokation and data retrieval <span style="font-family:verdana;">for both element types (XAML & HTML). If we can accomplish that we can offer customers: </span></span></span></p><ul><li><span style="font-family:verdana;font-size:85%;">One consistent API for automating the HTML DOM and the XAML DOM. </span></li><li><span style="font-family:verdana;font-size:85%;">Eliminate the need to learn a new automation framework for Silverlight and the need to integrate yet another new library into testing environments. </span></li><li><span style="font-family:verdana;font-size:85%;">Enable a single test case to automate and interact with both the HTML & XAML elements on the same page to allow testing of the interaction points that mix HTML/XAML applications might have. </span></li><li><span style="font-size:85%;"><span style="font-family:verdana;">No breaking changes to existing testcases that are currently using WebAii. You can simply upgrade the library and then slowly update existing tests to include some Silverlight scenarios or start writing new automated tests for Silverlight within your existing testbed.<br /></span></span></li></ul><p><span style="font-family:verdana;"><span style="font-size:85%;"><span style="font-family:verdana;">In my n</span>ext post I’ll be digging into how WebAii’s Silverlight support will look like and discuss some of the current automation limitations with Silverlight and what Microsoft can do to help improve its testability</span>.</span> </p><p>Stay tuned!</p><br /><p><a href="http://artoftestinc.blogspot.com/2008/08/automated-testing-of-silverlight.html">PART II</a></p>Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-1414270613702289559.post-72462344719306419392007-05-22T22:01:00.000-06:002007-06-13T13:05:08.905-06:00Light-Weight ASP.NET Unit Testing - Go Browser-less, Server-less!<span style="font-family:lucida grande;">ASP.NET comes with great set of features especially for extensibility. </span><a href="http://msdn2.microsoft.com/en-us/library/system.web.hosting.aspx"><span style="font-family:lucida grande;">Web Hosting</span></a><span style="font-family:lucida grande;"> is one of those features that is extremely poweful but not widely used since it's not really common for web developers to need to host their own ASP.NET processing server. </span><br /><span style="font-family:lucida grande;"></span><br /><span style="font-family:lucida grande;">When it comes to testing, there is great power and agility gained with having a host processing requests within the test process. It allows us to eliminate the need for a <strong>browser </strong>and a <strong>webserver. </strong>It allows for an extemely quick and light-weight execution of tests that is suited for scenarios such as:</span><br /><ul><li><span style="font-family:lucida grande;"><strong>Running Build Verification Tests (aka BVTs):</strong> These tests commonly run as part of a continuous integration server process and they are very basic tests that ensure basic functionality and cover a broad set of features but do not go deep into each feature. BVTs can also be used during the dev check-ins process to ensure certain code quality at check-in. Having a quick turn around on these tests is important so they don't become a bottle neck for product building and development check-in.</span></li><li><span style="font-family:lucida grande;"><strong>UnitTesting business logic behind UI elements: </strong>If you want to write unit tests for your business logic that is tightly coupled with certain UI elements or UI logic.</span></li><li><strong><span style="font-family:lucida grande;">Any other testing that does not require client javascript execution or a browser.</span></strong></li></ul><p><span style="font-family:lucida grande;">The </span><a href="http://www.codeplex.com/plasma"><span style="font-family:lucida grande;">Plasma </span></a><span style="font-family:lucida grande;">project on codeplex attempts to accomplish that but is still at a very early stage in development. With WebAii Beta2 refresh, we updated WebAii to include a similar Asp.Net host and integrated it with our <strong>DOM parser</strong>, <strong>element identification engine</strong> and <strong>Actions</strong> interface. We enabled the scenario of executing ASP.NET Unit Tests using a light weight process without a need for a browser or a webserver. </span></p><p><span style="font-family:lucida grande;">The Actions object implements all the common actions like Click(), SetText(), SelectDropDown()..etc. which is<u> the same interface you would use to automate IE or Firefox; so there is no new interface to learn or setups to perform. Simply flip a switch in your settings and you are automating without a browser or a server.</u></span></p><p><strong>So what do you need to do to enable automation with WebAii using an in-process host?</strong> Simply set the <span style="color:#cc0000;">defaultBrowser</span> config setting to AspNetHost or set it in your code if you are not using a config:</p><br /><br /><div style="BACKGROUND: whitesmoke;font-family:Lucida Console;font-size:8pt;color:black;" ><br /><p style="MARGIN: 0px"><span style="color:blue;"> <</span><span style="color:maroon;">WebAii.Settings</span></p><br /><p style="MARGIN: 0px"><span style="color:blue;"> </span><span style="color:red;">defaultBrowser</span><span style="color:blue;">=</span>"<span style="color:blue;">AspNetHost</span>"</p><br /><p style="MARGIN: 0px"><span style="color:blue;"> </span><span style="color:red;">logLocation</span><span style="color:blue;">=</span>"<span style="color:blue;">c:\Log\</span>"</p><br /><p style="MARGIN: 0px"><span style="color:blue;"> </span><span style="color:red;">webAppPhysicalPath</span><span style="color:blue;">=</span>"<span style="color:blue;">C:\Aot\webtest\artoftest.testing\pages</span>"</p><br /><p style="MARGIN: 0px"><span style="color:blue;"> </span><span style="color:red;">enableScriptLogging</span><span style="color:blue;">=</span>"<span style="color:blue;">false</span>"</p><br /><p style="MARGIN: 0px"><span style="color:blue;"> > </span></p><br /></div><br /><p>Or set it in your test code:</p><p>settings.DefaultBrowser = <span style="color:#66cccc;">BrowserType</span>.AspNetHost;</p><p></p><p>And Voila! That is about it. You can automate your tests using the same Find.Byxx or Actions..xx and with no browser/server needed.</p><p><strong>What about debugging?</strong></p><p>With browser-less automation, you get the quick, snappy execution but you lose the visual rendering of your pages. But that is no longer the case with WebAii. If you want to visually view the responses coming back from the in-process server, simply set the setting:<br /><span style="color:#cc0000;"><strong>enableUILessRequestViewing </strong></span><span style="color:#333333;"><strong>to true</strong> and you will get an IE instance that simply renders the response visually. You can set break-points in your code if the execution is going too fast to notice specific pages.</span></p><p><span style="color:#333333;">If you want to learn more about this feature, check out our documentation on the in-process host <a href="http://www.artoftest.com/Resources/WebAii/documentation/topicsindex.aspx?topic=aspnetinproc">here</a>. You can also download our complete samples <a href="http://www.artoftest.com/Resources.aspx">here</a> which include a sample using AspNetHost.</span></p><p><strong></strong></p>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-1414270613702289559.post-23013150902564584122007-04-04T23:33:00.000-06:002007-04-10T22:55:50.988-06:00WebAii Beta2 Released!We are happy to announce the release of WebAii Beta2. Beta2 offers over 20 new features in addition to what was included in Beta1.<br /><br />Some of the exciting new features in Beta2:<br /><br /><strong>JavaScript Testing Support:</strong><br />o Invoke JavaScript functions directly from .NET test code.<br />o Invoke JavaScript element events. (i.e. onblur).<br />o Log directly from your JavaScript functions.<br /><br /><strong>Richer Element Search API<br /></strong>o Find elements using their markup content (innerText, innerMarkup, regex).<br />o Quick and easy notations to craft complex searches.<br />o Isolate application details from test logic using serialization support.<br /><br /><strong>Additional Ajax Support<br /></strong>o Wait for 1-N element changes using one call.<br /><br /><strong>NUnit First-Class Support<br /></strong>o Visual Studio NUnit item template.<br />o NUnit base test class.<br /><br /><strong>HTML Pop-up & Dialogs Support<br /></strong>o Access and automate your HTML pop-ups.<br />o Built-in support for common browser dialogs (Alerts, FileUploads).<br />o Extensible framework for building your own custom dialog support.<br /><br /><strong>Design ASP.NET Application Testability directly in VS Designer.<br /></strong>o New ASP.NET TestRegion custom control to use in Visual Studio’s designer to enable you to visually build TestRegions into your web application.<br /><br /><strong>Unit Test Web Extensions<br /></strong>o 2 new test fixtures for defining and sharing elements and dialog handlings across unit tests.<br /><br /><strong>Complete Code Samples & Updated Documentation / WebSite<br /></strong>o 50 unit tests that come in 4 flavors (C#/VB.NET for NUnit or VS Team Test)<br /><br /><strong>And much more at </strong><a href="http://www.artoftest.com"><strong>www.artoftest.com</strong></a><br /><br />Feel free to send us any feedback!Unknownnoreply@blogger.com1