Once you have your logging sorted out, the next thing you need to be concerned with is synchronization. In Selenium 1, this was accomplished with the dozen or so wait_for variants. In Selenium 2, they are gone and replaced with some new synchronization methods.

I’m sure there is an official way of doing synchronization in Selenium 2, but I have yet to figure it out. Needing something now though, here is a class that you can use to start getting synchronization in your C# scripts. A big thanks to David Burns for the original direction on the WaitForElement one.

<pre lang="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

using NUnit.Framework;

using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Internal;

namespace Element34
{
    static class Waits
    {
        public static IWebElement WaitForElement(IWebDriver driver, By by)
        {
            IWebElement element;
            for (int second = 0; ; second++)
            {
                if (second >= 60) Assert.Fail("timeout");
                try
                {
                    element = driver.FindElement(by);
                    if (element != null) break;
                }
                catch (Exception)
                { }
                Thread.Sleep(1000);
            }
            return element;
        }

        public static IWebElement WaitForElementVisible(IWebDriver driver, By by)
        {
            IWebElement element;
            for (int second = 0; ; second++)
            {
                if (second >= 60) Assert.Fail("timeout");
                try
                {
                    element = driver.FindElement(by);
                    if (element != null)
                    {
                        IRenderedWebElement tmpElement = (IRenderedWebElement)driver.FindElement(by);    
                        if (tmpElement.Displayed)
                        {
                            break;
                        }
                    }
                }
                catch (Exception)
                { }
                Thread.Sleep(1000);
            }

            return element;
        }

        public static void WaitForFrame(IWebDriver driver, String frame)
        {
            for (int second = 0; ; second++)
            {
                if (second >= 60) Assert.Fail("timeout");
                try
                {
                    driver.SwitchTo().Frame(frame);
                    break;
                }
                catch (Exception)
                { }
                Thread.Sleep(1000);
            }
        }
    }
}