February 02th, 2009 - 3:38PM One of the interesting new features in Google’s Chrome browser is the use of one Windows process per site or tab. This helps to enforce the isolation between tabs and prevents a problem in one tab crashing the whole browser.
In comparison, Firefox seems to have a simplistic process model on Windows. It doesn’t matter how many tabs or windows you open, or how many times you start Firefox – by default you get one instance of firefox.exe:
In Internet Explorer you can create a separate instance of the browser process just by starting another copy of iexplore.exe.
There are advantages to Firefox’s single process model:
However, the lack of isolation means that if anything causes a page to crash, you’ll lose all your Firefox tabs and windows. This is mitigated to some degree by Firefox’s ability to restart the browser and reload the set of pages displayed in the previous session.
So what do you do if you are developing an add-on for Firefox or you want to run automated tests in Firefox whilst still using Firefox to browse in the normal way?
In Firefox, multi-process support is provided through the use of profiles. When Firefox is installed, you automatically get one default profile that contains user settings, browsing history, the browser cache and persistent cookies. Additional profiles can be created using the Firefox Profile Manager.
The Profile Manager is built into Firefox and is started by running this command in Start->Run:
firefox -P -no-remote
The -P flag indicates that the Profile Manager should be started and the -no-remote flag indicates that any running instances of Firefox should be ignored. If you run without this flag and you have already started Firefox, the command will simply open a new Firefox window without displaying the Profile Manager.
The Profile Manager has a simple user interface that allows you to create, delete and rename profiles:

You can start Firefox in a non-default profile by using the following command line:
firefox -P <myprofile> -no-remote
For example, if you created a new profile called AutoTest:
You could set up a shortcut like this to start Firefox in the AutoTest profile:

Each profile uses its own copy of the firefox.exe process, as well as its own settings, browser cache, history and peristent cookies. This provides more isolation than you would achieve by running multiple processes in IE. You can even separately enable or disable add-ons like Firebug or HttpWatch in each profile.
Internet Explorer’s cache and persistent cookies are maintained on a per user basis making it difficult to run separate instances with their own storage and settings. With Firefox you simply use different profiles. For example, you could use your default profile for normal browsing and have a separate profile to use for another purpose such as automated testing:

The HttpWatch automation interface in version 6.0 supports the use of profiles with Firefox. The profile name can be passed to the Attach and New methods of the Firefox plugin object. Passing an empty string indicates that you want to use the default profile.
Here’s a modified version of the page load test that we previously featured. It’s written in C# and uses a non-default profile to run the test:
// Set a reference to the HttpWatch COM library // to start using the HttpWatch namespace using HttpWatch; namespace EmptyCacheTest { class Program { static void Main(string[] args) { string url = "http://www.httpwatch.com"; string profileName = "AutoTest"; Controller controller = new Controller(); // Create an instance of Firefox in the specified profile Plugin plugin = controller.Firefox.New(profileName); // Clear out all existing cache entries plugin.ClearCache(); plugin.Record(); plugin.GotoURL(url); // Wait for the page to download controller.Wait(plugin, -1); plugin.Stop(); // Find the load time for the first page recorded double pageLoadTimeSecs = plugin.Log.Pages[0].Entries.Summary.Time; System.Console.WriteLine( "The empty cache load time for '" + url + "' was " + pageLoadTimeSecs.ToString() + " secs"); // Uncomment the next line to save the results // plugin.Log.Save(@"c:\temp\emptytestcache.hwl"); plugin.CloseBrowser(); } } }
Posted on February 02, 2009 in
Automation,Firefox,HttpWatch
Tags: Automation,Firefox,HttpWatch
RSS for this post |Trackback URL
October 10th, 2008 - 4:54PM WatiN (pronounced as What-in) is a browser automation library for .NET that was inspired by the Ruby based Watir and FireWatir frameworks. It allows C# and VB.Net applications to programatically interact with a browser to perform tasks such as going to a web page, filling out fields and clicking on buttons. The current version only works with IE, but version 2.0 will include support for Firefox.
We have previously discussed the use of Ruby, Watir and HttpWatch and version 6.0 now contains Watir sample code that works with both IE and Firefox. HttpWatch can also be used alongside WatiN to record HTTP traffic and performance statistics while running an automated script. We adapted the Getting Started WatiN sample to use HttpWatch to record the Google results page. The modified code is shown below:
// This code works with WatiN version 1.3 using System; using WatiN.Core; namespace WatiNTest { class WatiNTestWithHttpWatch { [STAThread] static void Main(string[] args) { // Open a new Internet Explorer window and // goto the google website. IE ie = new IE("http://www.google.com"); // Attach HttpWatch to this new instance of IE HttpWatch.Controller ct = new HttpWatch.Controller(); HttpWatch.Plugin plugin = ct.IE.Attach((SHDocVw.IWebBrowser2)ie.InternetExplorer); // Start recording a log file in HttpWatch plugin.Record(); // Find the search text field and type Watin in it. ie.TextField(Find.ByName("q")).TypeText("WatiN"); // Click the Google search button. ie.Button(Find.ByValue("Google Search")).Click(); ie.WaitForComplete(); // Stop recording and save an HttpWatch log file plugin.Stop(); plugin.Log.Save(@"c:\mydir\googlesearch.hwl"); HttpWatch.Summary logSummary = plugin.Log.Entries.Summary; Console.WriteLine("\r\nElapsed time (secs) = " + logSummary.Time.ToString() + " Downloaded bytes = " + logSummary.BytesReceived.ToString()); // Uncomment the following line if you want to close // Internet Explorer and the console window immediately. //ie.Close(); } } }
The only non-trivial step required to add HttpWatch support, was to supply an IWebBrowser2 interface to the Attach method. This was achieved using the cast shown below:
HttpWatch.Plugin plugin = ct.IE.Attach((SHDocVw.IWebBrowser2)ie.InternetExplorer);
One problem you may run into is that WatiN does not work correctly with IE 7 Protected Mode on Vista. However, you can work around this by creating the instance of IE with HttpWatch and then attaching WatiN as shown below:
// This code works with WatiN version 1.3 using System; using WatiN.Core; namespace WatiNTest { class WatiNTestWithHttpWatch { [STAThread] static void Main(string[] args) { // Create a new instance of IE with HttpWatch to avoid Protected Mode // issues HttpWatch.Controller ct = new HttpWatch.Controller(); HttpWatch.Plugin plugin = ct.IE.New(); // Attach WatiN to this instance of IE IE ie = IE.AttachToIE(Find.By("hwnd", plugin.Container.HWND.ToString())); ie.GoTo("http://www.google.com"); plugin.Record(); // Find the search text field and type Watin in it. ie.TextField(Find.ByName("q")).TypeText("WatiN"); // Click the Google search button. ie.Button(Find.ByValue("Google Search")).Click(); ie.WaitForComplete(); // Stop recording and save an HttpWatch log file plugin.Stop(); // If you are saving from protected mode IE 7 on Vista // you will need to use a location that is accessible from protected mode //plugin.Log.Save(@"C:\Users\\AppData\Local\Temp\low\googlesearch.hwl"); HttpWatch.Summary logSummary = plugin.Log.Entries.Summary; Console.WriteLine("\r\nElapsed time (secs) = " + logSummary.Time.ToString() + " Downloaded bytes = " + logSummary.BytesReceived.ToString()); // Uncomment the following line if you want to close // Internet Explorer and the console window immediately. //ie.Close(); } } }
If you would like to try this out for yourself you would need to:
Posted on October 10, 2008 in
Automation,C#,HttpWatch,Internet Explorer
Tags:
RSS for this post |Trackback URL
July 07rd, 2008 - 10:49AM HttpWatch includes automation samples in C# and in a previous post we used C# to create simple empty cache and primed cache tests. However, a number of customers have recently asked how they can get started with HttpWatch and VB.Net. To use Visual Basic simply follow these steps:
In Visual Studio create a new console application for Visual Basic:

To use the COM based HttpWatch automation API you need to create a reference by right clicking on the project and going to ‘Add Reference…’ :

When the ‘Add Reference’ dialog opens click on the COM tab. If you have HttpWatch Basic or Professional Edition installed you should be able to find HttpWatch in the list of COM type libraries. A quick way to do this is to type ‘httpwatch’ into the References dialog. Once you have found the HttpWatch Automation library; select it and click on OK:

The HttpWatch automation objects are now available in VB.Net. To make life easier you may want to add an Imports HttpWatch statement into your code so that you don’t have to add the HttpWatch namespace onto the name of every automation class and interface. There’s documentation for the API in the HttpWatch help file and you’ll see Intellisense prompts as you start writing code:

Here’s an example of a simple program to test how long a page takes to load:
Imports HttpWatch Imports System Module Module1 Sub Main() Dim url As String = "http://www.httpwatch.com" Dim controller As Controller = New Controller ' Create a new instance of IE Dim plugin As Plugin = controller.[New] plugin.Record() plugin.GotoURL(url) ' Wait for page to load controller.Wait(plugin, -1) plugin.Stop() Dim pageLoadTime As Double = _ plugin.Log.Pages(0).Entries.Summary.Time Console.WriteLine("The page loaded in " + _ pageLoadTime.ToString() + " secs") plugin.Container.Quit() ' Close IE End Sub End Module
And here is the empty cache test converted to VB.Net:
Imports HttpWatch Imports System Module Module1 Sub Main() Dim url As String = "http://www.httpwatch.com" Dim controller As Controller = New Controller ' Create a new instance of IE Dim plugin As Plugin = controller.[New] 'Clear out all existing cache entries plugin.ClearCache() plugin.Record() plugin.GotoURL(url) ' Wait for page to load controller.Wait(plugin, -1) plugin.Stop() Dim pageLoadTime As Double = _ plugin.Log.Pages(0).Entries.Summary.Time Console.WriteLine("The page loaded in " + _ pageLoadTime.ToString() + " secs") ' Uncomment the next line to save the results ' plugin.Log.Save("c:\temp\emptycachetest.hwl") plugin.Container.Quit() ' Close IE End Sub End Module
Posted on July 07, 2008 in
Automation,HttpWatch,Internet Explorer
Tags:
RSS for this post |Trackback URL