Tuesday, September 15, 2009
Selenium RC timing issues
This class attempts to isolate the test from timing issues by performing an automatic retry.
public static class SeleniumRetry
{
public static void Invoke<TArg>(Action<TArg> action, TArg arg)
{
Invoke(() => action.Invoke(arg));
}
public static void Invoke<TArg1, TArg2>(Action<TArg1, TArg2> action2, TArg1 arg1, TArg2 arg2)
{
Invoke(() => action2.Invoke(arg1, arg2));
}
public static void Invoke(Action action)
{
var attempt = 0;
const int maxAttempts = 5;
while (true)
{
try
{
action.Invoke();
break;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
if (++attempt > maxAttempts)
throw;
Thread.Sleep(500);
}
}
}
}
Using the class is simple:
This scenario shows how to automate a dynamically loaded login form that is created when the PopupLogon link is clicked.
SeleniumRetry.Invoke(Browser.Click, "PopupLogon");
SeleniumRetry.Invoke(Browser.Type, "input_email", "fake@email.com");
SeleniumRetry.Invoke(Browser.Type, "password", "12345");
//First click selects the button, second performs action.
SeleniumRetry.Invoke(Browser.Click, "submitBtn");
SeleniumRetry.Invoke(Browser.Click, "submitBtn");
Thursday, September 10, 2009
Automatically start and stop SeleniumRC with NUnit
You can use NUnit and SeleniumRC to run automated functional tests of your website. This is a simple class that starts selenium at the beginning of a unit test suite and shuts it down when done.
using System.Diagnostics;
using System.Net;
using NUnit.Framework;
[SetUpFixture]
public class SeleniumRcSetup
{
private readonly Process SeleniumRC = new Process();
[SetUp]
public void StartSelniumRc()
{
const string pathRelativeToProjBinDebug = @"path to your selenium installation";
SeleniumRC.StartInfo.FileName = "java";
SeleniumRC.StartInfo.Arguments = string.Format("-jar {0}selenium-server.jar", pathRelativeToProjBinDebug);
SeleniumRC.Start();
}
[TearDown]
public void StopSeleniumRc()
{
var r = WebRequest.Create("http://localhost:4444/selenium-server/driver/?cmd=shutDown");
r.GetResponse();
SeleniumRC.WaitForExit(5000);
SeleniumRC.Close();
}
}
Wednesday, September 9, 2009
Using XmlSerializer without rendering document declaration or namespace
<?xml version="1.0" encoding="Windows-1252"?>
<node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" uID="12345">
...
</node>
But if all you want is to write out the xml fragment like:
<node uid="12345">
...
</node>
You need to configure the serializer before you use it. The following code will not render the document declaration or namespace.
public void SerializeWithNoDeclarationNoNamespace<T>(TextWriter writer, T theObject)
{
var settings = new XmlWriterSettings
{
Indent = true,
IndentChars = " ",
NewLineHandling = NewLineHandling.Replace,
NewLineChars = Environment.NewLine,
OmitXmlDeclaration = true
};
using (var xmlWriter = XmlWriter.Create(writer, settings))
{
var xmlnsEmpty = new XmlSerializerNamespaces();
xmlnsEmpty.Add("", "");
new XmlSerializer(typeof(T)).Serialize(xmlWriter, theObject, xmlnsEmpty);
}
writer.WriteLine("");
}